一个进程内有:
模块A(a.dll),有一个函数f();
模块B(b.dll);
模块C(c.dll);
还有自己X(x.exe);大家知道GetModuleHandle(NULL)可以返回创建进程的模块,这个例子里就是X。
但是当模块B或C调用模块A的f()函数时,f()函数体里如何得调用者模块的HMODULE?
模块A(a.dll),有一个函数f();
模块B(b.dll);
模块C(c.dll);
还有自己X(x.exe);大家知道GetModuleHandle(NULL)可以返回创建进程的模块,这个例子里就是X。
但是当模块B或C调用模块A的f()函数时,f()函数体里如何得调用者模块的HMODULE?
(HMODULE)Hinstance进行转换就行了
其实f()模块是注入别人的进程里的,所以你要别人进程里的其他模块传module handle给f()是不可能的。to: holyeagle(一杯清茶)
theApp.m_hInstance是进程实例句柄没错,也是进程exe文件模块句柄也没错,
但我不是要这个, 你怎么还不知道问题呢!to: DentistryDoctor(牙科医生)
回答对口了,但是看来不简单,有没有简单点的?
如何获得?如果能准确获得的话就一切ok了,
因为以下函数能根据地址得到地址所在的模块:HMODULE ModuleFromAddress(LPVOID lpv)
{
MEMORY_BASIC_INFORMATION mbi;
memset(&mbi, 0, sizeof(mbi));
return VirtualQuery(lpv, &mbi, sizeof(mbi)) ? (HMODULE)mbi.AllocationBase : NULL;
}
f是你自已写的,你当然知道调用方式和参数
插汇编,直接使用esp,加上参数,加上你的局部变量就可以得到调用函数地址了
{
struct {
int m1;
char *m2;
} v; //这种情况下如何计算返回地址?
//麻烦给个sample code吧,asm我已经不熟了啊
}
{
LPDWORD pdwPtr = NULL;
// Get parent address
_asm
{
mov EAX, dword ptr [ebp+4]
mov dword ptr [ebp-4], EAX
}
HMODULE hParent = ModuleFromAddress((LPVOID)pdwPtr);
MessageBox(NULL,"Test", NULL, MB_OK);
}
注意LPDWORD pdwPtr = NULL;前不要加参数,不然pdwPtr得不到地址.