Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可移植可执行文件是否可以直接绝对引用代码段中的外部库,而不是通过IAT? 如果我从C++代码中调用Win32 API函数,如下面的例子: fSuccess = WriteFile( hPipe, // pipe handle lpvMessage, // message cbToWrite, // message length &cbWritten, // bytes written NULL); // not overlapped 然后VisualC++编译器将这些调用转换为数据段中的导入地址表(IAT)的绝对引用。IAT本身将包含包含Win32 API函数的外部库的实际绝对地址。在上面的WriteFile函数示例中,此外部库是kernel32.dll_C++_C_Winapi_Portable Executable - Fatal编程技术网

可移植可执行文件是否可以直接绝对引用代码段中的外部库,而不是通过IAT? 如果我从C++代码中调用Win32 API函数,如下面的例子: fSuccess = WriteFile( hPipe, // pipe handle lpvMessage, // message cbToWrite, // message length &cbWritten, // bytes written NULL); // not overlapped 然后VisualC++编译器将这些调用转换为数据段中的导入地址表(IAT)的绝对引用。IAT本身将包含包含Win32 API函数的外部库的实际绝对地址。在上面的WriteFile函数示例中,此外部库是kernel32.dll

可移植可执行文件是否可以直接绝对引用代码段中的外部库,而不是通过IAT? 如果我从C++代码中调用Win32 API函数,如下面的例子: fSuccess = WriteFile( hPipe, // pipe handle lpvMessage, // message cbToWrite, // message length &cbWritten, // bytes written NULL); // not overlapped 然后VisualC++编译器将这些调用转换为数据段中的导入地址表(IAT)的绝对引用。IAT本身将包含包含Win32 API函数的外部库的实际绝对地址。在上面的WriteFile函数示例中,此外部库是kernel32.dll,c++,c,winapi,portable-executable,C++,C,Winapi,Portable Executable,如果在运行时修改IAT中的一个条目,使其指向不同的库/函数,那么对我原来C++中的那个函数的所有调用也将改变。我只想改变其中的一些。或者使某个Win32 API函数根本不出现在IAT中,而是直接由代码段引用 我该怎么做?我是否可以强制编译器在代码段中包含对外部库的直接绝对引用,而不是通过IAT的间接引用 我只想改变其中的一些。或者使某个Win32 API函数根本不出现在IAT中,而是直接由代码段引用 我该怎么做 为此,您必须在运行时使用LoadLibrary()/GetModuleHandle(

如果在运行时修改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);          

好的,你是对的,我使用C++你无法在加载模块之前知道它将加载到哪里,或者实际上函数将在哪里。您可以多次导入同一函数,例如,同一函数有两个IAT条目。然后只重定向一个。@IInspectable:根据您的陈述,它实际上是语言不可知的,因为如果其他语言遵循ABI,WinAPI也可以从其他语言使用。因此,移除螺栓标签已经得到纠正。但是OP表示他有C++函数的问题,所以C++标签是可接受的,但不是C。你的刻板印象“参数”,总是需要添加C和汇编标记,因为底层的库和OS都使用了它们。不要忘记算法标记等,这肯定不是标记问题的意图。但我现在就让你玩大游戏大师。@Olaf:windowsapi不是语言不可知论者。它只是没有区别,无论是从C还是C++调用。例如,当从Python、Delphi或C#调用它时,它确实会产生不同。使用和标记是合适的,并且完全不冗余(如你一直暗示的)。谢谢@ IcTestTabi,我有同样的印象,这就是为什么我使用C和C++的原因。太糟糕了,我得到了两张反对票。谢谢@remy lebeau的回答。但是,现在如果有人钩住
GetProcAddress
GetModuleHandle
那么他们也可以更改您编写的代码的行为,对吗?技术上是的。不过,这些是你唯一的选择。要访问外部库中的函数,可以通过IAT静态链接到它,也可以通过
GetProcAddress()
动态加载它。两者都可以在运行时挂接/打补丁,因此您无法防止任何一个被修改。好的,谢谢!我希望会有另一种方式。