gpt4 book ai didi

c++ - 使用 CreateToolHelp32Snapshot 找到加载的 dll,在 dll 中找到一个函数,然后调用它,GetProcAddress

转载 作者:行者123 更新时间:2023-11-28 08:24:13 26 4
gpt4 key购买 nike

我正在尝试获取 .dll 中函数的句柄。我正在创建一个 CreateToolHelp32Snapshot,然后枚举模块,直到找到我想要的那个 .dll,我想从那个 .dll 中找到一个特定的函数。如何正确调用 GetProcAddress() 以便在“that”.dll 中获取函数而不是另一个可能正在运行的实例?

上述问题的延续是,好的,所以我有一个函数句柄,我该如何实际调用它?

编辑:正如已经指出的那样。我已经在第 3 方应用程序地址空间中。如果 getprocaddress 不起作用,我如何使用 readprocessmemory 和必要的偏移量获取函数的入口点?

谢谢。

HANDLE h_th_32snap =  CreateToolhelp32Snapshot(0x8u, pid);
if( h_th_32snap == INVALID_HANDLE_VALUE )
{
printError( TEXT("CreateToolhelp32Snapshot (of modules)") );
return( FALSE );
}

// Set the size of the structure before using it.
me32.dwSize = sizeof( MODULEENTRY32 );

// Retrieve information about the first module,
// and exit if unsuccessful
if( !Module32First( h_th_32snap, &me32 ) )
{
printError( TEXT("Module32First") ); // show cause of failure
CloseHandle( h_th_32snap ); // clean the snapshot object
return( FALSE );
}

// Now walk the module list of the process,
// and display information about each module

BYTE *d_pointer_qtgui4_dll = 0x0;
do
{
_tprintf( TEXT("\n\n MODULE NAME: %s"), me32.szModule );
_tprintf( TEXT("\n Executable = %s"), me32.szExePath );
_tprintf( TEXT("\n Process ID = 0x%08X"), me32.th32ProcessID );
_tprintf( TEXT("\n Ref count (g) = 0x%04X"), me32.GlblcntUsage );
_tprintf( TEXT("\n Ref count (p) = 0x%04X"), me32.ProccntUsage );
_tprintf( TEXT("\n Base address = 0x%08X"), (DWORD) me32.modBaseAddr );
_tprintf( TEXT("\n Base size = %d"), me32.modBaseSize );

if(!wcsncmp(me32.szModule, L"QtGui4.dll", 255))
{

FARPROC test = GetProcAddress(GetModuleHandle( L"QtGui4.dll"),"?rowsInserted@QListView@@MAEXABVQModelIndex@@HH@Z");

}

} while( Module32Next( h_th_32snap, &me32 ) );

CloseHandle( h_th_32snap );

Greg,我很想知道为什么这是错误的?它不会抛出任何错误,但它也不起作用!

函数原型(prototype):

QWidget * QWidget::find ( WId id )   [static];

我尝试调用它:

hDLL = GetModuleHandle( L"QtGui4.dll");
if (hDLL != NULL)
{

func pointer_find = (func)GetProcAddress(hDLL,"?find@QWidget@@SAPAV1@PAUHWND__@@@Z");

if (!pointer_find)
{
// handle the error
FreeLibrary(hDLL);
//return SOME_ERROR_CODE;
}
else
{
// call the function
widget = pointer_find(my_hwnd);
}
}

最佳答案

不可能,GetProcAddress() 需要模块句柄。 HMODULE 仅在获取它的进程内有效。您必须执行与 GetProcAddress() 相同的操作,迭代 IAT 以找到入口点。并应用基地址偏移量。这对于另一个进程来说是非常痛苦的,因为你不能直接访问内存来读取 IAT。需要 ReadProcessMemory。

在目标进程中注入(inject)代码是唯一合理的做法。这也需要做我认为你接下来想做的事情,调用函数。代码注入(inject)技术在 codeproject.com 上有很好的介绍

关于c++ - 使用 CreateToolHelp32Snapshot 找到加载的 dll,在 dll 中找到一个函数,然后调用它,GetProcAddress,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4618906/

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