OllyDBG分析报告系列(1)---Int3断点

新人福利——OllyICE和xllydbg的区别和基本用法 OllyICE简称od,这是一款很古老的动态调试工具,在过去的许多年里,深受广大逆向程序员的喜好。但是由于些年的更新较少,并且在x64的版本上又没有大量的插件支持,所以程序员从使用od逐渐转为使用xllydbg,简称xdbg。当然在32位版本里,od的功能还是非常强大的,因为年头久,多种多样的插件也为其舔砖加瓦,甚至达到了几乎无可取代的地位。但是站在高处就要承受压力,随着名声越来越大,用户量越来越多,针对od的保护措施也层出不穷,这也给了xdbg一些机会。 阅读详情
作 者: driverox
时 间: 2008-05-19,16:45
链 接: http://bbs.pediy.com/showthread.php?t=65094

最近学习逆向,对OD本身做了个逆向,也算是一个小小的锻炼吧。呵呵,在这里以分析报告的形式贴出来,请大家批评指正。谢谢。

Ollydbg(以下均简称为OD)中的Int3断点的主要功能是:在需要下断点的执行代码处将原来的代码改成0xCC,程序执行到此处后会报一个Int3异常,由OD捕获并处理。当要执行该行代码时,将原来的代码改回来并执行,然后再恢复断点,这样就不会影响程序的正常运行了。
这里仅描述最常见的功能,其它的有兴趣的话可以分析一把。

先说明一下OD中的两个结构体,在IDA中,声明为如下格式:
t_bpoint用来保存Int断点的相关信息
00000000 t_bpoint        struc ; (sizeof=0x11)
00000000 addr         dd ?                    ; // Address of breakpoint
00000004 dummy      dd ?                    ; // Always 1
00000008 type         dd ?                    ; // Type of breakpoint, TY_xxx
0000000C cmd         db ?                    ; // Old value of command
0000000D passcount    dd ?                    ; // Actual pass count
00000011 t_bpoint        ends
其中:addr为断点的地址,dummy始终为1,type为断点的类型,cmd为要用0xCC替换的指令码,passcount为需要断下的次数,0表示每次都断下。

t_sorted结构体保存了一种有序的数据:
00000000 ; Descriptor of sorted table
00000000 t_sorted        struc ; (sizeof=0x138)
00000000 name[MAXPATH]   db 260 dup(?)     ; char  Name of table, as appears in error messages
00000104 n               dd ?                    ; int  Actual number of entries
00000108 nmax            dd ?                    ; int  Maximal number of entries
0000010C selected        dd ?                    ; int  Index of selected entry or -1
00000110 seladdr         dd ?                    ; ulong  Base address of selected entry
00000114 itemsize        dd ?                    ; int  Size of single entry
00000118 version         dd ?                    ; ulong  Unique version of table
0000011C data            dd ?                    ; void*  Elements, sorted by address
00000120 sortfunc        dd ?                  ; SORTFUNC  Function which sorts data or NULL
00000124 destfunc        dd ?                    ; DESTFUNC  Destructor function or NULL
00000128 sort            dd ?                    ; int  Sorting criterium (column)
0000012C sorted          dd ?                    ; int  Whether indexes are sorted
00000130 index           dd ?                    ; int  Indexes, sorted by criterium
00000134 suppresserr     dd ?                    ; int  Suppress multiple overflow errors
00000138 t_sorted        ends
name是结构体的名称,用来区别不同类型的结构体
n是数组元素的个数
itemsize是数组元素的大小
data 是指向各种数据结构数组的指针,这里使用的是int3断点,所以现在保存的是int3断点数据结构体数组的指针
---------------------------------------------------------------------------------------------------------------------------------

1)Int3断点的设置
int3断点的设置是通过消息来处理的,对应右键点击菜单中的切换,其对应的消息为1E;此外还有热键F2、双击反汇编窗口等也能切换int3断点,转入的函数虽然不同,但是调用设置int3断点的函数都是同一个,就不再举例了。传入相应参数调用函数00419974,改变int3断点,该函数的调用处如下:
004237C8   .  51                    push    ecx    ; |Arg6
004237C9   .  50                    push    eax    ; |Arg5 => 00000002
004237CA   .  6A 00                 push    0      ; |Arg4 = 00000000
004237CC   .  6A 00                 push    0      ; |Arg3 = 00000000
004237CE   .  6A 71                 push    71     ; |Arg2 = 00000071
004237D0   .  52                    push    edx    ; |Arg1 => 0040100C
004237D1   .  E8 9E61FFFF           call    00419974   ; /OLLYDBG.00419974

下面主要来分析上述的00419974这个函数,经过分析可知大致主要流程为:

