从上图中可以看到编码后的字符串常量(7: ldc)经过jsr指令跳转到偏移量为234处的switch指令,然后根据每条case分支与不同的整数(例如,bipush 65)进行异或,最后解码后的该字符串实际的内容。在了解字符串混淆编码的过程后,可以写一个简单的解码工具来逆向,但实际还有更简单的办法。因为是在static块中完成的解码操作,可以等类加载后通过反射获取实际的字符串内容。
这里有两个点可以注意下:jsr这个指令在1.7以后的JVM是看不到的(我也是只在KlassMaster混淆过的代码中才看到过这个指令)。jsr 这个指令只适用于1.6及以下的虚拟机,其作用是与ret指令一起完成finally block的跳转和返回,具体细节参见Compiling finally
2、如何修复BurpLoader类的正常逻辑?
这里没有捷径,只能肉眼反编译。反编译的完整代码看这里:BurpLoader.java
为了控制篇幅,这里不对反编译的过程展开,具体过程请跳转到这里查看反编译BurpLoader字节码(待补充)。
成功反编译后我们来看下BurpLoader到底都做了些什么。
1、设置UI外观: