第一个android cm调试分析

0x00:写在前面

一直想入门Android安全,当时是极客大挑战出题的时候,被cx表哥甩锅强行去学了点android的开发,之后慢慢接触,感觉还是挺有意思的。cx表哥说先从逆向分析入门吧,之后可以搞加固/漏洞方向。
这篇文章是在学习蒸米的文章七武器的一个记录。

0x01:

 这次记录的是2014阿里移动挑战赛里的一个简单的cm的分析,主要是native层的调试和对简单反调试的bypass。
因为原来自用的三星放家里了,就只能使用模拟器来搞了,坑还是不少。

  • 本来我是想用Genymotion的,但是这个模拟器是x86构架,IDA的调试的server并没有支持的,只能用Android Studio自带的模拟器。
  • 使用模拟器调试so里的代码时有问题(后面会提到)

对于我这样的新手,我一般会把apk拖进jeb直接分析看看,这个apk的验证是在so中做的验证,所以使用IDA对so做初步的分析。

0x02:

找到验证的函数


根据以前搞pc端的经验,下一步直接起调试器,对这个函数下断点,单步跟就好了。但是这个程序在IDA attach上之后程序就退出了,需要对JNI_Onload()函数进行调试分析。
根据蒸米的文章,步骤如下
首先是上传IDA的server到模拟器中,这里我遇到了一个问题

提示只读,对应的解决方法是

1
2
root@generic:/ # umount /
root@generic:/ # mount -o remount rw /

之后再上传运行就可以啦。
然后,需要端口转发 adb forward tcp:23946 tcp:23946一般IDA去attach的时候这个函数早就执行过了,所以需要调试JNI_Onload();因为需要用到jdb,所以需要打开ddms。
之后再使用adb以调试的模式启动程序adb shell am start -D -n com.yaotong.crackme/.MainActivity


IDA里attach


设置调试选项后F9


此时使用jdb工具恢复程序jdb.exe -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
然后对含有验证算法的so的JNI_Onload()方法下断点,F9,就断下来了。

0x03:

使用IDA调试方便在于,使用P将代码块识别成函数后,可以直接F5。单步执行到


之后,就跑飞了,应该是有反调试,F7进去看看是什么反调试。


应该是创建子进程去检测有没有调试器了。 so中的反调试策略应该和linux那些差不多,这个so中的检测方式是,打开/proc/[pid]/status文件,检测tracerpid的值是不是0。
那么对应的策略有两种,要么调试的时候动态改寄存器,或者改跳;或者一劳永逸,直接patch掉这个so。在分析了这个so反调试所在的函数后,我选择后种方案

死循环调用来检测调试,还是patch来的方便些。

  • 在调试的时候我遇到这样一个问题,F7/F8都没法执行下去。

  • 问了cx表哥后,表哥说这是模拟器才有的问题…在出问题的代码上下断,然后F9过去就好了。
    这样的确可以解决问题,但是在调试的时候遇到好几次这样的问题,每次遇到了都要全部重新来过,太麻烦了,还是真机调试好QAQ

0x04:

patch这个so的时候,蒸米使用的那个IDA的插件我没找到,所以我选择反编译这个apk,然后修改了so文件后,重打包签名弄回去 =。=

修改0x16B8处的指令就好了,这里采用蒸米的方案,使用movs r0,r0作为NOP指令。
修改后使用apktools打包回去,再使用签名工具签名就好了。再次安装已经patch好的apk,重复之前调试的步骤,这次对Java_com_yaotong_crackme_MainActivity_securityCheck方法下断点,
回到模拟器里随便输入点什么,按下输入密码按钮,IDA里就断下来了,就可以愉快的单步调试了。

双开IDA可以辅助分析,这个地方就是加密的字符串所在的地址

点进去之后查看

再查看这个地址

aiyou,bucuoo
这应该就是flag了

0x04:

 第一次调试native层的东西,还是学到了不少,也遇到了这样那样的小问题,不过还是完成了。

0x05:参考

安卓动态调试七种武器之孔雀翎 – Ida Pro