试图导出一个函数并调用它

时间:2014-01-10 07:53:45

标签: c++ c

我正试图在我的dll中调用一个函数。

注入 DLL ,因此我需要能够在将导出的函数注入目标进程后调用它。

我的导出函数如下所示:

#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)

EXTERN_DLL_EXPORT void InjectPacketToServer(unsigned char *packet, int length)
{
    int value;     
    int senderoffset = 0x0075F8D8;

    __asm
    {
        mov eax, senderoffset
        mov value, eax
    }

    memcpy((void*)SEND_CODE_CAVE, (void*)packet, length);

    int SenderID =  *(int*)value;
    int PacketLength = length;
    int Send = 0x00577A90;

    __asm
    {
        mov edx, PacketLength
        push edx

        mov eax, SEND_CODE_CAVE
        push eax

        mov ecx, [SenderID]
        call Send
    }
}

我试着这样称呼它:

#include <Windows.h>

typedef int (*InjectPacketToServer)(unsigned char *packet, int length);
InjectPacketToServer Inject;

BYTE packet[3] = { 0x13, 0x01, 0x01};
int length = 3;

int main()
{
    HRESULT ret;
    HMODULE pModule;

    pModule = LoadLibrary("baram.dll");
    ret = GetLastError();

    Inject = (InjectPacketToServer)GetProcAddress(pModule, "InjectPacketToServer");
    ret = GetLastError();

    Inject(packet, length);

    return ret;
}

我收到错误:

ret 0x000003e6 : Invalid access to memory location.     HRESULT

在这一行:

pModule = LoadLibrary("baram.dll");

有人可以告诉我这里我做错了吗?

帮助表示感谢!

1 个答案:

答案 0 :(得分:1)

你有谷歌吗?

MS support说原因是:

  

Windows NT状态码STATUS_ACCESS_VIOLATION映射到Win32错误代码ERROR_NOACCESS。因此,如果操作系统加载程序在映射指定的DLL文件映像或执行启动代码时遇到访问冲突(例外C0000005),则加载程序将最后一个错误设置为998(ERROR_NOACCESS)并且LoadLibrary()函数将失败返回值为NULL。

你应该

  

要解决LoadLibrary()失败问题,请在调试器下运行该应用程序,并为C0000005访问冲突异常启用第一次机会异常处理。如果在调用LoadLibrary()函数时发生访问冲突,则应用程序将进入调试器。然后可以使用调试器的调用堆栈来跟踪发生异常的位置。堆栈跟踪应该可以帮助您缩小与遇到的异常相关的实际问题。