请教各位大神,我在用IDA逆向某内核软件的时候,发现下面的函数,很容易看得出下面的信息:
- 函数功能:获得当前进程IMAGE的内存基地址
- 实现逻辑:
- 通过IoGetCurrentProcess获得EPROCESS结构的指针;
- 与0xFFFFFFFFFFFFF000ui64做与操作获得当前虚拟页面的地址;
- 使用while循环,通过逐页(减去页大小0x1000)与特征码0x5A4D进行比对,寻找该进程的image基址。
[C++] 纯文本查看 复制代码 __int64 get_currentproc_img_start_va()
{
_WORD *img_start_va; // rbx
char v1; // al
__int64 current_img_start_va2; // rcx
img_start_va = (_WORD *)((unsigned __int64)IoGetCurrentProcess & 0xFFFFFFFFFFFFF000ui64);
if ( !Current_Process_Img_Start_va )
{
while ( *img_start_va != 0x5A4D )
{
img_start_va -= 2048;
if ( !(unsigned __int8)MmIsAddressValid(img_start_va) )
return Current_Process_Img_Start_va;
}
v1 = get_img_nt_hdr_va((unsigned __int64)img_start_va, 0x1000ui64, 0i64, 0i64);
current_img_start_va2 = Current_Process_Img_Start_va;
if ( v1 )
current_img_start_va2 = (__int64)img_start_va;
Current_Process_Img_Start_va = current_img_start_va2;
}
return Current_Process_Img_Start_va;
}
我的问题是:
我尝试测试这个函数的时候,根本无法找到目标基地址,用Windbg研究了下,发现while ( *img_start_va != 0x5A4D )无法实现,经常在某个页面的时候MmIsAddressValid就返回0了。
所以请教各位大佬,这个是什么原因导致的呢?是否可以规避?有什么其他方法可以获得所在内核进程的基地址吗?
非常感谢!欢迎讨论! |