首先解压,在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日。
原文:http://www.cnblogs.com/larrylawrence/p/3832433.html