为什么 OEP 没有准备好导入表?

逆向工程 开箱 我在 进口改造
2021-06-22 07:53:42

当手动解包程序并在OEP处结束时,我们为什么要重建导入表?我知道在打包时,导入表会被破坏以进行压缩/隐藏,但是如果我们已经在 OEP 中,那一定意味着程序已准备好运行,因为解包存根已经修复了导入表?否则它只会在第一次外部调用时崩溃。

2个回答

如果我们已经在 OEP,那一定意味着程序已准备好运行,因为解包存根已经修复了导入表

不,当到达 OEP 时,解包存根已经填充了导入地址表;它没有修复导入表。您需要重建导入表,以便当您运行解包的程序时,Windows 加载程序将根据导入表中的数据在运行时填充导入地址表(在运行时使用正确的函数地址)。

(请注意,总有例外,但对于大多数包装工来说通常是这样。)

解包存根可能只是加载导入而不是修复导入表。如果您想保存可执行文件以便稍后运行它,您将不会在保存的可执行文件中包含解包存根,因此除非您修复和导入表,否则没有人为您加载导入。