Jirairya

打补丁


利用“打补丁”技术不仅可以修复已有程序的Bug,还可以向程序中添加新功能。“打补丁”的对象可以是文件、内存,还可以是程序的代码、数据等。

修改字符串的方法

  • 直接修改字符串缓冲区(buffer)
  • 在其他内存区域生成新字符串并传递给消息函数。

例子:

直接修改字符串缓冲区

更改对话框中显示的字符串。

找到调用MessageBoxW的部分和字符串的地址。

按Ctrl+F2重新载入调试,并使调试流运行到main函数的起始地址处(401000)。在401000处按F2键设置断点,再按F9执行程序。main()函数的地址1401000做为basecamp(40104F)后第一个前进营。

MessageBoxW函数的字符串“Hello World”保存在4092A0处的一段缓冲区,只要修改该处内容,就可以修改MessageBoxA的显示的内容。 在Dump窗口中按Ctrl+G执行Goto命令,输入4092A0进入字符串缓冲区,然后用鼠标选中该地址的字符串,然后Ctrl+E打开编辑窗口。

编辑窗口修改字符串.png

Unicode形成的“Hello World”字符串占据的区域为4092A0~4092B0。用新字符串覆盖该字符串。Unicode字符串必须以NULL结束,它占据两个字节。

修改之后,返回basecamp。,并按F9运行显示,修改无误。 显示新字符串.png

直接修改字符串缓冲区的方法,优点是十分简单,缺点就是对新字符串的长度有限制,新字符串不应该比原字符串长,不然容易破坏程序。

在Dump窗口,选中更改后的字符串,右键Copy to executable file-,在弹出的Hex窗口,右键Save file as,保存为其他文件名的exe文件,然后运行新生成的文件,查看效果。 保存为可执行文件.png

在其他内存区域新建字符串并传递给消息函数

按Ctrl+F2重新调试,再按F9运行,由于之前在main()函数的起始地址处(401000)设置断点,所以调试流自动转到main()函数处。

向MessageBoxW()函数传递字符串参数时,传递的是字符串所在区域的首地址。若改变字符串地址,消息框就会显示改变地址后的字符串。在内存的某个区域新建一个长字符串,并把新字符串传递给MessageBoxW()函数,可认定为传递的是两个完全不同的字符串地址。

4095F0的NULL填充区域空间,用Ctrl+E向尾部适当位置(409F50)写入新字符串即可。

然后把新的字符串缓冲区地址传递给MessageBoxW()作为参数传递给MessageBoxW()函数。将光标置于401007处,按空格键打开Assemble窗口。将地址更换为409F50,F9运行:

若将修改后的代码保存为可执行文件,该程序无法正常运行,这是由于409F50地址引起。可执行文件被加载到内存并以进程形式运行,文件并非原封不动载入内存,而是遵守一定规律进行。


下一篇 Misc

Comments

Content