【太多事情要做了,这部分难度对我来说又很大,先写一下大体框架,到时候具体函数逆向分析过程给写出来】
问题:
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