小白提问 - 关于EAC逆向问题
请教各位大神,我在用IDA逆向某内核软件的时候,发现下面的函数,很容易看得出下面的信息:[*]函数功能:获得当前进程IMAGE的内存基地址
[*]实现逻辑:
[*]通过IoGetCurrentProcess获得EPROCESS结构的指针;
[*]与0xFFFFFFFFFFFFF000ui64做与操作获得当前虚拟页面的地址;
[*]使用while循环,通过逐页(减去页大小0x1000)与特征码0x5A4D进行比对,寻找该进程的image基址。
__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了。
所以请教各位大佬,这个是什么原因导致的呢?是否可以规避?有什么其他方法可以获得所在内核进程的基地址吗?
非常感谢!欢迎讨论! 我好像找到原因了:
Once we have an address somewhere in the kernel, we can scan backwards one page (0x1000 bytes) at a time until we get to the PE header of the kernel image. This trick relies on two major assumptions:
1. PE images are page aligned
2. The memory space between the leaked address and the base of the kernel is contiguously mapped
We will see later that #2 isn't true on newer versions of Windows.
在新版本的windows系统中,也就是说PE文件加载到内存后并不是连续分布的。
页:
[1]