目前只是删除了demo版本提示框,去除了demo版本无法使用保存功能的限制。之前没有逆向破解过基于JVM的应用,这里记录下使用的工具和方法。本文仅用于学习交流。
jdk 1.8
XXB demo-3.11.1
arthas 3.1.7
jd-cli 1.0.1.Final
第一次运行demo,需要生成key才能使用。由于是demo版本,因此每次运行都会弹出demo版本限制提示窗口:
让界面停留在此,用arthas attach到运行的demo上,通过查看函数调用栈找到弹这个窗口的函数:
查看所有线程:
界面一般是运行在主线程中,这里查看main线程的函数调用栈:
从打印出的函数调用栈中,我看到了可能的弹窗函数,使用jad反编译这个class,分析其代码:
好像是这个函数显示的弹窗,为了确认,再分析这个函数的调用者:
看到这些就确定是这个函数了,只需要删除相关的代码就可以去除弹窗,删除后重新编译:
可以使用redefine命令直接热patch上去查看修改后的效果,但这个函数由于调用时机在我们attach之前,因此这里不好用这种方式,可以采用javaagent的方式,下面再写。
接下来分析保存功能的限制,打开一个apk,再点击save,会出现限制功能提示框:
与上面的方法相同我们如法炮制:
找到了可能的函数,反编译看看:
发现调用了另外一个像是判断注册码的函数,反编译看看:
这个文件里面有很多通过build_type判断的函数,这次只是初尝试,因此这里我改的面比较小,我只是改了一个full build函数的返回值,改成了true,之后再重新编译后,热patch上去:
看看效果:
好的,可以了。
这里我使用javaagent替换目标class字节码的方式来patch这两处函数,处理过程就是匹配目标class的名字,然后返回patch后的字节码,替换的字节码就是实验过程中热补丁验证过的。这里我把字节码转换为base64编码然后写死到代码里了。代码如下:
运行命令再修改一下:
最后效果就如我所想,没有了demo弹窗和save功能限制。最后附的javaagent,如果你想看看最后完整的代码可以逆向这个jar包看看。