本文主要讨论内存数据修改。
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
可以看到还是很有规律的。这样我们就清楚了这个函数是在做什么,省去了分析代码的时间。