[{"data":1,"prerenderedAt":1354},["ShallowReactive",2],{"navigation_docs":3,"-android-hidden-hardening-xor-obfuscate":173,"-android-hidden-hardening-xor-obfuscate-surround":1349},[4,22,29,36,107,138,145,161],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"博客","i-lucide-pen-line","\u002Fblog","0.blog",[10,12,17],{"title":5,"path":7,"stem":11,"icon":6},"0.blog\u002Findex",{"title":13,"path":14,"stem":15,"icon":16},"创建基于 UIKit 的原生 iOS 项目","\u002Fblog\u002Fcreate-uikit-ios-project","0.blog\u002F01.create-uikit-ios-project","i-lucide-app-window",{"title":18,"path":19,"stem":20,"icon":21},"Lockify：把账号和密码留在自己的手机里","\u002Fblog\u002Flockify","0.blog\u002F02.lockify","i-lucide-lock",{"title":23,"path":24,"stem":25,"children":26,"icon":28},"年度总结","\u002Fannual-review","1.annual-review\u002Findex",[27],{"title":23,"path":24,"stem":25,"icon":28},"i-lucide-git-commit",{"title":30,"path":31,"stem":32,"children":33,"icon":35},"故事","\u002Fstories","2.stories\u002Findex",[34],{"title":30,"path":31,"stem":32,"icon":35},"i-lucide-feather",{"title":37,"icon":38,"path":39,"stem":40,"children":41},"Android","i-simple-icons-android","\u002Fandroid","3.android",[42,44,49],{"title":37,"path":39,"stem":43,"icon":38},"3.android\u002Findex",{"title":45,"path":46,"stem":47,"icon":48},"初探Navigation","\u002Fandroid\u002Fcompose-navigation","3.android\u002F01.compose-navigation","i-lucide-route",{"title":50,"icon":51,"path":52,"stem":53,"children":54},"安卓代码加固","i-lucide-shield","\u002Fandroid\u002Fhidden-hardening","3.android\u002F02.hidden-hardening\u002Findex",[55,58,62,67,72,77,82,87,92,97,102],{"title":56,"path":52,"stem":53,"icon":57},"安卓代码加固：总览","i-lucide-map",{"title":59,"path":60,"stem":61,"icon":21},"安卓代码加固（1）：加密DEX","\u002Fandroid\u002Fhidden-hardening\u002Fencrypt-dex","3.android\u002F02.hidden-hardening\u002F01.encrypt-dex",{"title":63,"path":64,"stem":65,"icon":66},"安卓代码加固（2）：Native解密","\u002Fandroid\u002Fhidden-hardening\u002Fnative-decrypt","3.android\u002F02.hidden-hardening\u002F02.native-decrypt","i-lucide-cpu",{"title":68,"path":69,"stem":70,"icon":71},"安卓代码加固（3）：内存加载","\u002Fandroid\u002Fhidden-hardening\u002Fmemory-load","3.android\u002F02.hidden-hardening\u002F03.memory-load","i-lucide-memory-stick",{"title":73,"path":74,"stem":75,"icon":76},"安卓代码加固（4）：指令分发","\u002Fandroid\u002Fhidden-hardening\u002Fopcode-dispatch","3.android\u002F02.hidden-hardening\u002F04.opcode-dispatch","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"安卓代码加固（5）：XOR混淆","\u002Fandroid\u002Fhidden-hardening\u002Fxor-obfuscate","3.android\u002F02.hidden-hardening\u002F05.xor-obfuscate","i-lucide-shuffle",{"title":83,"path":84,"stem":85,"icon":86},"安卓代码加固（6）：密钥外置","\u002Fandroid\u002Fhidden-hardening\u002Fkey-external","3.android\u002F02.hidden-hardening\u002F06.key-external","i-lucide-key",{"title":88,"path":89,"stem":90,"icon":91},"安卓代码加固（7）：依赖隔离","\u002Fandroid\u002Fhidden-hardening\u002Fdep-isolate","3.android\u002F02.hidden-hardening\u002F07.dep-isolate","i-lucide-layers",{"title":93,"path":94,"stem":95,"icon":96},"安卓代码加固（8）：构建校验","\u002Fandroid\u002Fhidden-hardening\u002Fbuild-verify","3.android\u002F02.hidden-hardening\u002F08.build-verify","i-lucide-shield-check",{"title":98,"path":99,"stem":100,"icon":101},"安卓代码加固（9）：防录屏","\u002Fandroid\u002Fhidden-hardening\u002Fflag-secure","3.android\u002F02.hidden-hardening\u002F09.flag-secure","i-lucide-eye-off",{"title":103,"path":104,"stem":105,"icon":106},"安卓代码加固（10）：ABI门禁","\u002Fandroid\u002Fhidden-hardening\u002Fabi-gate","3.android\u002F02.hidden-hardening\u002F10.abi-gate","i-lucide-git-compare",{"title":108,"icon":109,"path":110,"stem":111,"children":112},"iOS","i-simple-icons-apple","\u002Fios","4.ios",[113,115,120,125,129,133],{"title":108,"path":110,"stem":114,"icon":109},"4.ios\u002Findex",{"title":116,"path":117,"stem":118,"icon":119},"iOS面试题1","\u002Fios\u002Fios-interview1","4.ios\u002F01.ios-interview1","i-lucide-sparkles",{"title":121,"path":122,"stem":123,"icon":124},"设置启动图","\u002Fios\u002Fset-launch-screen","4.ios\u002F02.set-launch-screen","i-lucide-image",{"title":126,"path":127,"stem":128,"icon":48},"路由管理","\u002Fios\u002Frouting","4.ios\u002F03.routing",{"title":130,"path":131,"stem":132,"icon":91},"状态管理","\u002Fios\u002Fstate-management","4.ios\u002F04.state-management",{"title":134,"path":135,"stem":136,"icon":137},"事件传递","\u002Fios\u002Fevent-delivery","4.ios\u002F05.event-delivery","i-lucide-pointer",{"title":139,"path":140,"stem":141,"children":142,"icon":144},"Flutter","\u002Fflutter","5.flutter\u002Findex",[143],{"title":139,"path":140,"stem":141,"icon":144},"i-simple-icons-flutter",{"title":146,"icon":147,"path":148,"stem":149,"children":150,"page":160},"面试","i-lucide-graduation-cap","\u002Finterview","6.interview",[151,156],{"title":152,"path":153,"stem":154,"icon":155},"Flutter面试题1","\u002Finterview\u002Fflutter-interview1","6.interview\u002F01.flutter-interview1","i-lucide-boxes",{"title":157,"path":158,"stem":159,"icon":66},"Flutter面试题2","\u002Finterview\u002Fflutter-interview2","6.interview\u002F02.flutter-interview2",false,{"title":162,"icon":163,"path":164,"stem":165,"children":166},"算法学习","i-lucide-binary","\u002Falgorithm","7.algorithm",[167,169],{"title":162,"path":164,"stem":168,"icon":163},"7.algorithm\u002Findex",{"title":170,"path":171,"stem":172},"算法基础1：复杂度分析","\u002Falgorithm\u002Ftime-space-complexity","7.algorithm\u002F01.time-space-complexity",{"id":174,"title":78,"body":175,"description":1332,"extension":1333,"links":1334,"meta":1337,"navigation":1344,"path":79,"seo":1345,"stem":80,"__hash__":1348},"docs\u002F3.android\u002F02.hidden-hardening\u002F05.xor-obfuscate.md",{"type":176,"value":177,"toc":1321},"minimark",[178,203,417,425,429,439,660,667,670,677,969,972,975,987,1161,1173,1225,1240,1243,1289,1300,1303,1317],[179,180,181,182,186,187,190,191,194,195,198,199,202],"p",{},"对 ",[183,184,185],"code",{},"libhiddendecrypt.so"," 执行 ",[183,188,189],{},"strings","，不应直接得到 ",[183,192,193],{},"payload\u002Fhidden.dex.enc"," 或 ",[183,196,197],{},"HiddenLandingPage","。这些字面量在源码里写成 ",[183,200,201],{},"uint8_t"," 数组，运行时再异或还原。",[204,205,211],"pre",{"className":206,"code":207,"filename":208,"language":209,"meta":210,"style":210},"language-cpp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","#define XOR_KEY 0x5Au\n\nstatic void xor_decode(char *dst, const uint8_t *src, size_t n) {\n    for (size_t i = 0; i \u003C n; ++i) {\n        dst[i] = static_cast\u003Cchar>(src[i] ^ XOR_KEY);\n    }\n    dst[n] = '\\0';\n}\n","hidden-sdk\u002Fsrc\u002Fmain\u002Fcpp\u002Fhidden_bridge.cpp","cpp","",[183,212,213,230,237,292,336,378,384,411],{"__ignoreMap":210},[214,215,218,222,226],"span",{"class":216,"line":217},"line",1,[214,219,221],{"class":220},"s7zQu","#define",[214,223,225],{"class":224},"s2Zo4"," XOR_KEY",[214,227,229],{"class":228},"sbssI"," 0x5Au\n",[214,231,233],{"class":216,"line":232},2,[214,234,236],{"emptyLinePlaceholder":235},true,"\n",[214,238,240,244,247,250,254,257,260,264,267,270,273,275,278,280,283,286,289],{"class":216,"line":239},3,[214,241,243],{"class":242},"spNyl","static",[214,245,246],{"class":242}," void",[214,248,249],{"class":224}," xor_decode",[214,251,253],{"class":252},"sMK4o","(",[214,255,256],{"class":242},"char",[214,258,259],{"class":242}," *",[214,261,263],{"class":262},"sHdIc","dst",[214,265,266],{"class":252},",",[214,268,269],{"class":242}," const",[214,271,272],{"class":242}," uint8_t",[214,274,259],{"class":242},[214,276,277],{"class":262},"src",[214,279,266],{"class":252},[214,281,282],{"class":242}," size_t",[214,284,285],{"class":262}," n",[214,287,288],{"class":252},")",[214,290,291],{"class":252}," {\n",[214,293,295,298,301,304,308,311,314,317,319,322,324,326,329,332,334],{"class":216,"line":294},4,[214,296,297],{"class":220},"    for",[214,299,300],{"class":252}," (",[214,302,303],{"class":242},"size_t",[214,305,307],{"class":306},"sTEyZ"," i ",[214,309,310],{"class":252},"=",[214,312,313],{"class":228}," 0",[214,315,316],{"class":252},";",[214,318,307],{"class":306},[214,320,321],{"class":252},"\u003C",[214,323,285],{"class":306},[214,325,316],{"class":252},[214,327,328],{"class":252}," ++",[214,330,331],{"class":306},"i",[214,333,288],{"class":252},[214,335,291],{"class":252},[214,337,339,342,345,348,351,354,357,359,362,364,366,368,370,373,375],{"class":216,"line":338},5,[214,340,341],{"class":306},"        dst",[214,343,344],{"class":252},"[",[214,346,331],{"class":347},"swJcz",[214,349,350],{"class":252},"]",[214,352,353],{"class":252}," =",[214,355,356],{"class":252}," static_cast\u003C",[214,358,256],{"class":242},[214,360,361],{"class":252},">(",[214,363,277],{"class":306},[214,365,344],{"class":252},[214,367,331],{"class":347},[214,369,350],{"class":252},[214,371,372],{"class":252}," ^",[214,374,225],{"class":347},[214,376,377],{"class":252},");\n",[214,379,381],{"class":216,"line":380},6,[214,382,383],{"class":252},"    }\n",[214,385,387,390,392,395,397,399,402,405,408],{"class":216,"line":386},7,[214,388,389],{"class":306},"    dst",[214,391,344],{"class":252},[214,393,394],{"class":306},"n",[214,396,350],{"class":252},[214,398,353],{"class":252},[214,400,401],{"class":252}," '",[214,403,404],{"class":306},"\\0",[214,406,407],{"class":252},"'",[214,409,410],{"class":252},";\n",[214,412,414],{"class":216,"line":413},8,[214,415,416],{"class":252},"}\n",[418,419,420,421,424],"note",{},"这只是提高扫描字符串的成本，不是密码学保护。密钥是单字节 ",[183,422,423],{},"0x5A","，知道算法就能还原。它要阻止的是：打开 so 就能搜到类名和路径。",[426,427,428],"h2",{"id":428},"隐藏资源路径",[179,430,431,434,435,438],{},[183,432,433],{},"read_asset"," 不写 ",[183,436,437],{},"\"payload\u002Fhidden.dex.enc\"","。22 个字节解开后才是这条路径：",[204,440,442],{"className":206,"code":441,"filename":208,"language":209,"meta":210,"style":210},"static const uint8_t path_enc[] = {\n        0x2a, 0x3b, 0x23, 0x36, 0x35, 0x3b, 0x3e, 0x75, 0x32, 0x33, 0x3e,\n        0x3e, 0x3f, 0x34, 0x74, 0x3e, 0x3f, 0x22, 0x74, 0x3f, 0x34, 0x39\n};\nchar path[32];\nxor_decode(path, path_enc, sizeof(path_enc));\nAAsset *asset = AAssetManager_open(am, path, AASSET_MODE_BUFFER);\nhidden_secure_zero(path, sizeof(path));\n",[183,443,444,459,515,565,570,585,611,643],{"__ignoreMap":210},[214,445,446,448,450,452,455,457],{"class":216,"line":217},[214,447,243],{"class":242},[214,449,269],{"class":242},[214,451,272],{"class":242},[214,453,454],{"class":306}," path_enc[] ",[214,456,310],{"class":252},[214,458,291],{"class":252},[214,460,461,464,466,469,471,474,476,479,481,484,486,488,490,493,495,498,500,503,505,508,510,512],{"class":216,"line":232},[214,462,463],{"class":228},"        0x2a",[214,465,266],{"class":252},[214,467,468],{"class":228}," 0x3b",[214,470,266],{"class":252},[214,472,473],{"class":228}," 0x23",[214,475,266],{"class":252},[214,477,478],{"class":228}," 0x36",[214,480,266],{"class":252},[214,482,483],{"class":228}," 0x35",[214,485,266],{"class":252},[214,487,468],{"class":228},[214,489,266],{"class":252},[214,491,492],{"class":228}," 0x3e",[214,494,266],{"class":252},[214,496,497],{"class":228}," 0x75",[214,499,266],{"class":252},[214,501,502],{"class":228}," 0x32",[214,504,266],{"class":252},[214,506,507],{"class":228}," 0x33",[214,509,266],{"class":252},[214,511,492],{"class":228},[214,513,514],{"class":252},",\n",[214,516,517,520,522,525,527,530,532,535,537,539,541,543,545,548,550,552,554,556,558,560,562],{"class":216,"line":239},[214,518,519],{"class":228},"        0x3e",[214,521,266],{"class":252},[214,523,524],{"class":228}," 0x3f",[214,526,266],{"class":252},[214,528,529],{"class":228}," 0x34",[214,531,266],{"class":252},[214,533,534],{"class":228}," 0x74",[214,536,266],{"class":252},[214,538,492],{"class":228},[214,540,266],{"class":252},[214,542,524],{"class":228},[214,544,266],{"class":252},[214,546,547],{"class":228}," 0x22",[214,549,266],{"class":252},[214,551,534],{"class":228},[214,553,266],{"class":252},[214,555,524],{"class":228},[214,557,266],{"class":252},[214,559,529],{"class":228},[214,561,266],{"class":252},[214,563,564],{"class":228}," 0x39\n",[214,566,567],{"class":216,"line":294},[214,568,569],{"class":252},"};\n",[214,571,572,574,577,579,582],{"class":216,"line":338},[214,573,256],{"class":242},[214,575,576],{"class":306}," path",[214,578,344],{"class":252},[214,580,581],{"class":228},"32",[214,583,584],{"class":252},"];\n",[214,586,587,590,592,595,597,600,602,605,608],{"class":216,"line":380},[214,588,589],{"class":224},"xor_decode",[214,591,253],{"class":252},[214,593,594],{"class":306},"path",[214,596,266],{"class":252},[214,598,599],{"class":306}," path_enc",[214,601,266],{"class":252},[214,603,604],{"class":252}," sizeof(",[214,606,607],{"class":306},"path_enc",[214,609,610],{"class":252},"));\n",[214,612,613,616,619,622,624,627,629,632,634,636,638,641],{"class":216,"line":386},[214,614,615],{"class":306},"AAsset ",[214,617,618],{"class":252},"*",[214,620,621],{"class":306},"asset ",[214,623,310],{"class":252},[214,625,626],{"class":224}," AAssetManager_open",[214,628,253],{"class":252},[214,630,631],{"class":306},"am",[214,633,266],{"class":252},[214,635,576],{"class":306},[214,637,266],{"class":252},[214,639,640],{"class":306}," AASSET_MODE_BUFFER",[214,642,377],{"class":252},[214,644,645,648,650,652,654,656,658],{"class":216,"line":413},[214,646,647],{"class":224},"hidden_secure_zero",[214,649,253],{"class":252},[214,651,594],{"class":306},[214,653,266],{"class":252},[214,655,604],{"class":252},[214,657,594],{"class":306},[214,659,610],{"class":252},[179,661,662,663,666],{},"打开后立刻清除栈上的明文路径。Java 的 ",[183,664,665],{},"HiddenCrypto.ASSET_PATH"," 仍是明文字符串，但主流程不再用它读取文件。",[426,668,669],{"id":669},"隐藏实现类名",[179,671,672,673,676],{},"加载时的 FQCN 同样编码。解开后是 ",[183,674,675],{},"com.example.minidex.hidden.HiddenLandingPage","：",[204,678,680],{"className":206,"code":679,"filename":208,"language":209,"meta":210,"style":210},"static const uint8_t cls_enc[] = {\n        0x39, 0x35, 0x37, 0x74, 0x3f, 0x22, 0x3b, 0x37, 0x2a, 0x36, 0x3f,\n        0x74, 0x37, 0x33, 0x34, 0x33, 0x3e, 0x3f, 0x22, 0x74, 0x32, 0x33,\n        0x3e, 0x3e, 0x3f, 0x34, 0x74, 0x12, 0x33, 0x3e, 0x3e, 0x3f, 0x34,\n        0x16, 0x3b, 0x34, 0x3e, 0x33, 0x34, 0x3d, 0x0a, 0x3b, 0x3d, 0x3f\n};\nchar cls_name[64];\nxor_decode(cls_name, cls_enc, sizeof(cls_enc));\njstring jname = env->NewStringUTF(cls_name);\nhidden_secure_zero(cls_name, sizeof(cls_name));\n",[183,681,682,697,746,793,840,888,892,906,929,952],{"__ignoreMap":210},[214,683,684,686,688,690,693,695],{"class":216,"line":217},[214,685,243],{"class":242},[214,687,269],{"class":242},[214,689,272],{"class":242},[214,691,692],{"class":306}," cls_enc[] ",[214,694,310],{"class":252},[214,696,291],{"class":252},[214,698,699,702,704,706,708,711,713,715,717,719,721,723,725,727,729,731,733,736,738,740,742,744],{"class":216,"line":232},[214,700,701],{"class":228},"        0x39",[214,703,266],{"class":252},[214,705,483],{"class":228},[214,707,266],{"class":252},[214,709,710],{"class":228}," 0x37",[214,712,266],{"class":252},[214,714,534],{"class":228},[214,716,266],{"class":252},[214,718,524],{"class":228},[214,720,266],{"class":252},[214,722,547],{"class":228},[214,724,266],{"class":252},[214,726,468],{"class":228},[214,728,266],{"class":252},[214,730,710],{"class":228},[214,732,266],{"class":252},[214,734,735],{"class":228}," 0x2a",[214,737,266],{"class":252},[214,739,478],{"class":228},[214,741,266],{"class":252},[214,743,524],{"class":228},[214,745,514],{"class":252},[214,747,748,751,753,755,757,759,761,763,765,767,769,771,773,775,777,779,781,783,785,787,789,791],{"class":216,"line":239},[214,749,750],{"class":228},"        0x74",[214,752,266],{"class":252},[214,754,710],{"class":228},[214,756,266],{"class":252},[214,758,507],{"class":228},[214,760,266],{"class":252},[214,762,529],{"class":228},[214,764,266],{"class":252},[214,766,507],{"class":228},[214,768,266],{"class":252},[214,770,492],{"class":228},[214,772,266],{"class":252},[214,774,524],{"class":228},[214,776,266],{"class":252},[214,778,547],{"class":228},[214,780,266],{"class":252},[214,782,534],{"class":228},[214,784,266],{"class":252},[214,786,502],{"class":228},[214,788,266],{"class":252},[214,790,507],{"class":228},[214,792,514],{"class":252},[214,794,795,797,799,801,803,805,807,809,811,813,815,818,820,822,824,826,828,830,832,834,836,838],{"class":216,"line":294},[214,796,519],{"class":228},[214,798,266],{"class":252},[214,800,492],{"class":228},[214,802,266],{"class":252},[214,804,524],{"class":228},[214,806,266],{"class":252},[214,808,529],{"class":228},[214,810,266],{"class":252},[214,812,534],{"class":228},[214,814,266],{"class":252},[214,816,817],{"class":228}," 0x12",[214,819,266],{"class":252},[214,821,507],{"class":228},[214,823,266],{"class":252},[214,825,492],{"class":228},[214,827,266],{"class":252},[214,829,492],{"class":228},[214,831,266],{"class":252},[214,833,524],{"class":228},[214,835,266],{"class":252},[214,837,529],{"class":228},[214,839,514],{"class":252},[214,841,842,845,847,849,851,853,855,857,859,861,863,865,867,870,872,875,877,879,881,883,885],{"class":216,"line":338},[214,843,844],{"class":228},"        0x16",[214,846,266],{"class":252},[214,848,468],{"class":228},[214,850,266],{"class":252},[214,852,529],{"class":228},[214,854,266],{"class":252},[214,856,492],{"class":228},[214,858,266],{"class":252},[214,860,507],{"class":228},[214,862,266],{"class":252},[214,864,529],{"class":228},[214,866,266],{"class":252},[214,868,869],{"class":228}," 0x3d",[214,871,266],{"class":252},[214,873,874],{"class":228}," 0x0a",[214,876,266],{"class":252},[214,878,468],{"class":228},[214,880,266],{"class":252},[214,882,869],{"class":228},[214,884,266],{"class":252},[214,886,887],{"class":228}," 0x3f\n",[214,889,890],{"class":216,"line":380},[214,891,569],{"class":252},[214,893,894,896,899,901,904],{"class":216,"line":386},[214,895,256],{"class":242},[214,897,898],{"class":306}," cls_name",[214,900,344],{"class":252},[214,902,903],{"class":228},"64",[214,905,584],{"class":252},[214,907,908,910,912,915,917,920,922,924,927],{"class":216,"line":413},[214,909,589],{"class":224},[214,911,253],{"class":252},[214,913,914],{"class":306},"cls_name",[214,916,266],{"class":252},[214,918,919],{"class":306}," cls_enc",[214,921,266],{"class":252},[214,923,604],{"class":252},[214,925,926],{"class":306},"cls_enc",[214,928,610],{"class":252},[214,930,932,935,937,940,943,946,948,950],{"class":216,"line":931},9,[214,933,934],{"class":306},"jstring jname ",[214,936,310],{"class":252},[214,938,939],{"class":306}," env",[214,941,942],{"class":252},"->",[214,944,945],{"class":224},"NewStringUTF",[214,947,253],{"class":252},[214,949,914],{"class":306},[214,951,377],{"class":252},[214,953,955,957,959,961,963,965,967],{"class":216,"line":954},10,[214,956,647],{"class":224},[214,958,253],{"class":252},[214,960,914],{"class":306},[214,962,266],{"class":252},[214,964,604],{"class":252},[214,966,914],{"class":306},[214,968,610],{"class":252},[179,970,971],{},"改包名时必须同步修改这组字节，并重新编译 so。",[426,973,974],{"id":974},"按名查找方法",[179,976,977,980,981,984,985,676],{},[183,978,979],{},"mid_by_xor"," 把方法名解到栈上 64 字节缓冲，",[183,982,983],{},"GetMethodID"," 之后立刻 ",[183,986,647],{},[204,988,990],{"className":206,"code":989,"filename":208,"language":209,"meta":210,"style":210},"static jmethodID mid_by_xor(\n        JNIEnv *env, jclass cls,\n        const uint8_t *name_enc, size_t name_len,\n        const char *sig\n) {\n    char name[64];\n    xor_decode(name, name_enc, name_len);\n    jmethodID mid = env->GetMethodID(cls, name, sig);\n    hidden_secure_zero(name, sizeof(name));\n    return mid;\n}\n",[183,991,992,1006,1026,1047,1059,1065,1079,1100,1129,1146,1156],{"__ignoreMap":210},[214,993,994,996,1000,1003],{"class":216,"line":217},[214,995,243],{"class":242},[214,997,999],{"class":998},"sBMFI"," jmethodID",[214,1001,1002],{"class":224}," mid_by_xor",[214,1004,1005],{"class":252},"(\n",[214,1007,1008,1011,1013,1016,1018,1021,1024],{"class":216,"line":232},[214,1009,1010],{"class":998},"        JNIEnv",[214,1012,259],{"class":242},[214,1014,1015],{"class":262},"env",[214,1017,266],{"class":252},[214,1019,1020],{"class":998}," jclass",[214,1022,1023],{"class":262}," cls",[214,1025,514],{"class":252},[214,1027,1028,1031,1033,1035,1038,1040,1042,1045],{"class":216,"line":239},[214,1029,1030],{"class":242},"        const",[214,1032,272],{"class":242},[214,1034,259],{"class":242},[214,1036,1037],{"class":262},"name_enc",[214,1039,266],{"class":252},[214,1041,282],{"class":242},[214,1043,1044],{"class":262}," name_len",[214,1046,514],{"class":252},[214,1048,1049,1051,1054,1056],{"class":216,"line":294},[214,1050,1030],{"class":242},[214,1052,1053],{"class":242}," char",[214,1055,259],{"class":242},[214,1057,1058],{"class":262},"sig\n",[214,1060,1061,1063],{"class":216,"line":338},[214,1062,288],{"class":252},[214,1064,291],{"class":252},[214,1066,1067,1070,1073,1075,1077],{"class":216,"line":380},[214,1068,1069],{"class":242},"    char",[214,1071,1072],{"class":306}," name",[214,1074,344],{"class":252},[214,1076,903],{"class":228},[214,1078,584],{"class":252},[214,1080,1081,1084,1086,1089,1091,1094,1096,1098],{"class":216,"line":386},[214,1082,1083],{"class":224},"    xor_decode",[214,1085,253],{"class":252},[214,1087,1088],{"class":306},"name",[214,1090,266],{"class":252},[214,1092,1093],{"class":306}," name_enc",[214,1095,266],{"class":252},[214,1097,1044],{"class":306},[214,1099,377],{"class":252},[214,1101,1102,1105,1107,1109,1111,1113,1115,1118,1120,1122,1124,1127],{"class":216,"line":413},[214,1103,1104],{"class":306},"    jmethodID mid ",[214,1106,310],{"class":252},[214,1108,939],{"class":306},[214,1110,942],{"class":252},[214,1112,983],{"class":224},[214,1114,253],{"class":252},[214,1116,1117],{"class":306},"cls",[214,1119,266],{"class":252},[214,1121,1072],{"class":306},[214,1123,266],{"class":252},[214,1125,1126],{"class":306}," sig",[214,1128,377],{"class":252},[214,1130,1131,1134,1136,1138,1140,1142,1144],{"class":216,"line":931},[214,1132,1133],{"class":224},"    hidden_secure_zero",[214,1135,253],{"class":252},[214,1137,1088],{"class":306},[214,1139,266],{"class":252},[214,1141,604],{"class":252},[214,1143,1088],{"class":306},[214,1145,610],{"class":252},[214,1147,1148,1151,1154],{"class":216,"line":954},[214,1149,1150],{"class":220},"    return",[214,1152,1153],{"class":306}," mid",[214,1155,410],{"class":252},[214,1157,1159],{"class":216,"line":1158},11,[214,1160,416],{"class":252},[179,1162,1163,1164,1167,1168,1172],{},"JNI 签名（例如 ",[183,1165,1166],{},"(Landroid\u002Fcontent\u002FContext;)Z","）目前仍是明文字符串。隐藏的是 ",[1169,1170,1171],"strong",{},"业务方法名","。",[1174,1175,1176,1189],"table",{},[1177,1178,1179],"thead",{},[1180,1181,1182,1186],"tr",{},[1183,1184,1185],"th",{},"编码数组",[1183,1187,1188],{},"解开后",[1190,1191,1192,1203,1213],"tbody",{},[1180,1193,1194,1199],{},[1195,1196,1197],"td",{},[183,1198,607],{},[1195,1200,1201],{},[183,1202,193],{},[1180,1204,1205,1209],{},[1195,1206,1207],{},[183,1208,926],{},[1195,1210,1211],{},[183,1212,675],{},[1180,1214,1215,1220],{},[1195,1216,1217],{},[183,1218,1219],{},"abi_enc",[1195,1221,1222],{},[183,1223,1224],{},"getAbiVersion",[179,1226,1227,1228,1232,1233,1236,1237,1172],{},"完整方法名对照见 ",[1229,1230,1231],"a",{"href":74},"指令分发"," 的表。例如 op 7 的字节解开是 ",[183,1234,1235],{},"performAnswer","，op 13 是 ",[183,1238,1239],{},"applyScreenProtection",[426,1241,1242],{"id":1242},"改名时如何同步",[1244,1245,1246,1251,1264,1268,1278,1282],"steps",{},[1247,1248,1250],"h3",{"id":1249},"改-kotlin-方法名","改 Kotlin 方法名",[179,1252,1253,1254,1256,1257,1259,1260,1263],{},"只改 ",[183,1255,197],{}," 不够。so 会 ",[183,1258,983],{}," 失败，表现为加载成功，但 ",[183,1261,1262],{},"invoke"," 没有实际效果。",[1247,1265,1267],{"id":1266},"重算-xor-字节","重算 XOR 字节",[179,1269,1270,1271,1273,1274,1277],{},"每个字符异或 ",[183,1272,423],{},"。例如 ",[183,1275,1276],{},"'s' ^ 0x5A == 0x29","，其余字符同理。",[1247,1279,1281],{"id":1280},"成对升级-abi","成对升级 ABI",[179,1283,1284,1285,1288],{},"方法表变化后，应提高 ",[1229,1286,1287],{"href":104},"ABI门禁"," 的版本号，避免旧 so 调用新 dex。",[1290,1291,1292,1293,1296,1297,1299],"warning",{},"Kotlin ",[183,1294,1295],{},"val abiVersion"," 在 JNI 里是 ",[183,1298,1224],{},"。属性改名后，XOR 数组也要改成新的 getter 名。",[426,1301,1302],{"id":1302},"下一步",[1304,1305,1306,1312],"ul",{},[1307,1308,1309,1311],"li",{},[1229,1310,1231],{"href":74},"：这些名字如何被整数触发",[1307,1313,1314,1316],{},[1229,1315,1287],{"href":104},"：方法和 so 必须成对",[1318,1319,1320],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":210,"searchDepth":232,"depth":232,"links":1322},[1323,1324,1325,1326,1331],{"id":428,"depth":232,"text":428},{"id":669,"depth":232,"text":669},{"id":974,"depth":232,"text":974},{"id":1242,"depth":232,"text":1242,"children":1327},[1328,1329,1330],{"id":1249,"depth":239,"text":1250},{"id":1266,"depth":239,"text":1267},{"id":1280,"depth":239,"text":1281},{"id":1302,"depth":232,"text":1302},"so 里的资源路径、实现类名、方法名按 0x5A 异或存放，用完立即清零。","md",[1335,1336],{"label":73,"icon":76,"to":74},{"label":63,"icon":66,"to":64},{"date":1338,"categories":1339,"tags":1341},"2026-09-21",[1340],"android",[37,1342,1343],"JNI","混淆",{"icon":81},{"title":1346,"description":1347},"安卓代码加固（5）：Native XOR 混淆 Hidden DEX 字符串","hidden-dex-minidemo 用 XOR 0x5A 隐藏 payload 路径、HiddenLandingPage 类名和全部 dispatch 方法名，避免 strings 直接扫出来。","wJneS4fSCX4oQM4nDO1dKCadXXXbLvCpyEfkY950Idk",[1350,1352],{"title":73,"path":74,"stem":75,"description":1351,"icon":76,"children":-1},"公开入口只有 invoke(Int, Any?, Any?)。指令含义不进入 AAR，native 按整数查找方法。",{"title":83,"path":84,"stem":85,"description":1353,"icon":86,"children":-1},"SDK \u002F AAR 不带 AES 密钥。CI 用环境变量，本地 debug 用 gitignore 文件。",1790767046476]