追逐本源,放弃浮华
EarthWorm

Termite

Friends

RSS

借力打力-smali代码窃取

08 May 2015 TAGS : [ 技术相关 android-smali ]

起因

这两天在分析一个apk样本,在分析中遇到了一个硬编码密文字符串的情况。 下图就是样本中的一个硬编码密文:
rootkiter.com

其对应的解码函数为:
rootkiter.com

要想确定上面的硬编码字符串经isInstallation这个函数还原后的原始结果,有三种思路:

1.动态调试,调试到解密位置,看寄存器的结果。
2.重打包,在解密后的位置加段打日志的代码,然后重打包运行,就能在日志中看到解密结果了。
3.代码窃取,它的主体思路是:将解密函数(isInstallation)的smali代码抠出来,然后我们自己写一段代码去掉用这个解密函数。

其实头两种是比较常见的做法,可惜这个样本有反调试机制,而且dex文件中有一段代码又是通过so文件动态还原的,导致头两种方法都很难有效。于是只能用最后一种方法。

操作步骤

首先按照isInstallation的定义格式(这里方法定义为公有或者私有不用较真,能调用就行),写一个段java框架代码,如下所示:
rootkiter.com

保存运行,试一下这段代码是否有错误: rootkiter.com

将字节码文件(.class)转化成dex文件,命令为:

$ dx --dex --output=classes.dex HelloWorld.class

rootkiter.com

再将dex文件反编译成 smali文件,命令为:

$ java -jar baksmali.jar -o aaa/ classes.dex

rootkiter.com

去样本中将isInstallation反编译的代码结果覆盖到 aaa/HelloWorld.smali 的相应代码中:

rootkiter.com

保存退出后,将这个smali代码编译为dex文件,命令为:

$ java -jar smali.jar -o classes.dex aaa/HelloWorld.smali

rootkiter.com

此时将生成的dex文件上传到手机等待调用。
rootkiter.com
最后将要解密的字符串传到这个程序中就能解密对应字符串了,命令如下所示:

\# dalvikvm -cp /data/local/HelloWorld.zip HelloWorld Q=6/pbCypY64tfHs8UFBpZfETzsr

rootkiter.com

这时输出的 “contact_id = ” 就是 ”Q=6/pbCypY64tfHs8UFBpZfETzsr” 这个字符串解密的结果了。

TAGS : [ 技术相关 android-smali ]