1.    判断是否配置了“Warn when break not in code”为1,若为1的话,程序会先判断所下断点是否在代码区,不在的话,会显示警告消息,若用户选择继续,则会断下,否则退出;
2.    若没有配置上面的项目,则首先获得断点的类型(即断点类型的高位是否为2,若为2则删除断点,不为2则设置断点),检查该地址的断点是否已经存在,若存在,则删除断点,并退出;
3.    若该地址处无Int3断点,则设置断点,使用的是Setbreakpointext函数,其流程如下:
a)  获得断点在调试进程中实际地址;
b)  判断指令码是否有效(判断规则是:指令码与1F做与运算之后为3或13的时候,说明是断在指令码中间;1D、1E、1F是正常指令码,除此之外,其它的都是无法执行的指令码),无效的话,重新设置CPU窗口,显示错误提示并退出;
c)  在t_sorted结构中查找断点数据;
d)  若t_sorted中不存在该断点,则添加;
e)  判断被调试进程是否在运行状态,若在运行,则把所有的线程都挂起;
f)  读取断点所在地址的内存,若读取成功的话,调用WriteMemory写入0xCC断点(跟入WriteMemory后,发现是调用WriteProcessMemory这个API函数来下Int3断点的);
g)  恢复线程运行;
h)  显示信息在窗口中;
4.  若设置断点成功,则插入name并做其它的一些判断与显示操作,进而退出;

保存现场,提升栈帧空间,用于存放局部变量:
00419974  /$  55         push    ebp
00419975  |.  8BEC       mov     ebp, esp
00419977  |.  81C4 F8FBF>add     esp, -408
0041997D  |.  53         push    ebx
0041997E  |.  56         push    esi
0041997F  |.  57         push    edi
检查OD配置文件中的   “Warn when break not in code”是否为1,1为真,0为假,若上面的配置为0,则跳到下面的处理代码中:
00419980  |.  8B7D 14    mov     edi, dword ptr [ebp+14]
00419983  |.  8B5D 08    mov     ebx, dword ptr [ebp+8]
00419986  |.  833D C4574>cmp     dword ptr [4D57C4], 0  ; 4D57C4--Warn when break not in code
0041998D  |.  74 5E      je      short 004199ED  ;为0则跳转到下面的处理代码
检查传入的参数是否正确:
0041998F  |.  837D 0C 71 cmp     dword ptr [ebp+C], 71
00419993  |.  75 12      jnz     short 004199A7
00419995  |.  837D 10 00 cmp     dword ptr [ebp+10], 0
00419999  |.  75 0C      jnz     short 004199A7
先在t_sorted列表中查找int3断点,找不到返回8,并跳过取得模块信息部分:
0041999B  |.  53         push    ebx
0041999C  |.  E8 D703000>call    _Getbreakpointtype
004199A1  |.  F6C4 02    test    ah, 2    ;检查返回值是否为20h
004199A4  |.  59         pop     ecx
004199A5  |.  75 46      jnz     short 004199ED  ;不是则跳过取得模块信息部分
取得模块信息,并检查是否取得,若取得失败则跳转到显示断点错误消息分支:
004199A7  |>  53         push    ebx                       ; /Arg1
004199A8  |.  E8 6B44040>call    _Findmodule               ; /_Findmodule
004199AD  |.  59         pop     ecx
004199AE  |.  8BF0       mov     esi, eax
004199B0  |.  85C0       test    eax, eax  ;检查是否得到模块信息
004199B2  |.  74 0F      je      short 004199C3  ;没有得到则跳转到下面错误显示分支
004199B4  |.  3B5E 0C    cmp     ebx, dword ptr [esi+C]
004199B7  |.  72 0A      jb      short 004199C3
004199B9  |.  8B56 0C    mov     edx, dword ptr [esi+C]
004199BC  |.  0356 10    add     edx, dword ptr [esi+10]
004199BF  |.  3BDA       cmp     ebx, edx
004199C1  |.  72 2A      jb      short 004199ED
显示断点错误消息,若用户选择Yes则继续,否则退出:
004199C3  |>  68 2421000>push    2124                       &nb
ollydbg原理分析~硬件断点与int3 今天继续接着上次的分析,来继续分析OD原理,这次先分析OD最基本的功能,断点,单步和运行到指定位置。 类似的文章前辈们已经写了很多了,这里只是将前辈们的思路实践了一下,顺便加入一点自己的理解和认识! 一般载入OD之后,往往大家会先下断点,或者直接单步运行。 一般当我们着手分析一个程序的时候总是会下一个INT 3断点,其实这个就是F2的原理 随便载入一个程序,点一下F2,然后用ollydbg 阅读详情

相关推荐

Ollydbg之断点设置

