gpt4 book ai didi

c++ - 在注入(inject)的 DLL 中调用函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:27 26 4
gpt4 key购买 nike

我想在我创建的注入(inject) DLL 的远程进程中调用一个函数。

我已经成功地将我的 DLL 注入(inject):

CreateRemoteThread(pHandle, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("kernel32"), "LoadLibraryA"), pLibRemote, 0, NULL);

DllMain 被执行,DLL 以待机模式运行。我想做的是以某种方式调用远程加载的 DLL 以完成一些工作。

我试过像这样导出函数:

extern "C" __declspec(dllexport) void MyFunc(void)

然后像这样执行函数:

CreateRemoteThread(pHandle, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("mydll"), "MyFunc"), NULL, 0, NULL);

但它会导致崩溃。

我该如何解决这个问题?

最佳答案

调用 GetModuleHandle 将获得 DLL 的基础,因为它映射到您的进程(如果有的话)。所以你需要做的是首先确保导出 DLL 中的函数。您可以照原样做,也可以创建一个 .def 文件,如图所示 here .此后:

理论上

  1. 将DLL注入(inject)目标进程并获取其加载的基址
  2. 将 DLL 注入(inject)当前进程。使用 GetProcAddress 查找导出函数与 DLL 基址之间的偏移量。
  3. 将此偏移量添加到从第 1 步获得的基地址。在此位置CreateRemoteThread

实践

在进行 DLL 注入(inject)时,您可以获得将 DLL 加载到目标中的基础。

HMODULE hInjected;

hThread = CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE)( GetProcAddress( hMod,
"LoadLibraryW" ) ), lpAddress, 0, NULL );

// Locate address our payload was loaded
if( hThread != 0 ) {
WaitForSingleObject( hThread, INFINITE );
GetExitCodeThread( hThread, ( LPDWORD )&hInjected );
CloseHandle( hThread );
}

hInjected 将是注入(inject) DLL 的基础。然后我有另一个功能:

void* GetPayloadExportAddr( LPCWSTR lpPath, HMODULE hPayloadBase, LPCSTR lpFunctionName ) {
// Load payload in our own virtual address space
HMODULE hLoaded = LoadLibrary( lpPath );

if( hLoaded == NULL ) {
return NULL;
} else {
void* lpFunc = GetProcAddress( hLoaded, lpFunctionName );
DWORD dwOffset = (char*)lpFunc - (char*)hLoaded;

FreeLibrary( hLoaded );
return (DWORD)hPayloadBase + dwOffset;
}
}

它所做的是首先将有效负载加载到我们自己的虚拟地址空间中。然后,我们可以使用 GetProcAddress 来获取导出函数的地址。由此,我们可以得到函数相对于 DLL 基址的偏移量。将此偏移量添加到我们之前获得的 hInjected 将告诉我们应该在何处进行 CreateRemoteThread 调用。所以你可以像这样打电话:

BOOL InitPayload( HANDLE hProcess, LPCWSTR lpPath, HMODULE hPayloadBase, HWND hwndDlg ) {
void* lpInit = GetPayloadExportAddr( lpPath, hPayloadBase, "Init" );
if( lpInit == NULL ) {
return FALSE;
} else {
HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0,
lpInit, hwndDlg, 0, NULL );

if( hThread == NULL ) {
return FALSE;
} else {
CloseHandle( hThread );
}
}

return TRUE;
}

这是从 old project I have 中提取的所有代码.欢迎您获取代码并用它做任何您想做的事,但我知道如果我现在重写代码,我会做很多不同的事情。

关于c++ - 在注入(inject)的 DLL 中调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10057687/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com