06 内存断点

Posted onetrainee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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     

 

以上是关于06 内存断点的主要内容,如果未能解决你的问题,请参考以下文章

GDB无法插入断点,无法访问地址XXX处的内存? [复制]

Android 逆向代码调试器开发 ( 代码调试器功能简介 | 设置断点 | 读写内存 | 读写寄存器 | 恢复运行 | Attach 进程 )

使用GDB进行断点调试

C 中的共享内存代码片段

为啥这段js代码设置断点单步调试能够走通,得到结果;但取消断点直接运行就不行了?

如何使用模块化代码片段中的LeakCanary检测内存泄漏?