能力值:
( LV15,RANK:520 )
|
-
-
2 楼
ebp+4里面保存了返回地址,要看啥调用约定,有的也直接是ESP保存的,我乱说的
|
能力值:
( LV12,RANK:360 )
|
-
-
3 楼
我要的不是返回地址,而是判断返回地址是哪个领域的
|
能力值:
( LV3,RANK:30 )
|
-
-
4 楼
光从API上看不出来吗,不懂问题~
|
能力值:
( LV15,RANK:520 )
|
-
-
5 楼
不懂驱动
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
我的理解,楼主说的用户领域应该是指返回地址是系统的dll还是可执行程序的模块吧。判断一个地址在哪个模块中可以通过枚举进程中的模块,并获取每个模块的地址范围来获得。应该是调用GetSystemInformation()。
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
同意楼上的…
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
6楼的方法可以
|
能力值:
( LV15,RANK:520 )
|
-
-
9 楼
嗨,这样一说,得到自己的加载基址,在得到代码的大小范围,判断这个地址是否在代码大小的范围里面就是了,
|
能力值:
( LV15,RANK:520 )
|
-
-
10 楼
不懂想干啥
|
能力值:
( LV12,RANK:360 )
|
-
-
11 楼
恩,但是这样过于繁琐,
|
能力值:
( LV12,RANK:360 )
|
-
-
12 楼
要是动态申请的内存,就无法判断了
|
能力值:
( LV12,RANK:210 )
|
-
-
13 楼
GetModuleHandleEx获取用户源码中某个函数的地址进行比较
|
能力值:
( LV12,RANK:360 )
|
-
-
14 楼
谢谢楼上的,网上搜了一下,等待测试!
在有些情况下需要得到函数调用者的模块名字。比如你想限制你的某个函数只能被自己某个特定的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
}
|
能力值:
( LV12,RANK:360 )
|
-
-
15 楼
但是动态申请的地址中CALL API 就不行了,还是换个方法吧
问2: 如何判断返回地址是系统DLL,注意是系统DLL~
|
能力值:
( LV15,RANK:520 )
|
-
-
16 楼
沙发,先沙发
|
能力值:
( LV15,RANK:520 )
|
-
-
17 楼
我以想干啥坏事呢,原来是对抗DLL劫持啊
|
|
|