iT邦幫忙

2025 iThome 鐵人賽

DAY 29
0

手動反混淆 雖然使用工具反混要很快 但有時候並不是總是可行 我們需要嘗試分析原本代碼來嘗試構建自己的腳本來反混淆

以下列混淆為例

private static final String API_KEY = Deobfuscator$myapp$app.getString(1198238695014245497L);

進入到getString 方法

https://ithelp.ithome.com.tw/upload/images/20251010/201494595rIIB4Z66o.jpg

我們可以看到getString 有個long j 參數 也就是 1198238695014245497L 可能是 標示符
在看到 DeobfuscatorHelper.getString(j, chunks) 這裡的chunks 可能就是 反混淆或的strings
檢查一下 DeobfuscatorHelper的邏輯

https://ithelp.ithome.com.tw/upload/images/20251010/20149459OfI5DoHMLT.jpg

分析這兩行

long next = RandomHelper.next(RandomHelper.seed(4294967295L & j));
long next2 = RandomHelper.next(next);

next 這裡使用 4294967295L 去 and 原先標示符當成seed 來成生亂數 接下來對Strings Array 進行decode 與 提取還原字串

檢查一下 RandomHelper

https://ithelp.ithome.com.tw/upload/images/20251010/201494590t16xdm5lR.jpg

基本上我已經知道開發只用那些 主要的反混淆程式 我們可以接著 去時實現程式 在github 回那個專案找一下 RandomHelper{} 與 DeobfuscatorHelper{} 程式

https://ithelp.ithome.com.tw/upload/images/20251010/20149459vl4AIq9rwF.jpg

https://ithelp.ithome.com.tw/upload/images/20251010/20149459JzDrd2jrtq.jpg

編寫JAVA SCRIPT 使用這些類

public class Main {
    public static void main(String[] args) {
        long key = 1198238695014245497L;
        String[] chunks = { "\uffbf\uffb1\uffcb\uff89\uffa5\uffc8\uff8e\uffad\uffcf\uff94\uffb9\uffcc\uff87\uffb5\uff8b\uffba\uffc6\uff8f\uffb8\uff86\uffb2\uffc9\uffb3\uff8c\uffaa\uff90\uffae\uffcd\uff96\uffbd\uffc7\uff88\uffb7\uff9e\uffa8\uff9c\uffbb\uffca\uffb6\uff97\uffa9\uffce\uff9a\uffa6\uff91\uffaf\uff9d\uffa7\uff93\uffab\uff98\uffb4\uff85\uffbc\uffac\uff8d\uffbe\uff99\uff95\uffb0\uff8a\uffaf\uff92\uffb4\uff8e\uffbf\uffb1\uffcb\uff89\uffa5\uffc8\uff8e\uffad\uffcf\uff94\uffb9\uffcc\uff87\uffb5\uff8b\uffba\uffc6\uff8f\uffb8\uff86\uffb2\uffc9\uffb3\uff8c\uffaa\uff90\uffae\uffcd\uff96\uffbd\uffc7\uff88\uffb7\uff9e\uffa8\uff9c\uffbb\uffca\uffb6\uff97\uffa9\uffce\uff9a\uffa6\uff91\uffaf\uff9d\uffa7\uff93\uffab\uff98\uffb4\uff85\uffbc\uffac\uff8d\uffbe\uff99\uff95\uffb0\uff8a\uffaf\uff92\uffb4\uff8e"};
        String result = DeobfuscatorHelper.getString(key, chunks);
        System.out.println(result);
    }
}

編譯與執行

javac Main.java
java Main

https://ithelp.ithome.com.tw/upload/images/20251010/20149459rfUpjETFzz.jpg

成功還原API Key Strings


上一篇
Day 28 靜態分析 反混淆 上
系列文
我是不可能一直學Android 絕對不會29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言