可移植可执行文件是否可以直接绝对引用代码段中的外部库,而不是通过 IAT
Can a portable executable have direct absolute references to external libraries in the code segment, not via IAT?
如果我从C++代码调用 Win32 API 函数,如以下示例所示:
fSuccess = WriteFile(
hPipe, // pipe handle
lpvMessage, // message
cbToWrite, // message length
&cbWritten, // bytes written
NULL); // not overlapped
然后,Visual C++编译器会将这些调用转换为对数据段中导入地址表 (IAT) 的绝对引用。IAT 本身将包含包含该 Win32 API 函数的外部库的实际绝对地址。在上面的 WriteFile
函数示例中,此外部库kernel32.dll
。
如果我在运行时修改 IAT 中的一个条目,使其指向不同的库/函数,那么我的原始C++中对该函数的所有调用也将更改。我只希望其中一些人改变。或者使某个 Win32 API 函数甚至根本不出现在 IAT 中,而是由代码段直接引用。
我该怎么做?我是否可以以某种方式强制编译器在代码段中包含对外部库的直接绝对引用,而不是通过 IAT 的间接引用?
我只希望其中一些人改变。或者使某个 Win32 API 函数甚至根本不出现在 IAT 中,而是由代码段直接引用。
我该怎么做?
为此,您必须在运行时使用 LoadLibrary()
/GetModuleHandle()
和 GetProcAddress()
(或编译器的延迟加载包装器,如果有的话)动态访问函数,而不是在编译时静态链接到函数。 例如:
typedef BOOL (WINAPI *LPFN_WRITEFILE)(HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED);
LPFN_WRITEFILE lpWriteFile = (LPFN_WRITEFILE) GetProcAddress(GetModuleHandle("kernel32"), "WriteFile");
fSuccess = lpWriteFile(
hPipe, // pipe handle
lpvMessage, // message
cbToWrite, // message length
&cbWritten, // bytes written
NULL);
相关文章:
- 在函数内部的声明中初始化数组,并在外部使用它
- 使外部项目可用于find_package CMake
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- C++:来自外部文件的Trivia
- 从函数角度看ID到文件路径的内部与外部映射
- C++:将外部库链接到dll库
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 节俭并发:未解决的外部问题
- 如何在c++中从git建立外部库
- 未解析的外部符号_MsiLocateComponentW@12.
- 如何使用对C函数和类对象的外部调用来处理C++头文件
- 具有外部"c"和程序集的未定义函数
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 在C++中使用 gRPC 时未解析的外部符号
- 在类函数中初始化外部作用域变量
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 调用外部函数,无法指定类型 C++/MVS
- 同时具有"外部"和"内联"说明符的变量
- 可移植可执行文件是否可以直接绝对引用代码段中的外部库,而不是通过 IAT