通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE(转)
2009-06-08 18:21
363 查看
在有些情况下需要得到函数调用者的模块名字。比如你想限制你的某个函数只能被自己某个特定的DLL调用。 或者比如在异常处理中你想了解是那个DLL/EXE抛出了异常。
API函数_ReturnAddress
和GetModuleHandleEx
函数可以帮助我们达到这个目的。以下代码演示它们的用法:
void
ShowCallerModuleName()
{
HMODULE
hCallerModule = NULL;
TCHAR
szModuleName[MAX_PATH] = _T(
""
);
void
*callerAddress = _ReturnAddress();
if
(GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (
LPCTSTR
)callerAddress, &hCallerModule))
{
GetModuleFileName(hCallerModule, szModuleName, ARRAYSIZE(szModuleName));
MessageBox(NULL, szModuleName, _T("Who is calling me?"
), MB_OK);
}
}
解释:
_ReturnAddress
可以给你所在函数的返回地址,也就是调用者的地址。
GetModuleHandleEx
可以给你某个地址所在的模块Handle 。 得到这个Handle 之后,就可以用GetModuleFileName 来得到模块的文件名了。
///////////////////////////////////////////////////////////////////////////////
扩展:
用在dll劫持的时候,在判断呼叫本DLL的主程序模块中,获取返回地址,可以在naked函数中用汇编获取返回地址
以下是我测试的代码,程序运行正确!11(可以在函数里面判断返回地址,这样可以对抗DLL劫持)
void __declspec(naked) test()
{
__asm pop returnaddress
char aa21[1024];
sprintf(aa21,"%08X",returnaddress);
MessageBox(NULL,aa21,NULL,NULL);
__asm jmp returnaddress
}
API函数_ReturnAddress
和GetModuleHandleEx
函数可以帮助我们达到这个目的。以下代码演示它们的用法:
void
ShowCallerModuleName()
{
HMODULE
hCallerModule = NULL;
TCHAR
szModuleName[MAX_PATH] = _T(
""
);
void
*callerAddress = _ReturnAddress();
if
(GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (
LPCTSTR
)callerAddress, &hCallerModule))
{
GetModuleFileName(hCallerModule, szModuleName, ARRAYSIZE(szModuleName));
MessageBox(NULL, szModuleName, _T("Who is calling me?"
), MB_OK);
}
}
解释:
_ReturnAddress
可以给你所在函数的返回地址,也就是调用者的地址。
GetModuleHandleEx
可以给你某个地址所在的模块Handle 。 得到这个Handle 之后,就可以用GetModuleFileName 来得到模块的文件名了。
///////////////////////////////////////////////////////////////////////////////
扩展:
用在dll劫持的时候,在判断呼叫本DLL的主程序模块中,获取返回地址,可以在naked函数中用汇编获取返回地址
以下是我测试的代码,程序运行正确!11(可以在函数里面判断返回地址,这样可以对抗DLL劫持)
void __declspec(naked) test()
{
__asm pop returnaddress
char aa21[1024];
sprintf(aa21,"%08X",returnaddress);
MessageBox(NULL,aa21,NULL,NULL);
__asm jmp returnaddress
}
相关文章推荐
- 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE
- [Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE
- [Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE
- [Windows编程] 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE
- 通过GetModuleHandleEx 得到函数调用者所在的DLL/EXE
- GetModuleFileName函数当前运行exe或dll的路径
- VC新建目录CreateDirectory、得到exe存放路径GetModuleFileName、获取当前目录GetCurrentDirectory、CFileDialog设置打开默认路径
- 通过CHtmlView::GetHtmlDocument函数得到HTML源文件
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?
- GetModuleFileName函数得到当前应用程序路径
- 使用GetModuleFileName函数获取当前程序所在目录
- 使用GetModuleFileName()获取当前.exe所在绝对路径,并且读取.ini配置文件
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?(转)
- 使用GetModuleFileName函数获取当前程序所在目录
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?
- AFX_MANAGE_STATE(AfxGetStaticModuleState())DLL导出函数包含MFC资源
- Sessions, Window Stations and Desktops(GetDesktopWindow函数得到的桌面句柄, 是Csrss.exe创建的一个窗口)
- delphi根据进程PID获取程序所在路径的函数(用OpenProcess取得句柄,用GetModuleFileNameEx取得程序名)
- WinAPI: GetModuleHandle - 获取一个模块(exe 或 dll)的句柄
- 通过 GetFileVersionInfo 获取EXE 或 DLL的各种资源 .