首页 > 代码库 > 记大神的一次反汇编

记大神的一次反汇编

首先解压,在assets文件夹下在找到了要汇编的文件:appmgr.jar,这个文件在安装后在/data/data/<package name>/files/文件夹下会生成一个appmgr.apk,

其实只是一个存放代码的资源文件,安装的时候重命名了,以apk结尾罢了。

解压这个jar文件,得到classes.dex,拖到IDA Pro 6.1以上版本里面去,可以识别成Android的dex文件。

鉴于要找signature_md5的算法,用alt+t查找「signature_md5」字符串,找到:

CODE:0001ACCE                 const-string/jumbo              v1, aSignature_md5 # "signature_md5"//定义一个aSignature_md5字符串,放到v1寄存器 
//Dalvik指令集看这里

接下来对v1做了这些事情:

从JSON里拿到一个键值对放到v2,v1里;

move-result-object,把数据放回v1里;

check-cast,转换成String格式;

定义逗号,放到v8里;//为什么会有逗号出现?

用v8里的逗号,调用String的split方法 split v1,注意split返回的是分割后的数组

把split之后的数组放到v11里;

下面就不太重要了因为定义了Edition_brief这个变量,下面追踪v11:

array-length开始,把v11的数组长度放到v9里去;

下面if-ge, greater or equal,v2>=v9就跳转到loc_1AD72,注意v2上面定义了是0;就是如果长度等于零则跳转,注意这个v9是JSON里拿到的字符串分割成数组的长度;

if-nez,not equal zero,v8!=0就跳转到loc_1AD72,注意上面刚定义v8等于0,这里有些迷糊;

下一句从packageInfo_signatures得到签名放到v13,v10;

 

注意Arrays.toString(ref);和xx.toString();是不同的。

xx.toString();输出的东西是[@XXXXX一串,而且好像每次都不一样,大神猜测是地址,网上有人说是HASH。

数值数组是不能够整体输出的,

你可以使用循环输出
for(i=0;i<10;i++)
System.out.println(a[i]+" ");

而借助Arrays.toString(a)就节省了上面的循环步骤,而一步输出(当然,调用函数的内部进行了处理)。

然后注意v13中存储了v13,v13又给了v23,v23经过一系列转换格式,最后用一个ad.a(ref)得到了signature_md5;

然后倒数第三行,v11和v2给了v24;

v23和v24比较,亦即PackageInfo_signatures经过ad.a(ref)后,与JSON中的MD5比较。

到此可以看到要找的函数就是ad.a(byte [] x );

此时用dex2jar把dex反编译成jar,放到jd-gui里,找到ad.a():

TIP:昨天才发现函数名冒号后面的代表返回类型。a这个函数里是这样的:

可是循着w.f()找过去发现没有getMD5()。

大神提议用Notepad++的搜索文件中的字符串功能搜索360 apk整个文件反编译出的smali,不知道他怎么想到的。

找到了。下面就是追踪混淆代码了,需要极大的耐心。

evt.c(),然后找到evg.b(),

找到eua.d();本来在eua里找这个a(paramArrayOfByte)怎么也找不到,转念一想才想起来应该在b所在的函数evg里找!

最后找到了。

 

这个真需要很大耐心。我的话恐怕某一步早就放弃了,因为难以接受弄了半天弄不出的结果。大神牛B。

2014年8月7日。