在C ++中按名称获取函数
Getting function by name in c++
代码:
#include <tchar.h>
#include <windows.h>
typedef INT (WINAPI * lolMessageBoxA)(HWND,LPCSTR,LPCSTR,UINT);
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
lolMessageBoxA UchwytMessageBoxA;
UchwytMessageBoxA = lolMessageBoxA(GetProcAddress(GetModuleHandle("User32.dll"),"MessageBoxA"));
UchwytMessageBoxA(NULL,"TEST WINDOWS","TEXT 2", MB_OKCANCEL | MB_ICONWARNING);
return 0;
}
当我在挂钩之前正常调用 MessageBoxA 时,挂钩部分工作正常。但是当我删除那部分并只留下 'hooking' 部分时,它失败了...
已解决:
#include <tchar.h>
#include <windows.h>
typedef INT (WINAPI * lolMessageBoxA)(HWND,LPCSTR,LPCSTR,UINT);
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
lolMessageBoxA UchwytMessageBoxA;
LoadLibraryA("User32.dll");
UchwytMessageBoxA = lolMessageBoxA(GetProcAddress(GetModuleHandle("User32.dll"),"MessageBoxA"));
UchwytMessageBoxA(NULL,"TEST WINDOWS","TEXT 2", MB_OKCANCEL | MB_ICONWARNING);
return 0;
}
如此处所示,没有理由加载进程 user32.dll
。所以对 GetModuleHandle
的调用将 return NULL
。那么调用GetProcAddress
也会失败,returnNULL
。好吧,你可以看看接下来会发生什么。
当您直接调用 MessageBoxA
时,链接器会生成一个导入 table,强制加载程序加载 user32.dll
。但是当您删除对 MessageBoxA
的调用时,就没有必要这样做了。
您应该将对 GetModuleHandle
的调用替换为对 LoadLibrary
的调用,从而强制加载库。
最后,您问这个问题的真正原因是您的代码忽略了错误检查。不要那样做。检查由 Win32 函数调用编辑的值 return。如果你这样做了,你就可以自己解决这个问题了。
代码:
#include <tchar.h>
#include <windows.h>
typedef INT (WINAPI * lolMessageBoxA)(HWND,LPCSTR,LPCSTR,UINT);
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
lolMessageBoxA UchwytMessageBoxA;
UchwytMessageBoxA = lolMessageBoxA(GetProcAddress(GetModuleHandle("User32.dll"),"MessageBoxA"));
UchwytMessageBoxA(NULL,"TEST WINDOWS","TEXT 2", MB_OKCANCEL | MB_ICONWARNING);
return 0;
}
当我在挂钩之前正常调用 MessageBoxA 时,挂钩部分工作正常。但是当我删除那部分并只留下 'hooking' 部分时,它失败了...
已解决:
#include <tchar.h>
#include <windows.h>
typedef INT (WINAPI * lolMessageBoxA)(HWND,LPCSTR,LPCSTR,UINT);
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
lolMessageBoxA UchwytMessageBoxA;
LoadLibraryA("User32.dll");
UchwytMessageBoxA = lolMessageBoxA(GetProcAddress(GetModuleHandle("User32.dll"),"MessageBoxA"));
UchwytMessageBoxA(NULL,"TEST WINDOWS","TEXT 2", MB_OKCANCEL | MB_ICONWARNING);
return 0;
}
如此处所示,没有理由加载进程 user32.dll
。所以对 GetModuleHandle
的调用将 return NULL
。那么调用GetProcAddress
也会失败,returnNULL
。好吧,你可以看看接下来会发生什么。
当您直接调用 MessageBoxA
时,链接器会生成一个导入 table,强制加载程序加载 user32.dll
。但是当您删除对 MessageBoxA
的调用时,就没有必要这样做了。
您应该将对 GetModuleHandle
的调用替换为对 LoadLibrary
的调用,从而强制加载库。
最后,您问这个问题的真正原因是您的代码忽略了错误检查。不要那样做。检查由 Win32 函数调用编辑的值 return。如果你这样做了,你就可以自己解决这个问题了。