通过查看PE查看器中的可执行文件的结构,我发现它从comctl32.dll导入了函数,除此之外没有其他东西。但是,当我通过打包程序(UPX)运行此可执行文件时,生成的可执行文件突然也取决于kernel32.dll。有人可以解释为什么会这样,以及从kernel32.dll导入的新功能有什么用吗?

#1 楼

任何动态链接的可执行文件都需要从动态加载的库中导入功能。您拥有的可执行文件需要comctl32.dll中的某些功能才能完成其工作。

像UPX这样的打包程序基本上是在创建一个全新的可执行文件,并将原始文件压缩为“有效负载”。打包的可执行文件现在具有更多依赖项的原因是因为UPX解码器在运行时会解压缩原始可执行文件,因此它具有自己的依赖项。我猜想它从kernel32.dll导入LoadLibrary和GetProcAddress。您可以在MSDN上阅读更多信息,但总而言之,这些功能允许UPX拆包存根加载其他库,而无需明确链接到它们。