美文网首页
软件纵横谈学习笔记(1)软件断点

软件纵横谈学习笔记(1)软件断点

作者: bluewind1230 | 来源:发表于2018-02-01 11:13 被阅读0次

int 3指令:

  • 机器码为1个字节,即0xcc
  • 没有数量限制
  • 局限:属于代码类断点,可以让CPU执行到代码段内的某个地址停下来,不适用与数据段和I/o空间
  • 原理解释:在VS中某一处按下F9,实际上是VS在那个位置插入了一条int 3指令(替换了那个字节,替换为cc
一个例子:
image.png

打开扫雷:


image.png image.png image.png

X ntdll!*readfile*

image.png
输入: u ntdll!NtReadFile
ntdll!NtReadFile这个命令可以在上面一个命令里面得到
image.png

在此函数地址设一个软件断点:


image.png

bp下软件断点,bl列出断点


image.png

让软件跑起来:g,可以看到程序加载模块,然后就开始读文件了,断点就命中


image.png

命令k:可以查看因为什么命中!


image.png
利用反汇编指令继续查看刚才那个断点位置:
image.png

调试器隐藏了int 3,如果非要看,怎么看??

先继续g一次,直到:(此时程序跑起来了)


image.png

再打开另外一个WinDbg:

image.png

以非入侵方式打开的话,只能进行只读操作!(但是这样够了)

image.png

反汇编同一个地址:
注意:因为有 int 3指令,故后面的指令被打乱了
Add 的机器码 00


image.png

小结:

调试器让一个程序g(运行)起来的时候,才能 把int 3写到内存里面, 当程序执行起来碰到这个断点断(break)下来的时候,把int 3恢复成原来的内容 ,断下来的时候看不到int 3,因为调试器把int 3替换掉的内容又恢复回去,所以我们看到的是原来的指令,g起来的时候,再把这条指令(int 3)写下去

(我的理解:一开始在某一处下了个软件断点,只有在调试运行的时候才将int 3指令写到那个刚刚下断点的地方, 然后程序执行起来碰到cc就会断下来(碰到cc就会触发异常),调试器立即int 3替换掉的内容又恢复回去,所以我们看到的是原来的指令,g起来的时候,再把这条指令(int 3)写下去)

值得注意的是,内存断点被触发后需要将EIP减1,还原内存数据,这样做是为了什么呢?
E912345678这是一条跳转指令,下了0xcc断点后变成了这样:
CC12345678,EIP不减1,CPU会从12345678处继续执行,这样下去,指令全部乱套.所以要将EIP减1
将EIP减1后,CPU重CC处执行,会继续触发异常,陷入死循环,所以要将内存数据还原
但是还原内存数据之后,这个断点下一次就不能使用了.
解决的办法就是恢复数据后触发TF断点,在TF断点触发时将CC重新写入.

举个例子:

E9 12345678 ,在这个指令地方下个int 3断点(软件断点)
将int 3指令写入下断点的地方,调试运行的时候刚执行完cc这个字节,就触发了这个异常,停下来,EIP-1(为什么要减1,如果不减1的话,下次执行就从12345678这里开始执行了,显然这是不行的!),同时,调试器立即int 3替换掉的内容又恢复回去,运行起来的时候,再把这条指令(int 3)写下去

注意:int3 是陷阱异常,陷阱异常就是当指令执行之后才会产生异常,因此,int3异常产生之后,eip就是已经执行了int 3指令之后的eip了,因此收到调试事件之后,需要将EIP减1,才能得到异常真正产生异常的地址;
在下软件断点之前,先读取一个字节的内存保存起来,再写入0xCC,执行完CC字节之后,产生异常,引发中断,中断之后,需将原先的一个字节的数据写回内存中,再将EIP-1

相关文章

  • 软件纵横谈学习笔记(1)软件断点

    int 3指令: 机器码为1个字节,即0xcc 没有数量限制 局限:属于代码类断点,可以让CPU执行到代码段内的某...

  • 软件纵横谈学习笔记(2)断点

    调试程序时,以在可能有问题的地方插入一条INT3指令,使得CPU在执行到这一点的时候停下来;实验: 在调试器中设置...

  • 软件纵横谈笔记(3)硬件断点与单步

    DR7对设置的硬件断点进行描述 DR0-DR3存放断点位置在设置(硬件)断点的时候,调试器帮助我们把我们要监视的地...

  • 软件测试学习笔记01——软件测试概述

    软件测试学习笔记01——软件测试概述 1、软件发展历史: 第一阶段:程序设计阶段:没有软件的概念,编程人员与使用人...

  • LLDB调试(二)

    前言: lldb断点类型: 软件断点:正在调试的二进制文件中的断点,在调试器应使用一种迫使 CPU发出软件中断(又...

  • 学习小组Day3笔记-Freeman

    学习笔记 学习笔记用了幕布做的,放上图片。 学习小结 今天学习了Linux环境下的软件安装,学习了软件安装的基本过...

  • GDB学习笔记(1)

    最近通过《软件调试的艺术》学习GDB,书刚读了大概三分之一,这里先记一些笔记:-) 缩写 基本操作 断点 b po...

  • 1.6 地球物理软件的安装

    相关软件 参考: GMT参考手册 GMT4 SAC学习笔记(一)——SAC安装 1.SAC的安装 1.1 下载软件...

  • Obsidian使用指南

    obsidian[黑曜石]学习目录 软件定位 一款支持Markdown格式的离线笔记整理软件 笔记整理归档功能很强...

  • 软件测试概述

    软件测试学习笔记 第一部分:软件测试概述 什么是软件缺陷 软件缺陷来源 软件测试对象 软件测试过程模型 测试生命周...

网友评论

      本文标题:软件纵横谈学习笔记(1)软件断点

      本文链接:https://www.haomeiwen.com/subject/ijxdzxtx.html