<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                #### **概述** 我們的APK實際上就是一個ZIP壓縮文件,里面包含有一個classes.dex,我們編譯后生成的程序代碼就全部在那里了,通過apktool等工具可以輕松地將它們反編譯成smali代碼。有了這些反編譯出來的smali代碼之后,我們就可以輕松地了解別人的APK使用的一些技術或者直接修改別人的APK。由于這些APK反編譯工具的存在,我們迫切地希望能有方法去防止別人來反編譯我們的APK,從而保護自己的商業機密和利益。 主要講了三種APK防反編譯技術: * 添加非法指令; * 隱藏敏感代碼 * 偽APK加密技術。 此外,還探討了更高級的Dex和Native加殼技術來防止別人反編譯我們的APK。 #### **添加非法指令** * Step 1: 在APK包含一個無關類Bomb,該類有一個成員函數drop * Step 2: 將APK的classes.dex解壓出來,并且用dexdump進行反編譯,找到Bomb.drop在classes.dex的偏移 * Step 3: 用vim以二進制方式打開classes.dex,轉到Bomb.drop的偏移處,將前兩個字節修改為FF FF(非法指令) * Step 4: 重新打包和簽名APK,用adb install命令安裝,日志提示checksum不一致 > 注: > vim編輯二進制文件 > 打開文件:`vim -b <file>` > 編輯文件::%!xxd > 編輯完成::%!xxd –r > 保存文件::wq > dexdump反編譯APK > `dexdump -d <classes.dex>` > dexdump驗證checksum >` dexdump -c <classes.dex>` > apktool反編譯APK > `apktool d <apkfile> <dir>` * Step 5: 用dexdump驗證APK的checksum,并且將正確的checksum替換原classes.dex的checksum * Step 6: 重新打包和簽名APK,用adb install安裝,DONE #### **隱藏敏感代碼** * Step 1:在APK包含一個無關類Bomb,該類有一個成員函數drop,前面留有18個字節的垃圾指令 * Step 2:將APK的classes.dex解壓出來,并且用dexdump進行反編譯,找到Bomb.drop在classes.dex的偏移 * Step 3:用vim以二進制方式打開classes.dex,轉到Bomb.drop的偏移處,將前18個字節修改為以下指令 ![](https://box.kancloud.cn/1dcfa149e9b25b7dc9456d695a4c540c_673x60.png) > 注:第一條指令3200 0900表示向前跳9個code unit,一個code unit占2個字節,即向前跳18個字節,從3200 0900的偏移向前算,剛好就是下一條指令fill-array-data的payload偏移處,即hhhh hhhh后面那個字節 > 第二條指令中的00000005表示其payload位于5個code uint之后,即10個字節之后,即hhhh hhhh開始的那個字節 * Step 4: 用dexdump查看classes.dex的頭部信息,找到class_def的偏移,以及Bomb類的class index * Step 5: class_def的偏移,加上Bomb類的class index乘以32的積,即可得到用來描述Bomb類的class_def結構體偏移,再往前4個字節,即為其access_flags,將它的第16位設置為1,一般就是設置為0x10001,也就是將0100 0000設置為0100 0100,這樣可以將Bomb類設置為已驗證 > 注:用dexdump -f命令查看classes.dex的頭部信息 * Step 6: 用dexdump驗證APK的checksum,并且將正確的checksum替換原classes.dex的checksum * Step 7: 重新打包和簽名APK,用adb install安裝,DONE #### **偽APK加密技術** * ZIP中的每一個文件都有一個2字節大小的全局方式位標記,其中第0位表示是否加密 * 如果ZIP中的一個文件標志為加密,那么在解壓時,就需要指定解壓密碼 * APK默認都是不加密的,也就是APK在安裝解壓時,它里面的文件的加密位標志都會被忽略 * Apktool發現APK是加密的時候,會拋出一個異常出來 利用上述差異,就可以給APK設置一個加密標志,但不對其進行加密,從而阻止Apktool反編譯 #### **總結** * APK在安裝時,會對APK進行驗證,主要是checksum驗證和指令合法性驗證 * 安裝通過驗證的APK會被標記為已驗證,并且會被優化 * 安裝沒有通過驗證的APK仍然會被成功安裝,但是它會被標記為未驗證 * 未驗證的APK的某個類在被加載時,會被驗證,一旦驗證失敗,就會拋出異常 * 反編譯工具會對APK的所有類進行驗證,不管這個類安裝后會不會被加載,一旦驗證不通過,就會拋出異常 * 根據以上的APK安裝、驗證和加載流程,就可以通過以下兩個方法來阻止反編譯: * 包含一個有非法指令(不能執行)的類,但是這個類保證永遠不會被加載 * 包含一個有非法指令(能執行)的類,同時將該類預先設置為已驗證的 #### **思考** * 反編譯工具,如Apktool,采用的是線性掃描算法來分析指令流,當遇到非法指令時,就會異常退出 * 如果遇到非法指令只是簡單忽略,那么就仍能正常工作 * 如果反編譯工具采用的遞歸遍歷算法來分析指令流,那么就能將fill-array-data之類的偽指令反編譯出來 * 如果反編譯工具忽略掉APK的加密標志,那么就能將偽加密的APK也反編譯出來 * 如果反編譯工具更智能一些,那么一切皆可反編譯……. * 怎么辦? ![](https://box.kancloud.cn/48ae14e8032b551a094b30da1876771d_966x671.png) * Dex Code加密 * Android 4.0及以上的DexFile提供有加載內存dex文件的隱藏接口openDexFile和defineClass,通過它們就可以從內存中加載一個dex文件,在真正加載這塊內存之前,可以對其進行加密 * Android 4.0之前的版本,可以用libdvm的導出函數來實現上述相同的功能 * Native Code加密 * 系統中的每一個so文件都是由/system/bin/linker來進行加載和解析的 * 參考/system/bin/linker,實現一個自己的linker,這個linker可以加載和解析內存so文件,從而實現加密處理
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看