一.必要知识
对汇编语言有所了解.我其实也没用过arm汇编,.但是因为有80x86的经验.对于arm指令看10分钟也就会了.
对android程序编写有一定了解。掌握程序加载执行流程。
对函数调用流程有所了解.因为papago主体用的是gnu c++写的,所以symbol表比较清楚。很容易对照判别。而且对于arm elf程序函数的参数传递和寻址要有一定了解才能更好的破解。有破解经验更好
二.实用工具。
本来最好是在linux下。符合android环境。但是我破解多半是windows程序……linux大半不用破解……所以这里用的都是windows工具
1.不用说 IDA PRO…大名鼎鼎。我们都用它。
2.Ultraedit。恩。还行吧。任何一个hex editor都可以。
3.Baksmali 反编译dex
4.Gdb和strace备用
5.电脑和人脑
三.破解过程
1.初步分析
由于android出来不久,相应的加密加壳程序基本不存在。所以相对来说比较方便静态反编译。但是同样。动态跟踪程序也太少。Android gdb也不支持调试没有-g编译的代码。所以主要以静态反编译破解分析为主。
加密原理,按照dopod惯例,绑定IMEI.所以从IMEI函数入手。
首先把下载的dopod navigator.apk用winrar等直接解压缩。可以看到class.dex和libpapago.so,libpapago.so高达 2M。而class.dex 不到100k。确定是以JNI为主体的结构。那么加密判断是在java中呢还是c中,还不确定。
拿出baksmali.进行分析。反编译class.dex,得到编译文件。开始分析。
Sorry。我这台电脑没有保存smali文件。就不细说了。看activity和JNI class可以看到。IMEI是由java获取。 (BTW..那个函数居然叫JNIGetIMEI,我还以为是java从JNI得到IMEI。纳闷半天,还以为papago这么厉害能从native c或得IMEI,后来才发现是java从telephony类获取IME保存到C中),找遍了整个class.dex,再也没发现任何IMEI相关的判断。所以。基本判断主体是在libpapago中。
2.跟踪分析
拿出大杀器IDA,用5.4demo就可以了。demo版就支持arm elf. 打开libpapago.so. 选择arm和 unix dynamic library.
在function中寻找关于imei的函数,可以看到sys_getimei等几个函数。跟踪朔源。可以找到CRigisterProcess::DoProcess.正好里面有个判断 BNE XXXX,,拿出ultraedit改为BXXXX .push到模拟器中运行.成功.
实际上破解并没有这么简单,.分析过程占了很大一部分.其中用了strace跟踪系统调用,IDA 静态反编译人工过滤分析也花了很多时间.因为对arm不是很熟悉.不过还好.所谓万变不离其宗.比如arm中c函数多用r0-r3 传值.用r0返回多多注意些值,就可以方便的分析.也多亏了arm.不用慢慢去分析堆栈传值了…
希望对大家有所借鉴.
转自:http://asdf314159265.iteye.com/blog/1276629