我正试图在我的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");
有人可以告诉我这里我做错了吗?
帮助表示感谢!
答案 0 :(得分:1)
你有谷歌吗?
MS support说原因是:
Windows NT状态码STATUS_ACCESS_VIOLATION映射到Win32错误代码ERROR_NOACCESS。因此,如果操作系统加载程序在映射指定的DLL文件映像或执行启动代码时遇到访问冲突(例外C0000005),则加载程序将最后一个错误设置为998(ERROR_NOACCESS)并且LoadLibrary()函数将失败返回值为NULL。
你应该
要解决LoadLibrary()失败问题,请在调试器下运行该应用程序,并为C0000005访问冲突异常启用第一次机会异常处理。如果在调用LoadLibrary()函数时发生访问冲突,则应用程序将进入调试器。然后可以使用调试器的调用堆栈来跟踪发生异常的位置。堆栈跟踪应该可以帮助您缩小与遇到的异常相关的实际问题。