返回列表 发帖

回复: 装入一个exe, 并执行

我看了这个帖子: http://www.thysea.com/lb/cgi-bin/topic.cgi?forum=127&topic=1606
但是由于这个帖子太旧了, 不能回复, 所以只能到这里请教.
太棒了. 这是我寻找已久的主题.
相信作者已经进行了试验, 我有一点不明白, 还请大侠赐教.
为什么必须LoadLibraryEx(), 然后自己搞定引入表?
我知道使用LoadLibrary()装入exe后,执行入口不成功,而且会出错, 但是自己搞定
引入表有什么不同吗?
我自己就是使用了LoadLibrary(),然后找到入口点, 并执行之, 然后就在那个exe调用系统函数的时候出错了. 具体是WinMainCRTStartup()中的GetVersionExA(). 仔细检查发现是存放GetVersionExA的地址根本不在指令引用的内存.

回复: 装入一个exe, 并执行

楼上的回复我觉得是不对的.
因为这和操作系统的版本没有关系. 问题是如果按照进程装入一个exe, 那么它的基址就是MODULE是0x00400000,而LoadLibrary()装入则不是这个地址. 而exe文件中引用系统函数是间接引用, 就是先把系统函数的地址放入内存地址__imp__XXX, xxx是函数名,然后调用该地址指向的函数. 这样系统装入exe或者DLL的时候, LoadLibrary()会自动修改__imp_xxx的值, 使之指向当前系统函数的地址.
现在是LoadLibrary()已经正确修改了LoadLibrary()装入的exe文件中的__imp_XXX的值, 但是变量__imp_xxx本身的地址是以LoadLibrary()装入的地址作为基址的. 而exe中引用的__imp_xxx却是以0x00400000为基址的, 那么指令中变量__imp_xxx的地址自然就不是LoadLibrary()修改的那个地方, 因而导致出错了.
所以问题不是在系统函数地址装错了, 而是那个间接引用错了. 但是如何改正这个间接引用的错误呢? LoadLibraryEx()有什么不同呢? 即使自己重新设置引入表还是不能解决问题啊.
高手请帮忙啊.

TOP

回复: 装入一个exe, 并执行

我始终认为这个问题是有解决之道的, 因为PE文件,包括exe, 都是可重定位的啊.[br][br]-=-=-=-=- 以下内容由 linghuchong2006年06月11日 11:05am 时添加 -=-=-=-=-

TOP

回复: 装入一个exe, 并执行

请高手指点阿!

TOP

返回列表 回复 发帖