IDA PRO 04 - 动态调试基础02

本文主要讨论硬件断点。

03查漏补缺

  • 进程控制里面的F7/F8描述写反了,F7是步入,F8是步过。

  • ​调试Android的so库时,由于我们使用了 tcp 转发,所以需要在启动设置里面设置主机为本机(127.0.0.1),如果不使用 tcp 转发,那么直接填手机的 ip 地址就行。

硬件断点

03中我们演示的例子,是使用的软件断点,这也是IDA默认的行为。

软件断点的原理是用一条软件断点指令替代断点地址所在位置的操作码字节。在 x86 中,软件断点的指令是 int 3 指令,操作码值是 0xCC。

正常情况下,执行软件断点指令的时候,操作系统会将控制权转移给监控被调试进程的调试器(比如 IDA 的)。利用这种方式,就可以做一些反调试的操作,比如有的程序会故意生成一些异常,这些异常会被调试器捕获到,所以就很烦。还有一个经典的反调试操作,就是自己fork一个子进程调试自己。这样IDA就无法调试该进程了,因为同一时刻,一个进程只能被一个进程附加(调试)。

一些CPU支持硬件辅助的断点,用来代替软件断点。硬件断点使用专用的寄存器配置。在x86中,这些寄存器叫 DR0-7。

硬件断点是有数量限制的,在x86中一般是4个,使用的时候需要注意一下,其他平台可以查一下文档。

设置硬件断点

硬件断点设置方法:先设置普通断点,编辑断点,选中 [hardware],并配置右下角选项,如图:

硬件断点模式:

  • Read:断点地址被读取时命中

  • Write:断点地址被写入时命中

  • Execute:断点地址被执行时命中

  • Size:地址的范围大小,Execute写1即可,Read/Write的大小可以设置为 1、2 或4 等字节。注意我们的断点地址需要按照设置的大小对齐,如果将大小设置为 2 字节,则断点的地址必须为字对齐(2 字节的整数倍)。以在地址0804C834h 处设置的一个 4 字节写入式断点为例,这个断点将由 1 字节写入 0804C837h 、2 字节写入0804C836h 、4字节写入0804C832h 等操作触发。

当我们选中了 Read/Write 模式的时候,实际上设置的是一个内存断点,通常我们会这样操作:

在 IDA-View 窗口中按下 G 键,定位到目标内存,这个地址一般是在数据区,再按下 F2 键设置断点,这个时候默认就是硬件断点了。当程序的任何指令访问(读取/写入)这个地址的时候,都会触发内存断点。

条件断点

断点设置的对话框里面有一个 condition 输入框,这里我们可以输入条件。

IDA 的条件断点使用的是 IDC 表达式。非零值为真,满足时触发条件断点,这个做过开发的应该都用过,调试循环好用。

断点表达式的一些示例:

EAX == 100 // break if eax holds the value 100
ESI > EDI // break if esi is greater than edi
Dword(EBP-20) == 10 // Read current stack frame (var_20) and compare to 10
GetRegValue("ZF") // break if zero flag is set
EAX = 1 // Set EAX to 1, this also evaluates to true (non-zero)
EIP = 0x0804186C // Change EIP, perhaps to bypass code

硬件断点的一个例子

材料传到了 p17

这是一个 linux下64位程序,所以我们需要使用 dbgsrv 下的 linux_server64 来调试。

将该程序上传到 kali 虚拟机上,并且启动:

将实验文件拖入 windows 的 ida 中,等待分析完成,选择调试器,设置进程参数:

这里的ip就是 kali 虚拟的 ip 了。

然后在 start 函数上设置断点,因为这里是壳代码,所以我们可以直接设置软件断点:

设置好断点后,启动进程,中间会弹出几个窗,可能还会提示你输入文件没找到,但是找到一个匹配的程序,反正点继续就ok了,IDA进入调试界面:

这段的最后一行是一个分支跳转,我们按 F8,看看进入那个分支:

进入了左边,按下F7,继续程序:

进入到了一个新的函数,这里的整个函数比较长,我们看看结束语句在哪里:

是在这个块这里,我们使用 F4 让程序直接运行到这里:

后面还有很多函数的调用,就不一个一个贴了,反正就是 F4 + F7 配合,慢慢找到我们的目标代码:

到了这里的时候,我们在 retn 位置按下 F7,IDA 会给出一个提示:

说IDA检查到了 rip 寄存器指向了一个没有被定义成代码的位置。这说明了这些代码被壳给包装成了数据,IDA在分析的时候把这些代码识别成了数据,当程序真正运行起来的时候,壳会将这些数据解密,恢复成指令来执行。

我们点击Yes,IDA会将目标区域解释成指令:

这里就是解密之后的指令了。

我们可以在这里设置断点,当下次分析的时候,就可以直接跳转过来,不需要重新分析一遍。但是有个问题,程序是在运行时解密的,如果我们使用软件断点,在解密时就会导致数据错误,所以这里需要使用硬件断点:

我们关闭 IDA,重新调试一下看看效果:

可以看到 IDA 直接停在了我们上次设置断点的位置,但是有个问题,就是这里IDA还是认为它是数据,所以我们按一下C键,强制将它转换成代码,发现按了没啥用,有个骚操作就是从断点指令开始往下选中一大块数据(完全包含上次看到的所有指令,反正是数据区,选多点没事),点击U键,然后再按C键即可:

可以看到和上次手动分析的指令是一样的。

图太多了,这篇就先到这里,感觉这个系列会很长长长的样子!!!

  • 41
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IDA Pro是一款强大的反汇编工具,可用于反汇编各种二进制文件,包括Android应用程序中的dex文件。以下是使用IDA Pro调试dex文件的步骤: 1. 下载并安装IDA Pro软件,并打开要调试的dex文件。 2. 在IDA Pro中选择“File” -> “Open”,然后选择要调试的dex文件。如果IDA Pro无法自动识别文件类型,请手动选择“DEX - Dalvik Executable”文件类型。 3. 等待IDA Pro分析dex文件。一旦分析完成,您将看到一个反汇编窗口,其中包含dex文件的反汇编代码。 4. 选择要调试的代码段,并在IDA Pro中选择“Debugger” -> “Process Options”。 5. 在“Process Options”窗口中,选择“Android Debugger”作为调试器,并选择要使用的调试器选项。您可以选择使用本地调试器或远程调试器,具体取决于您的需求。 6. 在“Process Options”窗口中,输入要启动的调试器命令行。例如,如果您使用的是本地调试器,您可以输入“adb shell dalvikvm -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y”。 7. 单击“OK”按钮,以启动调试器并开始调试代码。 8. 在IDA Pro调试窗口中,您可以使用各种调试命令,例如“run”、“step”、“breakpoint”等,来控制代码的执行。 9. 您还可以使用IDA Pro的其他调试工具,例如内存查看器和寄存器查看器,来进一步分析代码和调试问题。 总之,IDA Pro是一款功能强大的反汇编工具,可用于调试Android应用程序中的dex文件。通过遵循上述步骤,您可以轻松地使用IDA Pro调试dex文件,并深入了解代码执行的细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值