目录预备知识1.断点2.INT3断点3.内存断点4.硬件断点实验目的实验环境实验内容和步骤1.熟练使用OD设置INT3断点2.了解使用OD设置内存断点3.了解使用OD设置硬件断点 预备知识 1.断点 断点,是调试器的核心功能之一,可以让程序中断在需要的地方,从而方便调试器对程序进行跟踪与分析。调试器对断点有记忆功能,可以在一次调试中设置断点,下一次可以让程序自动运行到上一次设置断点的位置中断下来。 调试器的断点功能是为了方便程序员调试程序,以检测程序的逻辑完整性和功能完整性。比如在几百行的程序源代码中,编译

ChuMeng1999的博客 2341

图解说明OllyDbg断点技术:INT3机制原理详解

深入剖析OllyDbg中实现断点的核心机制,重点讲解INT3指令在调试过程中的工作原理,结合图解方式清晰展示断点触发流程,帮助逆向工程师更好掌握ollydbg的底层调试技术。

weixin_30674431的博客 308

逆向---OD断点类型

1. INT3断点(CC断点) 设置方式:直接按F2键或使用bp命令设置。 原理:当执行一个INT3断点时,该地址处的内容被调试器用INT3(机器码是0xCC)指令替换。OllyDbg隐藏INT3指令,显示出来的仍然是中断前的指令。当调试进程执行INT3指令导致一个异常时,调试器会捕捉这个异常,从而停在断点处,然后将断点处的指令恢复成原来的指令。 优点:可以设置无数个断点。 缺点:改变了机器码,容易被软件检测到。 2. 硬件断点 设置方式:右键单击要断点的位置,选择“Breakpoint”-&gt

peng05的博客 2237

【加解密学习笔记:第三天】OllyDbg断点介绍

INT 3 断点 常用断点,使用“F2”快捷键设置的就是 INT 3 断点。这类断点采用修改机器码的方式,将设断处的代码更改为 “CC”,当程序运行至设断处时,会抛出一个异常,OllyDbg会捕捉到这个异常,使得程序暂停,然后恢复程序机器码。INT 3 断点可以设置无限多个,但是由于 INT 3 断点更改了机器码,所以很容易被目标软件检测到。 硬件断点 硬件断点与 DRx 调试寄存器有关,在Int...

sinat_35794373的博客 695

【汇编】OllyDbg使用方法

1. 主窗口界面 反汇编面板: 被调试程序在反汇编后显示在该面板窗口中,显示的信息分为四列,从左到右依次为:地址、数据、反汇编代码和注释 主要关注的是反汇编代码列,该列将指令以汇编代码的形式显示,从而让用户在汇编层次上对程序进行调试 寄存器面板窗口: 该窗口将程序运行时用到的寄存器的值都列了出来,其中寄存器的值发生变化时颜色会变为红色 堆栈面板窗口: 该窗口显示的是程序执行时的堆栈信息...

AudreyQCb的博客 1717

核心要点解析:OllyDbg在用户态下断点类型的差异

深入剖析OllyDbg在用户态调试中各类断点(INT3、硬件、内存断点)的触发机制与适用场景,结合实际调试案例说明ollydbg如何精准控制执行流,揭示不同断点在稳定性、隐蔽性和兼容性上的关键区别。

weixin_42591908的博客 884

[网络安全自学篇] 七十六.逆向分析之OllyDbg动态调试工具(二)INT3断点、反调试、硬件断点与内存断点

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文分享了Vulnhub靶机渗透题目bulldog,包括信息收集及目录扫描、源码解读及系统登陆、命令注入和shell反弹、权限提升和获取flag。这篇文章将讲解逆向分析之OllyDbg动态调试工具,包括INT3断点、反调试、硬件断点和内存断点。基础性文章,希望对您有所帮助。

杨秀璋的专栏 9846

[系统安全] 二十四.逆向分析之OllyDbg调试INT3断点、反调试、硬件断点与内存断点

作者前文介绍了OllyDbg动态调试工具的基本用法,包括界面介绍、常用快捷键和TraceMe案例分析。这篇文章将讲解逆向分析之OllyDbg动态调试工具,包括INT3断点、反调试、硬件断点和内存断点。 这些基础性知识不仅和系统安全相关,同样与我们身边常用的软件、文档、操作系统紧密联系,希望这些知识对您有所帮助,更希望大家提高安全意识,安全保障任重道远。本文参考了B站yxfzedu、安全网站和参考文献中的文章,并结合自己的经验和实践进行撰写,在此感谢这些大佬们。

杨秀璋的专栏 7166

【愚公系列】2023年06月 逆向分析之Ollydbg(断点设置)

