美文网首页
8.动态调试笔记--调试so

8.动态调试笔记--调试so

作者: 普通的程序员 | 来源:发表于2018-02-10 11:16 被阅读0次

    以阿里移动安全挑战赛2015年第二题为调试样本
    样本是有点久远,但是足够一窥动态调试so的门道。

    先上参考连接,有一些概念性的东西这两篇写的很详细,比如下断时机,为什么在那里下断,反调思路是什么。
    原创]-------------IDA调试 android so文件的10个技巧
    https://bbs.pediy.com/thread-221876.htm

    1.android逆向之旅-动态方式破解apk进阶篇ida调试so源码

    2.阿里移动安全挑战赛第二题writeup

    0.准备工作
    首先必须有一台root过的手机,且把ida的android_server文件放到手机/data目录下,修改其执行权限。
    这里可能会遇到android_server和ida 目标api不符的提示,所以建议是用android 4.4的手机,且Android_server文件是从你使用的ida文件里拿出来的。

    1.下断
    姑且认为你已经阅读了上述两篇文章,知道该demo是有反调试的,所以我们需要先静态分析so,在so里下断。
    1-1在jni_onLoad下断


    ida的左边方法区ctrl+f搜索jni_load

    1-2在native方法下断


    很好找,java_开头
    1-3设置ida的debug options
    勾选on library load

    2.执行Android_server,供ida 附加一个调试进程
    依次执行adb shell ,su,cd data,./android_server
    打开ida调试监听

    image.png
    执行
    adb forward tcp:23946 tcp:23946
    端口转发

    3.打开ida 进行动态调试
    3-1执行adb shell am start -D -n com.yaotong.crackme/.MainActivity
    唤起样本,使其等待一个调试器
    3-2 ida-debugger-attach to process,找到我们的demo 包名

    17233就是pid

    3-3 执行adb forward tcp:8700 jdwp:17233
    端口打通(ddms去做也行,目的都是一样的)

    3-4 点ok之后就进入动态调试

    此时会卡在libc.so

    3-5 执行jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700恢复运行状态

    正常会显示已经捕获
    其余报错,software refused connected,先更改app的清单debuggable值为true,重打包签名再重来一遍步骤。
    connection refused ,就操作一遍3-3.

    3-6 在ida按f9


    点same

    然后进入到linker

    3-7再按f9运行,会进入我们jni_onLoad断点

    4分析代码
    f8单步运行

    4-1 nop反调试代码


    我这里是已经修改过的so

    如果想去看方法,f7进入方法,想看源码的,在BLX R7那里按f5,ida会反编译源码

    根据地址找到so对应的值,在静态调试so,G快捷键 。
    修改为0.保存修改,重新打包一份apk,重签名,从头跑一遍。反调试代码就被干掉了。

    4-2 找native方法
    反调试之后,输入密码,继续f9运行,会断在我们的native方法里


    image.png

    根据大家的经验总结,去寻找CMP指令,查看寄存器的值,总会有一个地方值做判断,然后返回结果。
    那么做判断的地方,就是正确密码的出现地。
    双击可查看寄存器的值


    查看到我的输入值

    至此,动态调试so结束

    相关文章

      网友评论

          本文标题:8.动态调试笔记--调试so

          本文链接:https://www.haomeiwen.com/subject/rhsctftx.html