MaximeLionel 发表于 2022-11-4 16:00

小白提问 - 关于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了。
所以请教各位大佬,这个是什么原因导致的呢?是否可以规避?有什么其他方法可以获得所在内核进程的基地址吗?

非常感谢!欢迎讨论!

MaximeLionel 发表于 2022-11-5 10:29

我好像找到原因了:
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]
查看完整版本: 小白提问 - 关于EAC逆向问题