起因
这两天在分析一个apk样本,在分析中遇到了一个硬编码密文字符串的情况。
下图就是样本中的一个硬编码密文:
其对应的解码函数为:
要想确定上面的硬编码字符串经isInstallation这个函数还原后的原始结果,有三种思路:
1.动态调试,调试到解密位置,看寄存器的结果。
2.重打包,在解密后的位置加段打日志的代码,然后重打包运行,就能在日志中看到解密结果了。
3.代码窃取,它的主体思路是:将解密函数(isInstallation)的smali代码抠出来,然后我们自己写一段代码去掉用这个解密函数。
其实头两种是比较常见的做法,可惜这个样本有反调试机制,而且dex文件中有一段代码又是通过so文件动态还原的,导致头两种方法都很难有效。于是只能用最后一种方法。
操作步骤
首先按照isInstallation的定义格式(这里方法定义为公有或者私有不用较真,能调用就行),写一个段java框架代码,如下所示:
保存运行,试一下这段代码是否有错误:
将字节码文件(.class)转化成dex文件,命令为:
再将dex文件反编译成 smali文件,命令为:
去样本中将isInstallation反编译的代码结果覆盖到 aaa/HelloWorld.smali 的相应代码中:
保存退出后,将这个smali代码编译为dex文件,命令为:
此时将生成的dex文件上传到手机等待调用。
最后将要解密的字符串传到这个程序中就能解密对应字符串了,命令如下所示:
这时输出的 “contact_id = ” 就是 ”Q=6/pbCypY64tfHs8UFBpZfETzsr” 这个字符串解密的结果了。