软件断点:在目标程序中插入的断点,可通过修改程序指令来实现调试控制。硬件断点:在CPU或存储器中设置的断点,可以捕获读取/写入操作,或者是当CPU执行到特定地址时暂停程序执行。内存断点:可以监视指定内存地址的读取、写入或执行操作,从而帮助解决内存访问问题。要设置断点,首先需要在Ollydbg中找到要断点的位置。可以手动在代码窗口中找到,也可以使用搜索功能来找到有特定特征的位置。然后,右键单击要断点的位置,选择断点类型(软件断点、硬件断点或内存断点),并设置断点选项(例如,仅在特定条件下停止执行)

愚公智库 4万+

OllyDBG分析报告系列

OllyDBG分析报告系列1-8 OllyDBG分析报告系列(1)---Int3断点 OllyDBG分析报告系列(2)---内存断点 OllyDBG分析报告系列(7)---文件加载调试原理 OllyDBG分析报告系列(8)---进程加载调试原理 OllyDBG分析报告系列(6)---OD异常处理机制

基于PCA的故障诊断方法(matlab)

1. PCA原理分析 PCA的原理主要是将原始数据进行降维。其具体工作原理参照:CodingLabs - PCA的数学原理 2. 数据预处理 训练数据集(只有正样本)为维数据,即有n个采样值,每个采样值有m个特征。 2.1 数据归一化 将数据X针对每个特征归一化为均值为0,均方根为1的数据。 其中: 3. PCA降维 3.1 首先求取协方差矩阵 协方差矩阵的公式为: 计算出来的协方差矩阵为特征m*m维矩阵。 3.2 求取特征值和特征向量 求取协方差矩阵R的特征值.

tangxianyu的博客 1万+

python等级考试——一级知识点汇总(不包含turtle画图)

本篇文章是针对中国电子学会青少年编程等级考试的,适合初学者以及青少年编程学习者

weixin_65350557的博客 9037

frp内网穿透(socks隧道)

在实验过程中还是遇到了挺多的问题,但好在大多都解决了。不过还是遗留了一些不懂的问题,等以后再慢慢研究了。最后,以上仅为个人的拙见,如何有不对的地方,欢迎各位师傅指正与补充,有兴趣的师傅可以一起交流学习。

2301_76227305的博客 1万+

CANoe VLAN配置的艺术:如何通过脚本自动化实现高效车载网络测试

本文深入探讨了CANoe VLAN配置的自动化实现,通过CAPL脚本与Python工具链的结合,提升车载网络测试效率。重点解析了硬件侧VLAN配置与软件侧VLAN配置的交互机制,并提供了实用的脚本开发示例和调试技巧,帮助工程师快速构建高效的自动化测试方案。

qqq44的博客 617

AI重塑运营商CRM:从传统办理到智能推荐的实战经验

本文探讨了AI技术如何重塑运营商CRM系统,从传统办理模式升级为智能推荐平台。文章首先分析了传统CRM系统在产品推荐效率、客户信息录入、业务流程和个性化服务等方面的痛点,提出AI赋能的解决方案。技术架构采用分层设计,包含智能推荐引擎、知识图谱系统和大模型集成三大核心模块。实战案例详细介绍了基于深度学习的智能推荐系统实现,包括用户行为特征提取、产品特征建模、推荐模型训练和实时推荐服务等关键组件代码实现,展示了AI如何提升运营商CRM系统的智能化水平和服务效率。

技术传感器的博客 1050

QT-使用ECharts显示地图,还有更多惊艳的图表等待你的使用

QT-使用ECharts显示地图前言一、使用步骤1.下载示例2. QT使用HTML文件配置3.使用HTML文件4. 数据交互及自适应总结注意:这个地图是百度的在线地图,需要百度API密钥和在联网的状态下使用。离线使用图表 前言 我上文QT图表chart-饼状图,使用qt自带的图表库charts来显示图表,实现数据可视化,但是QT自带的图表库显示效果并不佳,通俗说,就是不好看。 然而,有这么一个开源图表库,图表种类极多,并且效果良好,能够实现具有很好的视觉冲击的数据可视化。 它就是Apache ECharts

博咯的博客 4900

不用加速器!Google Earth Pro登录失败自救手册:从服务器连接到地图加载的完整排错流程

本文详细解析了Google Earth Pro登录失败的常见问题及解决方案,包括服务器连接失败、地图加载异常等。通过基础排查、内置修复工具使用和高级配置调整,帮助用户无需加速器即可解决启动问题、黑屏和转圈圈等困扰,提升软件使用体验。

weixin_29227425的博客 486

飞牛NAS系统盘占用过高排查与解决全记录(已有效解决)

📢NAS弹出系统盘占用过高预警?别慌!亲测解决全流程来啦~ 精准定位根源+安全迁移数据,附详细实操步骤,帮同款困扰的你高效释空间、少走弯路!

XiaoqiangClub的博客 3146

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: 常见自校检分析实例
下一篇: OllyDBG分析报告系列(7)---文件加载调试原理
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值