在阅读我可以静态链接(不导入)Windows 系统 DLL的答案时吗?我想出了另一个问题。所以:
- 有没有办法编写一个没有依赖项的程序(也没有静态编译的东西——它只有我的代码),并且假设
kernel32.dll
无论如何都会加载/映射到进程中,一切都在运行时得到解决? - 我的假设
kernel32.dll
是否正确?
在运行时,我的意思是使用PEB
结构。
在阅读我可以静态链接(不导入)Windows 系统 DLL的答案时吗?我想出了另一个问题。所以:
kernel32.dll
无论如何都会加载/映射到进程中,一切都在运行时得到解决?kernel32.dll
是否正确?在运行时,我的意思是使用PEB
结构。
如果您问的是 PE 文件,并且“无依赖关系”的意思是“没有静态导入的 DLL”,那么是的。
看到\yoda\NoImports.exe
在https://corkami.googlecode.com/files/BinaryCorpus_v2.zip作为一个例子。
这不是一个可移植的技巧,但是当可执行文件启动时,kernel32.dll 总是加载在相同的地址,这意味着 LoadLibraryA 和 GetProcAddress 总是在相同的地址。您可以对这些偏移进行硬编码,然后从那里开始。
是的,没有依赖关系的程序是可能的。
要导入 APi,首先需要定位 kernel32(通过堆栈+MZ
扫描,或PEB
)然后定位导出(通过导出解析或硬编码值)。
是的。
LoadLibrary
和GetProcAddress
。