IDA PRO 05 - 动态调试基础03

文章介绍了如何使用LazyIDA插件在IDA中修改内存数据,通过实例演示了如何通过输入观察输出来分析函数行为,特别是针对映射函数的分析,对于复杂算法片段分析非常有用。

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二手的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值