我想通过添加到程序代码只是标准的Windows MessageBox修补一些二进制(Windows PE)。问题是原始PE没有在定义MessageBox函数的地方导入user 32。如何添加/导入所需的库,以便在IDA PRO(v7.5 SP3)的修补代码中调用MessageBox函数?
y1aodyip1#
IDA用于静态分析。虽然它有support for patching,但这是非常有限的。即使考虑到链接的插件(Keypatch和IDA Patcher),编写新的汇编代码块仍然太麻烦。您可以很容易地猜到,在一个单行文本框中一次查看和编写一条指令对于真实的的汇编编程来说太乏味了。在您的特定情况下,您需要添加新导入的元件。这很麻烦,因为您需要在“导入查找表”和“导入地址表”中添加条目。后者不能移动,因为链接的代码通过直接偏移量引用它。因此,在IAT之后需要有空闲空间,以便最终移动ILT并为所有需要的字符串找到空间。如果已经导入了user32.dll,则通常无法为其添加另一个名称条目,因为这些表已压缩,没有剩余空间。如果您设法正确地添加了一个新的导入,那么IDA应该能够让您组装(一次一条指令)调用该导入的代码。不过,我会采取另一种方法。我将简单地编写一个独立于位置的自包含代码,该代码将访问PEB以查找kernel32.dll模块,并使解析其导出目录并获取LoadLibraryA/W和GetProcAddress的地址所需的代码量最少。然后我将有两个函数指针,允许我在运行时导入任何API。我可以很容易地测试这个代码,把它组装成一个可执行的二进制文件。最后,我将使用十六进制编辑器将代码粘贴到原始二进制文件中我需要的位置。由于代码位置独立且自包含,它仍然可以正常运行。如果我需要添加一组更丰富的功能,我会考虑编写代码来引导一个DLL,我会嵌入到原始的二进制文件中。然后,我会通过任何普通手段开发DLL。
LoadLibraryA/W
GetProcAddress
1条答案
按热度按时间y1aodyip1#
IDA用于静态分析。
虽然它有support for patching,但这是非常有限的。即使考虑到链接的插件(Keypatch和IDA Patcher),编写新的汇编代码块仍然太麻烦。您可以很容易地猜到,在一个单行文本框中一次查看和编写一条指令对于真实的的汇编编程来说太乏味了。
在您的特定情况下,您需要添加新导入的元件。这很麻烦,因为您需要在“导入查找表”和“导入地址表”中添加条目。后者不能移动,因为链接的代码通过直接偏移量引用它。因此,在IAT之后需要有空闲空间,以便最终移动ILT并为所有需要的字符串找到空间。如果已经导入了user32.dll,则通常无法为其添加另一个名称条目,因为这些表已压缩,没有剩余空间。
如果您设法正确地添加了一个新的导入,那么IDA应该能够让您组装(一次一条指令)调用该导入的代码。
不过,我会采取另一种方法。我将简单地编写一个独立于位置的自包含代码,该代码将访问PEB以查找kernel32.dll模块,并使解析其导出目录并获取
LoadLibraryA/W
和GetProcAddress
的地址所需的代码量最少。然后我将有两个函数指针,允许我在运行时导入任何API。
我可以很容易地测试这个代码,把它组装成一个可执行的二进制文件。
最后,我将使用十六进制编辑器将代码粘贴到原始二进制文件中我需要的位置。由于代码位置独立且自包含,它仍然可以正常运行。
如果我需要添加一组更丰富的功能,我会考虑编写代码来引导一个DLL,我会嵌入到原始的二进制文件中。然后,我会通过任何普通手段开发DLL。