是否可以从DLL更改进程的入口点?

时间:2014-04-20 15:48:11

标签: c++ windows portable-executable entry-point ollydbg

大多数应用程序进程的默认入口点通常为0x401000。

我们是否有办法改变或改变流程的切入点?例如,如果我想使用DLL在外部将入口点更改为0x901000(假设进程通过C ++加载DLL)?

我试图创建一个DLL来编辑进程的默认入口点。

2 个答案:

答案 0 :(得分:0)

在Windows上,EXE的默认加载地址是0x400000 - 所以这是0x401000的那部分来自的地方。

0x1000组件是内存中图像的偏移量,其中(通常)保存大量代码的text段开始。这就是这个特定程序的切入点。

该偏移量是PE头中的一个字段,实际上是0x400000的默认加载地址。两者都可以更改,但请注意,对于EXE,重定位信息通常被剥离:由于在首次创建新进程时始终保证默认加载地址是空闲的,因此EXE通常认为不需要重定位信息。

如果您的EXE就是这种情况,那么您无法在不对图像进行大手​​术的情况下更改加载地址,以手动识别和修复与编译/链接期间使用的假定0x400000加载地址相关的任何引用。

答案 1 :(得分:0)

是的,如果您的链接器允许,您可以在可移植可执行文件的可选标头中更改ImageBase。 大多数链接器在链接可执行文件时设置ImageBase = 0x10000,在链接DLL时设置0x400000。但是,这个数字是任意选择的(我猜因为它很容易记住并且在调试器中看起来很好)并且如果内存已被占用,则加载器可能会违反它。 见http://msdn.microsoft.com/en-us/library/ms809762.aspx 表3.段落IMAGE_OPTIONAL_HEADER.ImageBase:

当链接器创建可执行文件时,它假定该文件将被内存映射到内存中的特定位置。该地址存储在该字段中,假设加载地址允许进行链接器优化。如果文件确实由加载器内存映射到该地址,则代码在运行之前不需要任何修补。在为Windows NT生成的可执行文件中,默认图像库为0x10000。对于DLL,默认值为0x400000。在Windows 95中,地址0x10000不能用于加载32位EXE,因为它位于所有进程共享的线性地址区域内。因此,Microsoft已将Win32可执行文件的默认基址更改为0x400000。假设基地址为0x10000而链接的较旧程序在Windows 95下加载需要更长时间,因为加载程序需要应用基本重定位。