在这个加固中,会使用到2个so文件,一个是作为解释器的so,一个用来加密字节码的so。(在不同的版本里名字可能会有差异)。
这种加固一般是将app中代码全部加固,少的几百个方法,多的上千个方法被加固。有些在同一个类中就加固了二百多个方法。

在还原的时候很难将所有代码全部回填回去,所以可以只将关键代码还原即可。
使用ida打开解释器so,找到解释函数vmInterpret,点击红框中的地址跳转

跳转过来后,就会看到一堆跳转地址,数一下刚好是255个,而opcode操作码也正好是255个。
这里就可以大致的确定,下面的这些跳转地址就是操作码的解释器,只不过顺序是被打乱了。

那如何将其还原?
其实我们看到这个红框中 loc_1ADB8 地址是排在第一位的,绿框中的地址sub_18FC4是排在第3位的。
也就是说 伪操作码 01 对应的是loc_1ADB8,伪操作码 03 对应的是sub_18FC4,以此类推。
只要弄清了这些地址对应的真实的操作码即可。
这里有个笨办法就是自己去加固一个app,在加固的时候他会输出操作码的对应关系,这样就可以根据对应关系找到这些地址各自解释了什么操作码。
小提示:如果自己操作一遍就会发现一些更简单的办法来还原了,这样就可以自己写个脚本来快速的还原出对应的关系了。
将地址注释成真实的操作码,就会看到下图的情况(这张图跟上面的图不是同一个)

这样就得到了 伪操作码 01 对应的真实操作码 是5b,以此类推。
将其复制下来,利用脚本跑一下就得到了操作码的对应关系了。
在 加密代码的so 中 你会发现类似这种的函数非常多。基本除了几个功能函数,so中都是这种函数。
这种函数每一个都代表了一个被加固的类,就是有多个这样的函数,在app中就被加固了多个方法。
红框中就是被加固函数的代码地址,绿框中表示加固代码的长度。

一个一个的拿代码,一个小时也拿不了多少个,如果有一千多个,直接崩溃。
可以用ida的脚本来拿,如果不会写可以问问chatgpt之类的AI。
我的思路就是利用ida脚本拿到伪c代码,再将偏移和长度取出来。
拿到了被加固的代码和操作码了,但是现在还是无法还原。
第1个问题:这个加固跟360加固不一样,360是将操作码加固了,只还原操作码就行。
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!