手動反混淆 雖然使用工具反混要很快 但有時候並不是總是可行 我們需要嘗試分析原本代碼來嘗試構建自己的腳本來反混淆
以下列混淆為例
private static final String API_KEY = Deobfuscator$myapp$app.getString(1198238695014245497L);
進入到getString 方法
我們可以看到getString 有個long j 參數 也就是 1198238695014245497L 可能是 標示符
在看到 DeobfuscatorHelper.getString(j, chunks) 這裡的chunks 可能就是 反混淆或的strings
檢查一下 DeobfuscatorHelper的邏輯
分析這兩行
long next = RandomHelper.next(RandomHelper.seed(4294967295L & j));
long next2 = RandomHelper.next(next);
next 這裡使用 4294967295L 去 and 原先標示符當成seed 來成生亂數 接下來對Strings Array 進行decode 與 提取還原字串
檢查一下 RandomHelper
基本上我已經知道開發只用那些 主要的反混淆程式 我們可以接著 去時實現程式 在github 回那個專案找一下 RandomHelper{} 與 DeobfuscatorHelper{} 程式
編寫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
成功還原API Key Strings