06 内存断点

【太多事情要做了,这部分难度对我来说又很大,先写一下大体框架,到时候具体函数逆向分析过程给写出来】

问题:

1. 内存断点的实现思路是什么?

2. 操作系统检测的流程是什么?

3. 如何设置与恢复内存断点?

1. 内存断点的设置

  内存断点分为两类:访问断点与写入断点。

  其本质是调用 VirtualProtected 来修改页(PTE)属性。

  1)访问断点,则将页的属性设置为 PAGE_NOACCESS。

  2)写入断点,PAGE_EXECUTE_READ。

2. 内存断点的处理流程

3. 设置与恢复内存断点:

  其本质就是调用 VirtualProtected,保存原来的页属性,改为新的页属性。

  当出现内存访问异常时,再将原来的属性恢复过来。

  注意:因为是修改页属性,你设置内存断点可能设置单个字节或字,因此这时当发生内存访问异常时,就需要判断是不是真正需要断下来的地址。

    如果是该页的其他地址,则放行;否则就断下。

 1     // 内存断点
 2     auto er = dbgEvent.u.Exception.ExceptionRecord;
 3     if (er.ExceptionInformation[0] == 0)
 4     {
 5         CString str;
 6         str.Format(L"���ϵ㱻����%X,er.ExceptionAddress = %X", er.ExceptionInformation[1], er.ExceptionAddress);
 7         setText(pdlg->m_edlog, str);
 8     }
 9 
10     DWORD dwProtect =0;
11     BOOLEAN isCommand = 0;
12 
13     isCommand = VirtualProtectEx(handle, (PVOID)er.ExceptionInformation[1], 1, oldProtote, &dwProtect);
14     
原文地址:https://www.cnblogs.com/onetrainee/p/11964512.html