去除java字符串混淆的工具一直不少,这里推荐几个比较好用的:
Simplify(https://github.com/CalebFenton/simplify)
这个看介绍是挺不错的,但实际使用中,很是鸡肋,执行效率低的恐怖,而且很大可能完全没作用
Dex-orcale(https://bbs.pediy.com/thread-253522.htm)
没给原始GitHub链接的原因是,这个项目已经不在维护了,可能无法直接拿来用,附上大佬魔改版,可以直接拿来用
Dex2Jar附带工具(https://github.com/pxb1988/dex2jar/wiki/DecryptStrings)
简单高效,虽然鲜有人知,不过也有局限性
俗话说的好,与人斗其乐无穷,人和人之间是无法互相理解的,请君欣赏下面一首诗:
道理我都懂,但为什么上面的工具一个都不能用?
但我又懒得看他们的源码,自己动手丰衣足食咯。
毫无疑问方法b会返回原本的String:
事实上大多数的字符串混淆都是这样的,除了少数像DexGuard这种每个类下面都给你插一个不一样的。
但每个解密方法都去扒是会要人命的,时间就是金钱,我直接走了调用的方式,用dex2jar先把dex转换成jar包,之后导入工程测试下能否解密,没有问题的话我们可以考虑下怎么把加密的dex还原回去~
好在我们有baksmail这种神器,将dex转成smali
以下是被加密的字符串对应的smali:
000000C6 const-string v3, “D01mGxE=”
000000CA const-string v4, “z8Hz 0NMl uj2lJ4tL Gu “
000000CE invoke-static g->b(String, String)String, v3, v4
000000D4 move-result-object v3
从中得知,我们只要给寄存器v3传递正确的字符串就可以了,而原本的指令应该是:
const-string v3, “未加密的字符串”
我们也不需要语法解析器这么高大上的玩意了,写代码就要一把梭,直接用正则给他安排上:
const-string v\d, \”(.*?)\”(?:\s+)const-string v\d, \”(.*?)\”(?:\s+)invoke-static \{v\d, v\d\}, Lcom/dc/ic/ls/t;->p\(Ljava/lang/String;Ljava/lang/String;\)Ljava/lang/String;(?:\s+)move-result-object (v\d)
匹配结果堪称完美,接下来就是修复所有的smali文件了。
可以参考下我的csharp脚本,你想问为什么是C#?
没什么特别原因,因为用着顺手,毕竟现学现卖去查java的api的功夫我已经写完了。
调用jar包的方式也很简单,用ikvmc把jar文件编译成C# dll就可以直接调用了。
效果:
碰到一个样本,类似于这种的字符串的加密方式,只是他的包名和方法名以及字段名也都用”il10o”这些字符混淆过了,而且长度超长,所以就无法用baksmali导出来完整的smali文件,https://i.loli.net/2019/10/22/kLdB1iynvzotb4m.png.而且他的有些混淆过的类里有unicode的字符,导致用dex2jar导出jar后,jython import会报错.. 请问这种有啥思路没啊?
这种的话,可以试试jadx一类的现成工具能不能用,不行的话可能要自己手写反混淆或者修改dex2jar了,这个混淆方案似乎是MT的作者搞的,通过修改proguard混淆字典实现的