DLL注入| GetProcAddress返回NULL
DLL Injection | GetProcAddress return NULL
好的,我会尽量快一点。我正在努力学习如何在另一个进程中注入DLL。目前,我只是试图检测当我打开计算器时何时输出消息。我写了下面的DLL:
#include <windows.h>
#include <iostream>
using namespace std;
extern "C"{
LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
cout << "I'M NOT WORKING " << endl;
// Bunch of code...
return CallNextHookEx(0, nCode, wParam, lParam);
}
void ASimpleFunc(){
cout << "DLL WORKING" << endl;
}
}
这是我的注射器(嗯……它只是试图加载DLL的时刻)。
#include <windows.h>
#include <iostream>
using namespace std;
typedef LRESULT (*CBTProc)(int,WPARAM,LPARAM);
typedef void (*ASimpleFunc)();
int main()
{
// My two functions...
LRESULT _CBTProc;
ASimpleFunc _ASimpleFunc;
HMODULE hDll = LoadLibrary("myDLL.dll");
if(!hDll){
cout << "DLL FAILED TO LOAD" << endl;
}else{
cout << "DLL LOAD SUCCESS" << endl;
// This one is working
_ASimpleFunc = (ASimpleFunc)GetProcAddress(hDll, "ASimpleFunc");
// This one is not working
_CBTProc = (CBTProc)GetProcAddress(hDll, "CBTProc");
if(!_ASimpleFunc || !_CBTProc){
cout << "UNABLE TO CALL HOOK" << endl;
}else{
// other code...
}
}
return 1;
}
任何想法?
编辑:这不是100%的代码。我去掉了明显的东西,比如DLLMain和所有不直接与我的问题交互的东西。
CALLBACK
宏给出了CBTProc
的stdcall调用约定,所以它的名字将用前导下划线和字节计数注释(例如,它可能是_CBTProc@12
)。您需要使用导出的确切名称调用GetProcAddress
。该名称可以使用dumpbin工具找到。
注意,你的函数指针也必须用CALLBACK
注释,以便当你通过函数指针调用函数时,使用正确的调用约定。
您需要在另一个进程中实际加载DLL才能使其工作。为此,您可以在另一个进程中创建一个远程线程来加载您的DLL。
然后你需要在DLLMain
的加载中执行钩子来挂钩你想要挂钩的函数。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583 (v = vs.85) . aspx
http://en.wikipedia.org/wiki/DLL_injection我不知道为什么其中一个没有这个会工作,但是如果你想从DLL导出一个函数,你必须显式地导出它。有两种方法可以做到这一点:
-
通过特定于编译器的方式告诉编译器
Visual c++ ,用
__declspec(dllexport)
。 -
使用模块定义文件。
相关文章:
- 如何在映射中返回null
- 为什么返回 NULL 不会破坏函数?
- fopen 在 gdb 中返回 NULL
- 为什么要从main()返回NULL?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- Box2D World.GetBodyList() 返回 NULL,但 World 显然正在更新对象
- boost::p ython:PyErr_Fetch始终返回 NULL 回溯
- 如何在 Visual C++ 中从返回类型为 map 的函数返回 null?
- 如何在C++中返回Null作为引用
- 从模板化函数返回Null对象
- GDALOpen 在 GEOTiff 文件上返回 null
- PyThreadState_GET() 从 PyImport_GetModuleDict() 中返回 NULL
- (位图)LoadImage() 返回 NULL,GetLastError() 返回 0
- 在构造函数处将类对象强制转换为接口始终返回 NULL
- 如何为迭代器返回"null"值?
- 具有 4 个指针的节点的递归插入函数返回 null
- winAPI FindResource 仅在 DLL 中返回 NULL
- 使用 dlopen/dlsym 打开C++共享库 - dlsym 返回 NULL
- SetWindowsHookEx 在挂接到其他线程时返回 NULL
- 尚未归shared_ptr所有的实例的 shared_from_this() 总是返回 null?