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

trying to export a function and call it

本文关键字:函数 一个 调用      更新时间:2023-10-16

我正试图调用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");

有人能告诉我我在这里做错了什么吗?

感谢您的帮助!

你在谷歌上搜索过吗?

MS支持称原因是:

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

并且您应该

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

相关文章: