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

时间: 2024-10-11 16:38:00

06 内存断点的相关文章

OD内存断点初步分析

内存断点原理: 内存断点原理,通过将内存断点所在内存页的属性修改为内存断点属性(non-access or non-writable),程序执行时,对目标内存页中所有数据的访问或写,都会抛出异常,OD通过截获此异常,然后对比,存储在某一内存的内存断点信息表的地址,判断是否匹配内存断点地址范围,匹配则中断程序执行,否则,继续执行. IDA静态分析: 本例利用IDA和OD动静结合,分析OD内存断点基本流程,以及内存断点存储在哪儿段内存地址. 首先将OD丢进IDA中,在程序函数列表中搜索breakpo

内存断点调试的原理

内存读写断点的实现,是把相关内存页属性设置为PAGE_NOACCESS,这样当此页内内存被读写的时候会有异常传给调试器. 当异常传给调试器时候,debugee进程被挂起,调试器把内存页属性重新修改回去,同时设置一个单步调试断点.这样debugee进程才可以正常执行过去,否则会一直被挂起.因为被设置了单步调试断点,所以执行一个指令就再次挂起,交给调试器去处理. 这时候调试器把页面属性重新修改为PAGE_NOACCESS就可以了.

认识OD的两种断点

OllyDBG从原理上来区分,有两种不同的断点:软件断点和硬件断点. 也许会有朋友说那不是还有内存断点吗? 内存断点严格来说是属于一种特殊的软件断点. 内存断点: 内存断点每次只能设置一个,假如你设置了另一个内存断点,则上一个会被自动删除. 设置一个内存断点,会改变整块(4KB)内存的属性,哪怕你只设置一个字节的内存断点. 另外还需要提一下的是,内存断点会明显降低OD的性能,因为OD经常会校对内存. 软件断点: 当我们按下F2设置的断点就是软件断点. 设置该断点的原理是在断点处重写代码,插入一个

断点 技术相关

继续研究一下OD实现部分中 断点相关的技术: 1.普通断点: 1.1 OD的处理方法是将指令的第一个字节替换成CC,造成中断.为什么可以?(因为它属于int3中断  的代码) 这个INT 3指令,其机器码是CCh,也常称为CC指令.当被调试进程执行INT 3指令导致一个异常时,调试器就会捕捉这个异常从而停在断点处,然后将断点处的指令恢复成原来指令.当然,如果自己写调试器,也可用其他一些指令代替INT 3来触发异常. 用INT 3断点的好处是可以设置无数个断点,缺点是改变了原程序指令,容易被软件检

常见的2种断点方法

[常见的2种断点方法] 1.中断断点. 2.内存断点. 常见的2种断点方法,码迷,mamicode.com

如何对抗硬件断点--- 调试寄存器

1.前言 在我跨入ollydbg的门的时候,就对ollydbg里面的各种断点充满了疑问,以前我总是不明白普通断点,内存断点,硬件断点有什么区别,他们为什么 有些时候不能混用,他们的原理是什么,在学习了前辈们的文章以后,终于明白了一些东西.希望这篇文章能让你对硬件断点的原理和使用有一些帮助 2.正文-------------------------------------------------- i.硬件断点的原理 在寄存器中,有这么一些寄存器,它们用于调试.人们把他们称为调试寄存器,调试寄存器

windbg-bp、 bm、 bu、 bl、 bc、 ba(断点、硬件断点)

bp bp 命令是在某个地址下断点, 可以 bp 0x7783FEB 也可以 bp MyApp!SomeFunction . 对于后者,WinDBG 会自动找到MyApp!SomeFunction 对应的地址并设置断点. 但是使用bp的问题在于: 1)当代码修改之后,函数地址改变,该断点仍然保持在相同位置,不一定继续有效: 2)WinDBG 不会把bp断点保存工作空间中 bp  Address或bp 伪寄存器或bp符号名称: 0:000> x Simple1Demo!CSimple1DemoAp

烫烫烫”——调试基础断点篇

很多人都应该见过“烫烫烫”这个神一般存在的字符串,一旦“烫烫烫”出现的时候,就说明你玩坏了——指针越界,访问到了非法内存. 那么为啥是“烫烫烫”,跟断点有啥关系? INT 3 我们在用VC进行调试时,常常会观察到一块刚分配的内存或字符串被填满了“CC”,而0xCCCC正好是“烫”这个汉字的GB2312编码.另外很巧的是 0xCC又正好是INT3指令的机器码.这显然不是什么巧合,而是我们的编译器故意这么做的.至于原因,先看INT3这条指令是干嘛的? x86架构下提供了一条专门用来支持调试的指令,即

Android手机内存管理与性能优化视频教程下载

下载:http://pan.baidu.com/s/1skkSdI1密码:kdcs 01.Dalvik介绍及其优势和文件格式 02.基于栈与基于寄存器比较 03.DEX与ODEX文件格式和ODEX化详解 04.GC垃圾回收机制 05.内存监测分析工具DDMS介绍 06.内存分配跟踪工具DDMS_Alocation Tracker详解 07.监测工具与分析工具介绍及File Explorer 08.释放对象的引用和Context的使用 09.Adapter和图片处理及循环变量使用不当 10.查询数