码迷,mamicode.com
首页 > 移动开发 > 详细

Android--native层so文件调试

时间:2016-08-13 22:45:10      阅读:1021      评论:0      收藏:0      [点我收藏+]

标签:

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:

  参考

  Android动态调试Ida Pro

Android--native层so文件调试

标签:

原文地址:http://www.cnblogs.com/7top/p/5768880.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!