逆向工程核心原理笔记(一)——Hello World-2

逆向工程核心原理笔记(一)——Hello World-2

接下来我们尝试修改程序的内容

打补丁

在代码逆向分析的过程中,“打补丁”的操作是重要的内容,“打补丁”不仅可以修复已有程序中的Bug还可以向程序中添加新功能。其对象可以是文件,内存,甚至是程序的代码和数据。接下来我们尝试将MessageBox中的字符串修改为其他的字符串。

接下来介绍修改字符串的两种方法:

修改字符串缓冲区

现在程序中找到字符串所在的位置:
在这里插入图片描述
如箭头所指,程序所调用的字符串的位置是 4A2118 我们在下面的 Dump 窗口中使用 Ctrl + G 找到这个位置,如下:
在这里插入图片描述
这里就是我们的字符串,选中从 4A2118 到 4A2130 使用 Ctrl + E ,弹出的对话框如下所示:在这里插入图片描述
上面是这里的字符串,我们将这里的字符串改为 Hello Lpy_Now 。在 Unicode 编码中用两个字节表示一个罗马字母,并且 Unicode 字符串必须使用 NULL 结尾,NULL 占据两个字节,在添加 NULL 时不能直接在 Unicode 窗口中中进行添加,而是需要在 HEX 项目中进行添加。更改后的字符串比之前的字符串更长,但是原字符串之后可能会存储一些有一定意义的数据,如果使用更长的字符串覆盖原字符串的时候,原有的数据可能会被覆盖,这可能比较危险,在实际的操作中不建议这样修改字符串。接下来我们将字符串进行修改:
在这里插入图片描述
如果在修改字符串的时候长度受限无法修改,可以将箭头所示的 Keep size 选项关掉后进行修改。

接着我们使用 F9 将程序运行到 MessageBoxW 处,输出的 MessageBoxW 结果为:
在这里插入图片描述
此时我们修改后的字符串是暂时性的,当我们重新反编译程序的时候 MessageBox 中显示的字符串仍然是 Hello World 如果我们需要以后运行程序就显示 Hello Lpy_Now 那么我们需要将更改的地方进行保存,首先将修改后的字符串的部分选中
在这里插入图片描述
在右键弹出的菜单中选中 Copy to executable file 后程序弹出下面的窗口:
在这里插入图片描述
右键选择后的菜单中选择 Save file 将程序进行保存,再次运行程序,MessageBox 显示的字符串就是修改后的字符串了:
在这里插入图片描述
在其他内存区域新建字符串并传递给消息函数

如果使用较长的字符串去替换之前的字符串的话,可能会引起不必要的错误,我们尝试更换一种方法:
在这里插入图片描述
在 007B1007 处有一条 PUSH 命令,为 PUSH 7B2118 这里是将 7B2118 处的字符串以参数的形式传递给 MessageBoxW() 函数,在向 MessageBoxW() 函数传递参数的时候,是将字符串所在区域的首地址进行传递,如果将字符串的首地址进行改变,那么消息框显示的字符串也会相应改变,我们可以尝试在内存的某个区域新建一个长字符串,并将字符产的首地址传递给这个函数,这里我们可以认为传递的是完全不同的字符串的地址。

在应用程序被加载到内存的时候通常有一个最想的内存分配大小,通常为 1000 ,即使在程序运行的时候只需要占用 100 的内存,在被加载到内存的时候仍会被分配到 1000 左右的内存,一部分内存会被程序占用,而另一部分将会是空白区域,会被填充为 NULL。

我们将字符串定位到 7B2118 处,向后查看,直到又较多的 NULL 填充的地方:
在这里插入图片描述
当字符串的位置在 7B21A4 处以后,又较多的空白,我们选中一段空白,使用 Ctrl + E 将这里的内容修改为 Hello Lpy_Now :
在这里插入图片描述
再在 7B1007 处双击 PUSH 命令,弹出如下对话框:
在这里插入图片描述
将此处的命令改为 修改后的字符串的首地址 7B21A4 :
在这里插入图片描述
修改后我们发现此时的字符串为修改后的字符串,我们将程序运行到此处:
在这里插入图片描述
同样得到了修改后的结果。
接下来将修改结果进行保存就好了。
如上就是两种对程序进行修改的方式

猜你喜欢

转载自blog.csdn.net/a1351937368/article/details/105960920