Android 代碼混淆

1.APK 打包流程

apk 中代碼混淆主要集中在以下三個任務中

  • transformClassesWithDexBuilderForDebug → 將class打包成dex
  • transformDexArchiveWithExternalLibsDexMergerForDebug → 打包第三庫的dex
  • transformDexArchiveWithDexMergerForDebug → 打包最終的dex

三個Task最終都是通過DX或D8來打dex丑婿,跟下第一個Task:DexArchiveBuilderTransform.transform()

  @Override
    public void convert(
            @NonNull Stream<ClassFileEntry> input, @NonNull Path output, boolean isIncremental)
            throws DexArchiveBuilderException {
        D8DiagnosticsHandler d8DiagnosticsHandler = new InterceptingDiagnosticsHandler();
        try {

            D8Command.Builder builder = D8Command.builder(d8DiagnosticsHandler);
            AtomicInteger entryCount = new AtomicInteger();
            input.forEach(
                    entry -> {
                        builder.addClassProgramData(
                                readAllBytes(entry), D8DiagnosticsHandler.getOrigin(entry));
                        entryCount.incrementAndGet();
                    });
            if (entryCount.get() == 0) {
                // nothing to do here, just return
                return;
            }

            OutputMode outputMode =
                    isIncremental ? OutputMode.DexFilePerClassFile : OutputMode.DexIndexed;
            builder.setMode(compilationMode)
                    .setMinApiLevel(minSdkVersion)
                    .setIntermediate(true)
                    .setOutput(output, outputMode)
                    .setIncludeClassesChecksum(compilationMode == compilationMode.DEBUG);

            if (desugaring) {
                builder.addLibraryResourceProvider(bootClasspath.getOrderedProvider());
                builder.addClasspathResourceProvider(classpath.getOrderedProvider());

                if (libConfiguration != null) {
                    builder.addSpecialLibraryConfiguration(libConfiguration);
                }
            } else {
                builder.setDisableDesugaring(true);
            }

            D8.run(builder.build(), MoreExecutors.newDirectExecutorService());
        } catch (Throwable e) {
            throw getExceptionToRethrow(e, d8DiagnosticsHandler);
        }
    }

R8又干了啥早芭?

// 前面獲取dex的文件列表贪绘、混淆列表等急凰,初始化R8Transform實例時傳入
R8Transform transform =
        new R8Transform(
                variantScope,
                userMainDexListFiles,
                userMainDexListProguardRules,
                inputProguardMapping,
                variantScope.getOutputProguardMappingFile());

// 處理混淆規(guī)則蓄喇,callback用于在混淆后執(zhí)行后續(xù)操作
return applyProguardRules(
        variantScope,
        inputProguardMapping,
        variantScope.getOutputProguardMappingFile(),
        testedVariantData,
        transform,
        callback);

具體的邏輯,可以追溯到 R8.class → run()明场,做了這些事:

  • 代碼刪除:通過語法樹靜態(tài)分析技術躏精、發(fā)現(xiàn)并刪除未使用的代碼,如未實例化的Class等破花;
  • 代碼優(yōu)化:對運行時代碼進行優(yōu)化谦趣,刪除死代碼、未使用的參數(shù)座每,選擇性內聯(lián)前鹅、類合并等;
  • 代碼混淆:優(yōu)化標識符名字峭梳,減少代碼量舰绘,會判斷混淆規(guī)則中是否允許修改標識符名字;

2.自定義混淆字典

之前在反編譯人家的APP時看到標識符竟然不是abcd葱椭,而是中文和特殊字符捂寿,怎么做到的呢?其實不難孵运,自定義一個混淆字典就好秦陋,在app的proguard-rules的同級目錄創(chuàng)建一個文件,比如 dictionary治笨,內容示例如下:

﹢
﹣
×
÷
...太長省略

接著在 proguard-rules 添加下述配置:

-obfuscationdictionary ./dictionary
-classobfuscationdictionary ./dictionary
-packageobfuscationdictionary ./dictionary
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末驳概,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旷赖,更是在濱河造成了極大的恐慌顺又,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件等孵,死亡現(xiàn)場離奇詭異稚照,居然都是意外死亡,警方通過查閱死者的電腦和手機俯萌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門果录,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咐熙,你說我怎么就攤上這事弱恒。” “怎么了糖声?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我蘸泻,道長琉苇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任悦施,我火速辦了婚禮并扇,結果婚禮上,老公的妹妹穿的比我還像新娘抡诞。我一直安慰自己穷蛹,他們只是感情好,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布昼汗。 她就那樣靜靜地躺著肴熏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顷窒。 梳的紋絲不亂的頭發(fā)上蛙吏,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音鞋吉,去河邊找鬼鸦做。 笑死,一個胖子當著我的面吹牛谓着,可吹牛的內容都是我干的泼诱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼赊锚,長吁一口氣:“原來是場噩夢啊……” “哼治筒!你這毒婦竟也來了?” 一聲冷哼從身側響起改抡,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤矢炼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阿纤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體句灌,經...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年欠拾,在試婚紗的時候發(fā)現(xiàn)自己被綠了胰锌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡藐窄,死狀恐怖资昧,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情荆忍,我是刑警寧澤格带,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布撤缴,位于F島的核電站,受9級特大地震影響叽唱,放射性物質發(fā)生泄漏屈呕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一棺亭、第九天 我趴在偏房一處隱蔽的房頂上張望虎眨。 院中可真熱鬧,春花似錦镶摘、人聲如沸嗽桩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碌冶。三九已至,卻和暖如春贡未,著一層夾襖步出監(jiān)牢的瞬間种樱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工俊卤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嫩挤,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓消恍,卻偏偏與公主長得像岂昭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狠怨,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容