在运行时将Windows可执行文件加载到其他基地址吗?

问题描述 投票:0回答:1

是否可以在运行时将Windows可执行文件加载到其他基址。我的意思不是用/BASE进行编译。它已被编译为加载到默认基址0x400000。我想查看将剥离了重定位信息的PE加载到与其请求的地址不同的其他基址上的情况。我的有限研究(Google的前两页)没有表明这是可能的,但我希望有人可以提供可能的黑客手段。

windows portable-executable
1个回答
0
投票

我假设您希望代码可以放置在内存中的任何位置,并且无论您是否只是显式地跳入代码,或者是否像其他任何代码一样,将其作为可执行映像加载,仍然可以正常工作。它将不依赖于“首选”基地址,也不依赖于.relocation节中的数据(如果存在)。此代码将不会依赖于可执行映像的任何其他部分(例如IAT,.data节或任何各种标头),但是它将始终是特定于平台的(例如Windows),并且可能特定于某些版本的Windows取决于如何编写,但是可以使用Windows无关代码。

您只需要以一种不依赖于硬编码地址或相对于相对图像基数的硬编码偏移量的方式来精制代码。这与在安全漏洞利用中用来控制程序的代码类型相同。

此代码几乎总是需要使用显式的汇编语言指令,包括入口点代码本身。例如。您不能通过以Main,WinMain,DllMain或类似名称开头来使用C Runtime的启动代码。通过使用自定义C MACRO和内联汇编,可以使此过程的复杂性降低,但是您仍然需要对底层汇编指令有一般的了解。

而不是使用硬编码的指针或相对的“图像”基址来引用函数和数据,而必须相对于入口点代码中的位置手动构建函数和数据指针。这比听起来容易,并且像相对的CALL一样简单,后面是POP指令以获取您的“基本”地址(X86体系结构)。然后,您的数据可以在代码字节之间混合,根据需要跳过它,指针的构建与指向函数的相对指针没有什么不同。

通过使用位置无关的指令并在运行时发现入口点的位置,即使所得的EXE也可以正常运行,理论上您也可以将所得的PE映像和JMP的.text部分带入您的入口点。只是期望自己会做很多肮脏的工作,直到可以动态解析Windows API地址为止。这可能不适合胆小的人,但这是很简单的。该研究领域将使您对Windows的工作原理有更深入的了解,并且您将因此而成为更好的程序员。

[Internet上有很多有关此主题的信息。搜索“ shellcode”和有关如何编写打包程序/解包程序的教程。调用Windows API只是意味着您需要编写自己的自举代码来在运行时解析这些地址。打包人员和拆包人员的工作相同。

推荐的书,描述了此过程,最值得注意的是导入地址解析:Shellcoder的《发现的编程》(卡巴斯基),Shellcoder的《手册》(Anley)和The Rootkit Arsenal(Blunden);后者在管理复杂性方面涉及C MACRO。以下文章Locating KERNEL32 in ASLR memory中讨论了一些详细信息。

祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.