Java/Android手工去字符串混淆

去除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就可以直接调用了。

效果:

发表评论

电子邮件地址不会被公开。 必填项已用*标注