首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DLL注入| GetProcAddress返回NULL

DLL注入| GetProcAddress返回NULL
EN

Stack Overflow用户
提问于 2013-01-03 11:39:14
回答 3查看 1.1K关注 0票数 0

好的,我会尽量说快点的。我正在尝试学习如何在另一个进程中注入DLL。目前,我仅尝试在打开计算器时检测何时输出消息。我已经写了下面的DLL:

代码语言:javascript
复制
#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 )。

代码语言:javascript
复制
#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和所有与我的问题没有直接联系的东西。

EN

回答 3

Stack Overflow用户

发布于 2013-01-03 11:48:11

CALLBACK宏给出了CBTProc标准调用的调用约定,因此它的名称将使用前导下划线和字节计数进行注释(例如,它可能是_CBTProc@12)。您需要使用导出的确切名称调用GetProcAddress。可以使用转储工具找到该名称。

请注意,您的函数指针还必须使用CALLBACK注释,以便当您通过函数指针调用函数时,使用正确的调用约定。

票数 2
EN

Stack Overflow用户

发布于 2013-01-03 11:44:27

实际上,您需要将DLL加载到另一个进程中,这样才能正常工作。您可以通过在将加载您的DLL的另一个进程中创建远程线程来完成此操作。

然后,您需要在加载DLLMain时执行挂钩,以挂钩您希望挂钩的函数。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx

http://en.wikipedia.org/wiki/DLL_injection

这两个链接应该会给你指明正确的方向。

票数 1
EN

Stack Overflow用户

发布于 2013-01-03 11:44:51

我不知道为什么它们中的一个可以在没有这个的情况下工作,但是如果你想从DLL中导出一个函数,你必须显式地导出它。有两种方法可以完成此操作:

通过一些特定于编译器的方法

  1. Tell编译器

对于Visual C++use __declspec(dllexport).

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14132700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档