android加固系列—2.加固前先要学会破解,调试内存值修改程序走向
【版权所有,转载请注明出处。出处:http://www.cnblogs.com/joey-hua/p/5138585.html】
因公司项目需要对app加固,经过本人数月的研究,实现了一套完整的仿第三方加固如爱加密等的加固方案(第三方加固价钱不菲,一整套针对金融app方案10~20万/年),从对原项目java源码dex文件加密在新项目中jni层解密之并替换当前进程到jni的反调试和linux对其加壳等一系列完整的方案及代码实现。在这准备做成一套教程供大家参考和互相学习指出不足之处。
因对纯java的破解过于简单所以我的加固方案是建立在jni技术的前提下,java的破解就不介绍了,apktool能反编译其源码。但用jni加密并对其加固了并不代表就万无一失了,最安全的方案就是建立在服务端不信任任何客户端发来的请求的前提下,策略是只要接口访问本身是合法的就是安全的。好了,废话不多说了,加固只是提升一个安全档次而已。
要想对自己的app加固首先得学会破解才能知道是不是真的加固成功了。这里就先介绍一下最常见的也是最强大的破解技巧——IDA动态调试:
项目jni的关键代码(项目地址见文章底部),获取当前程序的包名com.example.shelldemo和com.example.nocrack对比,正常运行结果是this app is illegal,编译jni我就不介绍了,项目中也带了编译好的so
1.工具介绍
IDA6.5,本人使用的所有IDA版本中只有这个版本能成功真机动态调试,手机系统版本为4.4及以下,需root
2.准备工作
A.传输android_server
首先找到IDA目录下的dbgsrv目录下的android_server,将其用adb推送到手机中,命令如下:
adb push android_server /data/local/tmp/
在手机上使用root explorer并赋予root权限检查手机的/data/local/tmp下是否有android_server,这个文件是连接手机和IDA调试器的工具。
B.启动android_server
分别执行以下命令
adb shell
su
chmod 777 /data/local/tmp/android_server
/data/local/tmp/android_server
C.重定向调试端口
这时启动另一个命令窗口并执行如下命令
adb forward tcp:23946 tcp:23946
23946是和IDA上设置的端口对应
3.配置IDA
首先在手机上运行项目程序,然后:
选择对应的项目程序包名
然后就会出现
直接cancel,接下来的对话框点击OK或关闭按钮都行,进入
4.选择对应的so及将要调试的函数
找到项目的so文件
双击进入后找到对应的函数名
双击进入
往下拖,拖到关键代码处,按F2设置断点,然后按F9等待下次运行至此函数
在手机上点击按钮“检测是否被crack”后进入断点,并能够单步执行,F8-step over,F7-step into,单步运行到这一行的时候
关键寄存器就是R0,观察下面一行BEQ loc_75D09ED0,意思是如果上面一行CMP比较指令的R0等于0则跳转到loc_75D09ED0,也就是running successfully那段代码,代表破解了。
那么现在来修改R0的值为0:
输入0
OK后F9看你手机显示running successfully。
注:中国象棋也在jni用了类似的判断手法,有兴趣的可以去破解玩下
【IDA工具地址】