• IDA动态调试技术及Dump内存


    IDA动态调试技术及Dump内存

    来源 https://blog.csdn.net/u010019468/article/details/78491815

    最近研究SO文件调试和dump内存时,为了完整IDA调试起来,前后摸索了3天才成功,里面有很多坑和细节,稍微不注意,就一直排行,需要理解每步骤的作用意义,否则就会觉得教程不对,要详细的教程可能找不到,大部分都是简单介绍,没有提醒细节和易忽视的点

    动态调试步骤,顺序严格如下

    事先准备工作 
    1、要求root手机或者直接用模拟器 
    否则没有权限启动android_server 
    2、IDA在6.6以上版本 或者手机为5.0以下 否则会出现 pie异常:

     error: only position independent executables (PIE) are supported.
    • 1

    细步骤如下::

    1、首先把IDA安装目录下的android_server文件通过adb push 命令push到手机/data/local/tmp/目录下,并通过root权限身份运行./android_server

    C:WindowsSystem32>adb shell
    shell@HWGRA:/ $ cd /data/local/tmp/
    shell@HWGRA:/data/local/tmp $ ./android_server
    IDA Android 32-bit remote debug server(ST) v1.19. Hex-Rays (c) 2004-2015
    • 1
    • 2
    • 3
    • 4

    2、通过adb forward命令把端口转cp端IDA的监听应用端口号 
    adb forward tcp:23946 tcp:23946 

    3、通过adb shell am start -D -n com.exaple.cctf/.MainActivity 命令打开应用的调试模式

    4、打开IDA进行attach

    是32-bit的debug server,于是将IDA换成32位的。注意,调试32位的程序得用IDA的32位版,64位的程序用64位版。不然会出错。如下:

     Incompatible IDA version  以及ida报不识别host
    • 1

    通过运行android_server之后 显示的位数来判断是32位还是64,如下:

    IDA Android 32-bit remote debug server(ST) v1.19. Hex-Rays (c) 2004-2015 

    5、启动IDA之后并attach了调试进程,设置了Debugger Options 使能在so加载调试下停住。重点再是让进程运行起来之后,再用jdb连接手机虚拟机,否则连不起来,会阻塞,会无法添加到vm,顺序很重要。

    6、jdb连接,使进入调试模式 
    jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

    可能会存在阻塞或者显示无法添加到vm等错误:阻塞可能是因为没有把ida运行起来app_process 
    后者错误就可能是apk没有配置到调试模式。 
    成功之后,ida会再次挂起,继续按钮恢复成可以点击状态。

    7、设置断点,再继续运行,便会停在断点处。

    相关adb 命令收集 
    1、adb shell pm list packages 获取手机包名列表 
    2、adb shell dumpsys package [name] 获取安装包的信息 查看是否可以debugable

        flags=[ DEBUGGABLE HAS_CODE ALLOW_CLEAR_USER_DATA TEST_ONLY ALLOW_BACKUP STO
    PPED ]
    • 1
    • 2

    flags中还有debuggable

    3、adb forward tcp:23946 tcp:23946 把手机中的android_server的端口号转发到cp应用Ida端口

    4、android list adv 列出adv虚拟机列表 
    5、emulator -adv [name] 启动某个名为name的虚拟机 
    6、当有时候adb链接失败时 
    ,通过重启来链接adb 
    adb kill-server 杀死adb进程, 
    adb start-server 
    7、adb shell am start -D -n [package/MainActivity.class路径] 调试模式启动应用

    相关Adb命令文章和介绍 
    Android ADB 常用命令 
    Android adb你真的会用吗?

    Dump内存

    一种是直接调试时候断点到libdvm.so加载dex时候,找到在内存中的起始点r0和大小r1,然后通过ida运行脚本:

    static main(void)
    {
      auto fp, begin, end, dexbyte;
      fp = fopen("C:\dump.dex", "wb");
      begin = r0;
      end = r0 + r1;
      for ( dexbyte = begin; dexbyte < end; dexbyte ++ )
          fputc(Byte(dexbyte), fp);
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    把内存这块连续地址内容dump出来,这种只能dump安装运行时apk中classes.dex,不方便dump多次dex加载或动态加载时定位到起始地址

    第二种直接运行apk之后通过首先通过cat /proc/[pid]/maps查看目标dex文件所在的内存地址,这样就可以查找所有加载过的dex内存映射地址,不论是在什么时候加载的,只要运行了,就必会在内存中找到相应的映射地址:

    方法步骤:通过adb shell 之后,ps查找相关进程的pid 然后再cat 找出maps映射内存地址

    4b92f000-4bce7000 r--p 00000000 1f:01 567        /data/dalvik-cache/data@app@com
    .example.xianwang_danji-1.apk@classes.dex
    4bce7000-4bd38000 rw-p 00000000 00:07 1746       /dev/ashmem/dalvik-aux-structur
    e (deleted)
    4bd38000-4bd3f000 r-xp 00000000 1f:01 519        /data/data/com.example.xianwang
    _danji/lib/libme_xxx.so
    4bd3f000-4bd40000 r--p 00006000 1f:01 519        /data/data/com.example.xianwang
    _danji/lib/libme_xxx.so
    4bd40000-4bd61000 rw-p 00007000 1f:01 519        /data/data/com.example.xianwang
    _danji/lib/libme_xxx.so
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    可以发现所有加载到内存中连续的地址块,以及出处,就很方便定位自己要dump的内容了,找到相关地址4b92f000-4bce7000直接通过上述script command执行dump相关内容出来。就用ida通过上述步骤附加到手机应用即可,然后通过脚本生成文件。

    对于dump出来的文件是odex直接打开看不够清晰,如用GDA工具打开里面都是类似汇编语言。这时就需要用到baksmali.jar 和smali.jar来转换成dex文件,可以直接方便查阅。详见我的另一篇文章《手机dump内存Odex格式反编译

    当然这只是最简单脱壳方法,很多高级壳会动态修改dex的结构体,比如将codeoffset指向内存中的其他地址,这样的话你dump出来的dex文件其实是不完整的,因为代码段保存在了内存中的其他位置。那么针对这种反调试情况下以及其他阻碍动态调试下,dump内容和ida调试都很难进行下去,看到网上有这样的文章:利用开源脱壳工具DexExtractor来脱壳。它的原理就是修改系统的DexFile.cpp源码,在解析dex的函数开头处加上自己的dumpdex逻辑。 这样不论怎么绕,只要加载了dex就可以dump出来,可以研究下,传送门:http://blog.csdn.net/jiangwei0910410003/article/details/54409957

    相关文章: 
    IDA附加调试apk程序,并修改内存,编写IDA脚本程序,把修改后的dex文件dump到本地

    IDA远程调试 在内存中dump Dex文件

    Android逆向之旅—动态方式破解apk进阶篇(IDA调试so源码)

    Android安全防护之旅—应用”反调试”操作的几种方案解析

    IDA 远程调试 Android so

    相关逆向工具

  • 相关阅读:
    怎么判断是从微信浏览器打开还是手机自带的浏览器(其他浏览器)打开?
    h5移动端页面强制横屏
    苹果的正常显示,安卓的不知道写了什么白屏了
    截取地址栏的最后一个参数
    检测手机号码的正则表达式
    js判断是不是在微信浏览器打开?
    LArea插件选中城市,确定之后又很难再次选择城市?
    display: inline-block 布局
    调试
    时间
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/8948043.html
Copyright © 2020-2023  润新知