IDA PRO 05 - 动态调试基础03

本文主要讨论内存数据修改。

IDA安装插件

有一个懒人插件可以帮助我们修改内存数据,推荐大家安装一下:

https://github.com/P4nda0s/LazyIDA

安装方式很简单:

将下载的 LazyIDA.py 文件放到 IDA 的 plugins 目录下面就好了。下载的IDA里面默认是有这个文件的,但是呢,功能比较少,有大佬在原版基础上更新了一些功能。

例子1

材料传到了 p18

我们安装 apk,调试其 so 文件,在 native 方法 enc 上加上断点:

 

 

首先,打开 app,在 app 里面输入 “111111”:

点击 ENC 按钮,触发断点,我们双击查看 enc 函数执行之前 v6 的值:

 

可以看到,v6 是我们输入的数据。根据伪代码分析,v7 是 v6 的长度。由于 enc 函数没有返回值,所以应该是对 v6 做了更改。

我们按 F8 跳过 enc 函数的执行,然后再观察 0000006F2EA1C400 出的值。步过函数后,按 G 键,输入地址查看地址里面的值是否有变化:

 

发现确实变化了:

 

0x31 变成了 0x1D。

所以可以猜测一下,enc 这个函数会将数字 0x31 映射为数字 0x1D。

我们再输入 “222222” 试试,这个时候就可以用到set ip(Ctrl+N),快捷键似乎不好使,还是右键找选项吧。

跳转到 enc 前一个指令的位置,找到v6的内存地址,修改它的值,这样我们不用重新输入。

右键选择 paste data,在弹出的窗口里面输入 “222222”,注意选择 ASCII,这样我们输入的就是字符:

 

点击 Apply,v6 处的内存地址变为了如下数据:

 

这样我们就完成了一次内存数据修改,。

接着我们步过函数,看看字符“2” 会被映射成什么:

 

发现被映射成了字符 “w”。

我们可以发现每个字符都映射成的是一样的,再多试几次我们就可以确定这个 enc 就是一个映射函数。它会固定地将一个数字映射成另一个数字。当我们使用这种黑盒的方式来确定这个函数的作用后,就可以不用去分析它里面的代码了。这个技巧还是非常有用的,特别是当我们分析一个非常复杂的算法里面的一个片段的时候,因为算法里面有很多的片段都是做一个固定的事情。给定输入观察输出,会比较快的确定这个函数的作用。

当然这只是一个简单的例子,并不是每个函数都只是单个字符的变换,有的是多个字符一起变换,有的更加复杂一点的还会与字符的位置有关等等。

例子2

材料传到了 p18

我们使用上面的黑盒分析法来分析一下 math.exe 这个程序的 sub_401EF0 函数。

在函数窗口定位到这个函数:

 

按 X 键,看看哪里引用到:

 

一共有5个地方使用,都加上断点,调试器启动程序进程,随便输入一个字符串“111”,看看哪里会触发到。

但是很可惜,进程会直接停止:

 

看起来是有检测,我们找到 main 函数,慢慢分析下来:

 

main 反汇编有问题,看看是不是有花指令:

 

这里有个跳转到loc_4A2A0C + 2 的位置,这就有点奇怪了。下面是 loc_4A2A0C 相当于是一个地址标识 X ,上面跳转到 X + 2,那岂不是有两条无用的指令。

我们先将它 undefined:

 

黑色的虚线箭头已经提醒我们了,程序的跳转真实地址,我们在这里按下 C 键:

 

发现看起来好多了。同样的下面还有好几处这样的指令,都处理掉后,再看下反汇编代码:

 

可以看到里面多了很多代码,虽然还有一个错误,但是这个错误我们现在还搞不定。而且它也不影响我们分析目标函数。

我们发现函数里面有个 if,其条件是长度要是 64,在这里断点一下,随便输入一个字符串”1313143”,发现 v20 就是我们输入的字符串,说明我们输入的字符串必须要是64位长度:

 

重新运行程序,输入64个1:

 

等待一会,进入到了我们的目标函数里面:

 

这个函数的输入 a2 是一个 int 类型,输出 v3 也是一个 int 类型,那么它是不是做的一个变换呢?

我们调试一下,将 a2 的值改成 1,看看输出是什么。

从反汇编里面,我们看到这个是一个 fastcall 调用,所以它的参数是放在寄存器里面的。这个知识我们后面单独讲函数调用与栈帧。

看看其汇编代码:

 

ecx 存的是第一个参数,那么哪个寄存器是第二个参数呢?我们将鼠标指针放到调用的函数上,IDA会给出提示:

 

我们改一下它的值,在寄存器窗口修改:

 

步过这个函数,其返回值会放到 rax 寄存器里面:

 

将 0-9 全部试一下,发现映射如下:

0x0 -> 0x8
0x1 -> 0xD
0x2 -> 0x10
0x3 -> 0x3D
0x4 -> 0x7D
0x5 -> 0xFD
0x6 -> 0x1FD
0x7 -> 0x3FD
0x8 -> 0x7FD
0x9 -> 0xFFD

可以看到还是很有规律的。这样我们就清楚了这个函数是在做什么,省去了分析代码的时间。

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值