断点之软件断点的一些基本知识(INT3)

软件断点:
断点异常(INT 3) 属于陷阱类异常,当CPU 产生异常时候,其程序指针是指向导致异常的下一条指令,但是我们观察到的是
却指向当前的导致异常的这条指令(想计算机组成原理的实验 IP)
原因:在中断到调试器的时候,会把所有断点位置恢复成原先的指令,再交给用户
也就是DEC ebx

2.当我们设置断点的时候,调试器会把这里的本来指令的第一个字节保存起来 然后写入INT3指令,因为INT3为0xCC(11001100)一个
字节,所以设置和取消断点时候也只需要保存和恢复一个字节。
VC6把断点的设置信息(断点所在的文件和行位置)保存在和项目文件相同位置且相同主名称的一个.opt文件中,但是他不会保存
每个断点处应该被INT3指令替换掉的那个字节
原因:1.替换是在启动调试和时候和调试过程中动态执行的
2.我们可以在非调试状态下去注释行设置断点,它仅仅是记住该断点的位置信息,当真正调试时候(即被调试程序RUN起来),VC6才会取出OPT文件中的断点记录(我叫做静态罢了,虽然不贴切),射到目标代码的内存映像中,也就是保存此位置的原来的指令的第一个字节,再替换为0xCC,这叫做落实断点
3.断点命中(应用程序调试)执行例程函数
保存当前上下文,寄存器内容
断点指令我们在用户模式下的程序代码中,所以我们从用户模式要到内核模式,断点也是异常么,所以流程为:
有异常的进程正在被调试-->内核例程会把这个异常以调试事件的形式分发给用户模式的调试器。(内核的调试子系统函数会等待调试器的恢复,收到回复后,调试子系统的函数会层层返回,最后返回到异常处理例程,异常处理例程执行中断指令,让被调试的程序继续执行)
4.恢复执行

第一次调试返回后恢复之前的指令,那下次调试呢,调试器是利用单步执行标志,即执行完后又再一次的下断点到这
就可以多次在这里中断调试

5.INT3的特别用途
0xCC在汉语中是烫烫中,CC又是INT 3的指令的机器码,今天我才知道这不是偶然是编译器故意的,
1,为了辅助调试原来是编译器在调试版本时候会
用0XCC来填充刚刚分配好的缓冲区,这样堆栈溢出的时候。直接到INT 3指令中断到调试器
2.内存对齐(填充函数或者代码段末尾的空闲区域)c3->ret

6.局限性

原文地址:https://www.cnblogs.com/L-Sunny/p/8432628.html

时间: 2024-08-12 05:31:11

断点之软件断点的一些基本知识(INT3)的相关文章

OD常用断点之CC断点

在做Windows平台软件逆向时,Ollydbg是极其常用的逆向工具,动态调试功能非常强大.在调试过程中,断点的使用有助于确定关键的破解位置,今天讲解的内容是OD常用断点中的CC断点. CC断点有很多名称,比如普通断点.F2断点或者int3断点,每个名称都有它的来源.下面我们以crackme_01.exe为例子讲解一下如何设置CC断点以及其原理. 打开VM虚拟机,虚拟机中运行的操作系统为XP,接着使用OD载入crackme_01.exe.如下所示. 汇编窗口中展示的是crackme_01.exe

长沙软件培训:Java基础知识总结(一)

Java本身知识点非常多,长沙软件培训在这里不做全面论述,仅做为一个引子,以增进理解和记忆,欢迎各位朋友与我进行探讨,共同进步. Java基础知识总结(一) 1. import关键字 (1)import语句必须定义在所有的class定义之前. (2)import语句只是为编译器指明了一个路径,并不像C或C++中的#include,所以用import .*并不影响性能 2.Java中的类名与文件名 (1).在一个java文件中可以有多于一个类定义(更常见于某些组件的监听器类),但只能有一个 pub

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

打了断点但VS2010断点无效

在运行C++程序时,自己不小心按到了什么,前面还有效的断点,到了后面就无效了. 解决方法:按 Tab键 解决问题由来: 网上搜了方法 http://blog.csdn.net/pb09013037/article/details/20953637 http://blog.csdn.net/sj19890401/article/details/34157399 感觉太繁琐,刚才还能用自己也没做什么修改 当看到 通过比较文件发现是由于制表符Tab(0x09)引起的,原因不详. 这句话时自己就按了下键

北京28软件开发定制与信息化知识

近几年,信息技术不断创新,信息产业坚持发展,信息网络广泛普及,信息化成为全球经济社会发展的显著特征,并逐步向一场全方位的社会变革演进,21世纪,信息化对经济社会的发展的影响更加深刻.广泛应用.高度渗透的信息技术正孕育着新的重大突破.信息资源日益成为重要生产要素,无形的资产和财富. 互联网开辟了无限广阔的信息空间,成为信息传播和知识扩散的崭新的重要载体,同时也加剧了各种文化.思想的相互交流和融合.智慧城市的建设使得城市的管理和服务更加智能有效,信息安全的重要性与日俱增,成为我们要面对的共同挑战.

认识OD的两种断点

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

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

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

[Win32]一个调试器的实现(七)断点

[Win32]一个调试器的实现(七)断点 作者:Zplutor 出处:http://www.cnblogs.com/zplutor/ 本文版权归作者和博客园共有,欢迎转载.但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 断点是最基本和最重要的调试技术之一,本文讲解了如何在调试器中实现断点功能. 什么是断点 在进行调试的时候,只有被调试进程暂停执行时调试器才可以对它执行操作,例如观察内存内容等.如果被调试进程不停下来的话,调试器是什么也做不了的.要使

(转)调试程序时设置断点的原理

简单总结:有软件断点和硬件断点 软件断点:软件断点在X86系统中为中断指令INT 3,其二进制代码opcode是0xCC.当程序执行到INT 3指令时,会引发软件中断.操作系统的INT 3中断处理器会寻找注册在该进程上的调试处理程序.从而像Windbg和VS等等调试器就有了上下其手的机会.程序出错时常看到的”烫烫烫“.”锟斤拷“.”屯屯屯“等与这个终端指令有关 硬件断点:X86系统提供8个调试寄存器(DR0~DR7)和2个MSR用于硬件调试. 转自:https://zhuanlan.zhihu.