聚合Vip网络社区 集合 HK共享吧 合购VIP等精品教程

 找回密码
 立即注册

QQ登录

只需一步,快速开始

关闭
聚合Vip社区
欢迎QQ或来电咨询
工作时间:周一至周五
AM9:00-PM22:00
淘宝店铺 淘宝皇冠店铺
论坛邀请码
查看: 6822|回复: 34

Android逆向之动态调试总结

[复制链接]

4

主题

0

听众

74

积分

注册会员

Rank: 2

  • TA的每日心情
    无聊
    2015-1-17 09:16
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2015-3-2 11:04:45 |显示全部楼层

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    立即注册 已有账号?点击登录 或者 用QQ帐号登录

    x
    免责声明:以下资源由聚合VIP资源网整理提供,本资源来源于网络仅供用户学习交流之用,版权归资源方所有,本网站不承担任何法律风险,请自觉在下载学习后24小时内删除,不得用作商业用途;如果喜欢请购买正版资源。谢谢 本帖最后由 Thend 于 2014-9-26 10:34 编辑

    一、在SO中关键函数上下断点

    刚学逆向调试时。大多都满足于在SO中某关键函数上下断点。然后通过操作应用程序,去触发这个断点,然后进行调试


    详细的步骤可以参见非虫大大的《Android软件安全与逆向分析》


    简单说:在libsyclover.so文件中有一个函数jnicall1。每次单击按钮的时候,便会调用此函数。



    1.静态载入此so文件,找到函数的偏移地址为:0x132C

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    2.执行android_server3.端口转发

    adb forward tcp:23946 tcp:23946

    4.运行程序

    5.IDA附加

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    然后会弹出

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    点击OK之后,在弹出的列表框中选择需要附加的进程即可

    6.下断点


    附加完成之后,会停在libc.so这个模块中。此时按下Ctrl + S,弹出模块列表框,搜索so文件名。

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    记录下基地址:0×76072000 (RX权限)
    和静态分析时得到的偏移地址0x132C相加得到0x7607332C
    G跳转到此位置

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    F2下好断点!

    7.触发断点


    下好断点,便F9执行,此时状态是runing
    此时,去应用中单击按钮,程序便会断在刚刚下好的断点处~

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    ok~ 这种调试方法局限性很大,适合于比较初级的调试。这种调试手法在现在已经满足不了需求了。


    二、在JNI_OnLoad函数上下断点

    JNI_OnLoad函数大概功能就是在程序加载so的时候,会执行JNI_OnLoad函数,做一系列的准备工作。
    很多时候,程序猿们会将一些重要信息放在此函数中,而不是通过某种事件来重复触发。包括说将反调试函数放置在此函数中。因此,调试手段发生了改变,上述调试方法基本上被淘汰。

    1.静态分析,找到JNI_OnLoad函数的偏移:0×1504

    Android逆向之动态调试总结

    Android逆向之动态调试总结




    2.执行android_server3.端口转发

    adb forward tcp:23946 tcp:23946

    4.以调试模式启动程序

    adb shell am start -D -n com.example.mytestcm/.MainActivity
    此时,手机界面会出现Waiting For Debugger页面


    5.打开ddms或者Eclipse (必要,为了使用jdb命令)

    6.IDA附加

    7.设置调试选项

    Debugger — Debugger Options

    Android逆向之动态调试总结

    Android逆向之动态调试总结




    8.F9运行程序

    IDA中,F9运行程序,此时是runing状态。
    在命令行中执行:jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700其中port=8700是从ddms中看到的。

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    此时程序会断下来

    Android逆向之动态调试总结

    Android逆向之动态调试总结




    9.下断点

    Ctrl + S 然后搜索到so文件名

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    记录下基地址是:0×76118000
    加上JNI_OnLoad函数的偏移地址0×1504为0×76119504
    G跳转到0×76119504,下断点

    Android逆向之动态调试总结

    Android逆向之动态调试总结




    A.触发断点

    下好断点之后,直接F9运行吧,就能断在JNI_OnLoad函数处~

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    当这种调试手法出现之后,将特殊函数,或者反调试函数放在JNI_OnLoad中也不是那么的安全了。此时,程序猿们通过分析系统对SO文件的加载链接过程发现,JNI_OnLoad函数并不是最开始执行的。在JNI_OnLoad函数执行之前,还会执行init段和init_array中的一系列函数。
    因此,现在的调试方法,都是将断点下在init_array中~
    至于下断点的方法,可以类比于在JNI_OnLoad中下断点的方法,在init_array的函数中下断点。还有一种方法便是通过在linker模块中,通过对其中函数下断点,然后也能单步到init_array中
    下面便详细介绍下如何给任意系统函数下断点

    三、给任意系统函数下断点

    1.需要准备的有:
    与你调试环境一致的系统源码,这个也可以在http://androidxref.com/网站上在线查阅。
    root之后的手机,方便将系统的一些so文件dump至本地,静态获取到系统函数的偏移地址


    2.流程
    执行android_server
    端口转发 adb forward tcp:23946 tcp:23946
    调试模式启动程序 adb shell am start -D -n 包名/类名
    IDA附加
    静态找到目标函数对应所在模块的偏移地址
    Ctrl+S找到对应模块的基地址,两个地址相加得到最终地址
    G跳转至地址,然后下断
    F9运行
    执行jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
    断下,进行调试


    四、在dvmDexFileOpenPartial函数下断点,dump出明文dex


    发展至今,从去年到现在,apk的加解密发展非常迅速。国内出现了很多针对apk的加壳保护方案。主要也体现在对dex的保护和对so的保护!
    针对dex的保护,很长一段时间,都能通过对dvmDexFileOpenPartial函数下断点,从而dump出明文dex文件。

    以这次alictf的第三题为例子,展示下如何对dvmDexFileOpenPartial函数下断点!
    其他步骤都是一样的,这儿主要说下如何找到dvmDexFileOpenPartial函数位置
    1.查看源码


    dvmDexFileOpenPartial函数在rewriteDex这个函数中被调用。

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    可以看到关键字符串信息是:Unable to create DexFile
    此时,从手机的/system/lib目录下得到libdvm.so


    2. 载入IDA,搜索字符串:Unable to create DexFile


    Android逆向之动态调试总结

    Android逆向之动态调试总结



    得到偏移地址是:0x0005AE8A

    3.下断点


    搜索模块libdvm.so

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    基地址是0×41492000
    加上偏移地址为0x414ECE8A
    G跳转至此位置,下好断点,即可


    4.dump明文dex文件


    下好断点之后,F9运行,执行jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
    程序断下

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    此时,看到寄存器窗口中的值为:

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    R0保存dex的起始地址,R1便是dex的长度

    Android逆向之动态调试总结

    Android逆向之动态调试总结



    直接dump即可!

    5.后续


    dump出来的dex就可以进行反编。
    效果如下:

    Android逆向之动态调试总结

    Android逆向之动态调试总结





    五、写在最后


    随着现在技术的发展,对apk的保护是越来越好!大大增加了逆向分析人员的分析难度。同时,在整个攻防的过程中,对攻防两端的人都带来了非常棒体验。双方都取得了长足的进步!
    也促使了整个加固方向水平的提升!
    其中,动态调试手法在整个过程中是必不可少的。
    回复

    使用道具 举报

    29

    主题

    0

    听众

    557

    积分

    高级会员

    Rank: 4

    该用户从未签到

    发表于 2015-3-2 11:09:35 |显示全部楼层
    感谢LZ分享 学习笔记:
    1、adb forward tcp:xxx tcp:yyy 端口转发 xxx -> yyy
    2、IDA动态调试 F2:下断点 F9:运行 Ctrl+S:模块列表框 G:跳到对应地址
    3、调试模式启动程序 am start -n {包(package)名}/{包名}.{活动(activity)名称}
    4、JDB JAVA下的一个命令行调试工具:run cont step step up next locals list print dump variablename
    5、dvmDexFileOpenPartial 断点DUMP出DEX文件 scanf string[Unable to create DexFile]
    回复

    使用道具 举报

    23

    主题

    0

    听众

    576

    积分

    高级会员

    Rank: 4

    该用户从未签到

    发表于 2015-3-2 11:15:27 |显示全部楼层
    楼主好厉害!!!!!
    回复

    使用道具 举报

    17

    主题

    0

    听众

    476

    积分

    中级会员

    Rank: 3Rank: 3

    该用户从未签到

    发表于 2015-3-2 11:17:33 |显示全部楼层
    认真学习一下,谢谢分享
    回复

    使用道具 举报

    12

    主题

    0

    听众

    481

    积分

    中级会员

    Rank: 3Rank: 3

    该用户从未签到

    发表于 2015-3-2 11:17:53 |显示全部楼层
    前排支持,很详细的资料,妹纸,我顶你!辛苦了!
    回复

    使用道具 举报

    6

    主题

    0

    听众

    175

    积分

    注册会员

    Rank: 2

    该用户从未签到

    发表于 2015-3-2 11:19:42 |显示全部楼层
    厉害.我只能膜拜了..阿门..
    回复

    使用道具 举报

    16

    主题

    1

    听众

    649

    积分

    高级会员

    Rank: 4

    该用户从未签到

    发表于 2015-3-2 11:22:36 |显示全部楼层
    非常好的文章!只是图片看不到,一直在转,编辑下吧。精华是没问题的。
    回复

    使用道具 举报

    16

    主题

    0

    听众

    475

    积分

    中级会员

    Rank: 3Rank: 3

    该用户从未签到

    发表于 2015-3-2 11:24:51 |显示全部楼层
    小试锋芒 发表于 2014-9-26 08:20
    非常好的文章!只是图片看不到,一直在转,编辑下吧。精华是没问题的。

    =。=   果然图片显示不出来。。。  我重新编辑一下
    回复

    使用道具 举报

    12

    主题

    0

    听众

    556

    积分

    高级会员

    Rank: 4

    该用户从未签到

    发表于 2015-3-2 11:30:00 |显示全部楼层
    Thend 发表于 2014-9-26 10:04
    =。=   果然图片显示不出来。。。  我重新编辑一下

    另外一篇文章上面的,也没显示出来。
    其实,我是看另外一张上面的,你提到的老师傅的图,感觉应该是认识他。
    回复

    使用道具 举报

    11

    主题

    0

    听众

    443

    积分

    中级会员

    Rank: 3Rank: 3

    该用户从未签到

    发表于 2015-3-2 11:30:42 |显示全部楼层
    学习了,支持一下~
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    回帖奖励

    [详情]

  • * 每天自己主题被回复3次可获得额外2金钱奖励。
  • * 每天回复他人主题5次可获得额外3贡献的奖励。
  • * 奖励每天都可领取,一定要多参与论坛讨论哦。
  • * 同一主题的重复回复不计。
  • 手机版|Archiver|聚合Vip网络社区 ( 鲁ICP备14030129号-2 )Discuz超级管家   

    GMT+8, 2018-5-26 23:59 , Processed in 0.369937 second(s), 65 queries .

    Powered by Discuz! X2.5

    © 2001-2012 Comsenz Inc. Template by A3cn

    回顶部