好吧,我会试着快点。我正在尝试学习如何在另一个进程中注入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和所有不能直接与我的问题交互的东西。
答案 0 :(得分:2)
CALLBACK
宏给出了CBTProc
stdcall调用约定,因此其名称将使用前导下划线和字节数进行注释(例如,它可能是_CBTProc@12
)。您需要使用导出的确切名称来呼叫GetProcAddress
。可以使用dumpbin工具找到该名称。
请注意,您的函数指针也必须使用CALLBACK
进行注释,以便在通过函数指针调用函数时,使用正确的调用约定。
答案 1 :(得分:1)
您需要在其他进程中实际加载DLL才能使其正常工作。您可以通过在将加载DLL的其他进程中创建远程线程来执行此操作。
然后你需要在加载DLLMain
时执行钩子来挂钩你想要挂钩的函数。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx
http://en.wikipedia.org/wiki/DLL_injection
这两个链接应该指向正确的方向。
答案 2 :(得分:0)
我不知道为什么其中一个没有它可以工作,但如果你想从DLL导出一个函数,你必须显式导出它。有两种方法可以做到这一点:
通过一些特定于编译器的方法告诉编译器。
对于 Visual C ++ ,use __declspec(dllexport)
。