标签:
Android之so文件调试分析
0x00:前言
在做这道题之前发现有学长之前做过,所以理了下思路准备写写过程。毕竟我是新手,所以写得很啰嗦,其中遇到的很多细节问题困扰了我很久,也是希望通过这些让想入Android的朋友少跳点坑,还望不吝指正。
这道题是在阿里挑战赛上扒下来的,调试过程中遇到了不少的坑(毕竟第一次调=_=)。本来打算用真机调试,但是后面的步骤中有因为手机ROM的问题必须得刷机,所以还是用的模拟器来调。
0x01:
这个CM主要是调试native层和patch so的使用。
安装apk进去是这样的:
目标就是破解密码。
一般思路是先看看java层,然而反编译一看:
丝毫没有破解的地方,所以只好考虑native层,调试so文件。
将反编译后的libcrackme.so丢进IDA里可以看到验证函数:
接着尝试IDA attach这个so文件,但是attach上程序就退出了,所以就对下面的JNI_Onload()这个加载数据函数进行分析。
0x02:
首先打开ddms,不打开的话调试端口是关闭的,后面没法使用jdb。
!注意,这里有个坑是:最好先cmd 然后netstat –ano | find “8700”是否被占用,否则后续的调试时无法进行的。
只有占用端口8700的程序为javaw时候才正常。
小tips:IDA中android_server一般有两个,一种是支持Android5.0以上的(字符短些),还有一种是Android5.0以下的(字符长一点)。
我这里为了方便把要用的android_server改了个名字
接着把IDA的androidserver push到模拟器上,并且用root身份进行。
接下来是端口转发 adb forward tcp:23946 tcp:23946
然后以debug模式启动程序。这里同样有个坑,要重新开个cmd来执行端口转发和debug启动,否则会出错。
然后看模拟器上程序会显示waiting for debugger的调试界面。
然后IDA attach
注意:attach的时候要先设置下
attach
然后调试选项(注意:一定要打上这个勾)
接下来一定要在IDA里面点击运行(这里我不知道所以重做了好多次- -!)
使用jdb恢复程序
jdb –connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
然后在JNI_Onload下断点
0x03:
IDA中按p键后会将代码块作为函数分析,再F5
发现是个死循环调试,参考了下so调试遇到死循环如何调试的方法比较后,选择patch so的方式比较方便。
tips:这里选择patch so的原因是在之前的IDA中存在一个android_log_print()函数
每次运行的时候固定输出了I/yaotong (XXX): SecurityCheck Started...所以通过patch so修改打印的内容,
可以直接利用这个android_log_print函数来比较输出正确的值。
当然也可以通过调试分析出上述的sub_130C()函数是用来反调试检测的(即IDA attach就退出程序),nop掉这个函数就可以正常调试了。
0x04:
因为arm架构没有单独的nop指令,所以采用蒸米所说的movs r0,r0的方法,
对应的机器码为00 00 A0 E1
来到sub_130C()的位置,将 13 FF FF EB 改为上述指令即可nop掉这个函数
再F5一看,发现已经成功nop掉
然后保存so文件,再覆盖掉原来的so文件,再重新签名。
这次attach没有退出就表明patch so成功了,然后在验证函数
Java_com_yaotong_crackme_MainActivity_securityCheck下断点。
然后在app上输入密码,就会定位到这个点
F5进去可以看到这里应该就是加密的字符串所在的地址
点进去按D转为指针模式再看这个地址
aiyou,bucuoo应该就是flag了
0x05:
测试一下
破解成功!
0x06:
以前接触的都是java层的东西,一般都是找核心验证函数写个注册机就ok了。第一次调试native层让我学到了很多东西,同时领会到了IDA的强大。虽然过程中有很多坑,有时候都不知道怎么查,但是坚持下来还是完成了,为以后调试so文件打下了基础。
0x07:
参考
标签:
原文地址:http://www.cnblogs.com/7top/p/5768880.html