Chinaunix首页 | 论坛 | 博客
  • 博客访问: 342396
  • 博文数量: 107
  • 博客积分: 2825
  • 博客等级: 少校
  • 技术积分: 795
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-19 12:19
文章分类

全部博文(107)

文章存档

2013年(2)

2012年(31)

2011年(18)

2010年(12)

2009年(44)

我的朋友

分类: LINUX

2012-02-28 16:54:20

Ollydbg 中断方法浅探-各种断点常识知识

Ollydbg是一个新的32位的汇编层调试软件。适应于windows98、me、2000、xp和2003操作系统。由于他具有图形窗口界面,所以操作方便、直观,是cracker的好工具。
由于Ollydbg没有了TRW2000的万能断点,所以许多的新手感觉到用Ollydbg断点不好找。现在我来的说说Ollydbg下中断的几种方法。本人是个菜鸟,水平有限,可能不能完整的写出来,也可能存在错误。请大家指正。
我所表述的是Ollydbg v1.09d中文版,其他版本和英文版下自己参考。

第一 寻常断点
Ollydbg中一般下中断的方法,就是在程序的地址处用鼠标选择这一行。然后按F2键,这时被选择的那一行的地址会变成别的颜色,就表示这个地址处下了中断。然后运行程序时只有到这个地址处就会被Ollydbg中断。
这个方法用的比较多,所以把他称作寻常断点。
如果有命令行插件,就可以在命令窗口中输入BPX xxxxxxxx 下断点。
优点:只要自己怀疑是重要的代码处都可以下这种下断点,不受条件的限制,所以方便实用。
缺点:如果不知道代码功能下断点具有盲目性。

第二 API断点
Ollydbg中一般下API中断的方法,有二种。
1.在代码窗口中点鼠标右键,出现功能菜单。在[搜索]选择项下有〔当前模块的名称〕和〔全部模块的名称〕俩项,选择其中的一项就打开了程序调用API的 窗口,在这个窗口中选择你要跟踪的API函数名。双击这个函数就能到程序的调用地址处。然后用F2下中断。也可以在API窗口中选择需要跟踪的函数点鼠标 右键出现功能菜单,选择〔在每个参考设置断点〕。同样下了断点。
快捷方式:Ctrl+N
2.在命令行窗口中输入BPXAPI函数名或者BPAPI函数名 后回车。这时出现了所有调用这个函数的地址的窗口,在这个窗口中可以看到调用这个API函数的地址已改变了颜色。说明下好了断点。
说明一下:BPX一般中断在程序调用API的地址处。BP会中断在API的写入地址处。二这有所不同,根据需要选择。
优点:这种方法下的断点是针对每一个API函数的,所以具有明确的目的。
缺点:关键的API函数不容易找到。所以有时下的断点没有作用。

第三内存断点(跟踪关键数据的断点)
Ollydbg中的内存断点相当于TRW中的bpm 断点。
下断点的方法是:在程序运行中断时选择界面中的转存窗口,用光标选择内存中的一段关键数据(颜色会改变),然后右击鼠标出现功能菜单。选择〔断点〕项,其中有二个选择〔内存访问〕和〔内存写入〕。
〔内存访问〕断点是程序运行时要调用被选择的内存数据时就会被Ollydbg中断,根据这个特点在破解跟踪时只要在关键数据内存中下中断就可以知道程序在 什么地方和什么时候用到了跟踪的数据。对于一些复杂算法和流程变态的算法跟踪有很大的帮助。从破解上讲,一个注册码的生成一定是由一些关键数据或者原始数 据计算来的。所以在内存中一定要用到这些关键数据。那么〔内存访问〕断点就是最好的中断方法。
〔内存写入〕断点是程序运行时向被选择的内存地址写入数据时就会被Ollydbg中断。根据这个特点在破解时可以跟踪一个关键数据是什么时候生成的,生成的代码段在那个地方。所以一个关键的数据如果不知道他的由来就可以用〔内存访问〕断点查找计算的核心。
内存中断的下断点还有另外的一种方法:程序运行时如果知道关键的数据,比如我们输入的试验码、程序生成的序列号等。这时在内存中一定存在这些数据。用 Alt+M打开内存窗口,在这个窗口中搜索知道的关键数据。用光标选择这些数据同样下内存中断,这种方法更容易找的关键的数据。
优点:断点是直接面向关键数据的,所以比较容易到核心部分。
缺点:内存断点重新运行后会消失,干扰比较多。

第四硬件断点(跟踪关键标志的断点)
硬件断点是Olldbg所特有的断点,他不会因为重新运行就销毁,只要不删除。跟踪这个程序时就有效。但他在98系统下会不起作用。
硬件断点是根据关键标志回逆到关键代码的好方法。下中断的方法和内存断点的方法相同,有三个方式〔硬件访问〕、〔硬件写入〕、〔硬件执行〕。一般用前2 个。他也同样有内存断点的特性,所以可以用内存断点的地方也可以用硬件断点。这里介绍利用他来跟踪注册标志的使用方法,一般软件的注册都用到了标志比较。 即在内存地址中有一个标志,在判断是不是注册时比较标志的值。不同的值表示不同的注册状态。这个标志的地址一般比较固定。根据这个特点可以下硬件断点来跟 踪标志位是什么地方被标志的。
方法:在转存窗口中选择到标志存放的内存地址处,然后选择标志值。下〔硬件写入〕中断(根据标志的字节下不同的长度)。重新运行程序你会发现 Ollydbg会不断的中断在这个标志的内存地址处。在功能菜单的〔调试〕选项下选择〔硬件断点〕就打开了硬件断点的窗口,在这个窗口中选择〔跟踪〕,这 时转存窗口就会来到被下中断的内存地址处。运行程序跟踪内存地址中的值就会知道被赋标志的代码,跟踪到计算的核心。〔硬件访问〕的使用可以知道程序在运行 时多少地方用到了这个注册标志。对于破解复杂效验的程序十分的有效。
直接在命令栏里下bh ****硬件断点

以上只是我的总结,本想每个方法用一段例子,无奈时间有限,请大家原谅了。
当然,还是许多的下中断的方法,本人水平有限,不能一一尽述。只当抛砖引玉,请大侠们赐教。

中国破解组织[OCN][BCG][FCG]

 

欢迎!我高兴地为你推出命令行插件的初始版本,功能很有限但非常适用。它的源代码是自由的,因此你可以添加任意的命令和修改现存的功能。插件所使用的 Ollydbg 新函数在PDK 1.08中有详细的描述。 注意该插件不能工作在1.08及以前版本的 Ollydbg中。


命令行插件的快捷组合键:Alt+F1。目前,它支持如下的命令:

 

表达式

CALC 表达式 计算表达式的值

? 表达式同上

表达式 (第一个字符不能是字母)同上

WATCH 表达式添加监视

W 表达式同上

反汇编器

AT 表达式在反汇编中跟随

FOLLOW 表达式同上

ORIG前往实际的 EIP

*同上

转存和堆栈

D 表达式在转存中跟随

DUMP 表达式 同上

DA [表达式] 转存为汇编格式

DB [表达式] 转存为十六进制(hex)字节格式

DC [表达式] 作为ASCII 文本转存

DD [表达式] 作为地址(堆栈格式)转存

DU [表达式] 作为 UNICODE 文本转存

DW [表达式] 转存为十六进制(hex)字格式

STK 表达式在堆栈中跟随

汇编

A 表达式 [,命令]在地址处汇编

标号和注释

L 表达式, 标号为地址指派符号标号

C 表达式, 注释在地址处作注释

断点命令

BP 表达式 [,条件]在地址处设置 INT3 断点

BPX 标号在当前模块内部的每个调用外部'标号'处设置断点

BC 表达式删除地址处的断点

MR 表达式1 [,表达式2]设置访问范围的内存断点

MW 表达式1 [,表达式2]设置写入范围的内存断点

MD移除内存断点

HR 表达式在访问地址处设置一个字节的硬件断点

HW 表达式在写入地址处设置一个字节的的硬件断点

HE 表达式在执行地址处设置硬件断点

HD [表达式] 移除地址处的硬件断点

跟踪命令

STOP暂停执行

PAUSE同上

RUN 运行程序

G [表达式]运行到地址处

GE [表达式] 跳过意外的句柄并运行到地址处

S单步进入

SI同上

SO单步跳过

T [表达式]跟踪进入到地址处

TI [表达式] 同上

TO [表达式] 跟踪跳过到地址处

TC 条件 跟踪进入到条件处

TOC 条件跟踪跳过到条件处

TR执行到返回

TU执行到用户代码

Ollydbg 窗口

LOG 查看日志窗口

MOD 查看可执行模块

MEM 查看内存窗口

CPU 查看 CPU 窗口

CS查看调用堆栈

BRK 查看断点窗口

OPT 编辑选项

杂项命令

EXIT关闭 Ollydbg

QUIT同上

OPEN [文件名]打开待调试的可执行文件

CLOSE关闭调试的程序

RST 重新载入当前程序

HELP显示本帮助

HELP Ollydbg显示 Ollydbg 帮助

HELP API函数帮助完整文件名显示 API 函数帮助

命令不区分大小写, 中括号中的参数是可选的。表达式可以包含常量, 寄存器和内存参考并支持所有标准的算术和逻辑操作符。默认情况下,所有常量都是十六进制的数。要标记为十进制的常量,紧接着使用十进制标明。例如:


?2+2 ?计算该表达式的值;


?AT [EAX+10] ?在地址EAX+0x10处开始的双字长度内存的内容反汇编;


?BP KERNEL32.GetProcAddress ?设置 API 函数断点。注意:你仅可以在基于NT 系统的系统 DLL 上设置断点;


?BPX GetProcAddress ?在当前所选模块中的每个调用外部函数 GetProcAddress 处设置断点;


?BP 412010,EAX==WM_CLOSE - 在 0x412010 处设置条件断点。当 EAX 的值等于WM_CLOSE 时程序暂停。


你可以在 Ollydbg 帮助中找到 Ollydbg支持的完整的表达式描述。


译者注:由于本人的“E”文水平有限,加之对该插件和与之相关的Ollydbg 软件以及其他知识的理解深度不足,译文难免在很多地方产生歧义甚至在语义上根本不通顺,鉴此,欢迎各位专业人士积极修正。汉化:张小平 网络浪子工作室

 

如何添加新命令:

要添加新命令,首先你必须在数组 cmdlist[] 里注册它。数组的元素是结构类型的 t_command. 第一个元素是大写字母的命令,第二个元素描述它的操作数。当前版本的插件只支持三种类型的操作数:


A ?在 address 中使用值的地址表达式 address. 插件检查为它已分配内存的指针。


a ?等同于 A 但可选。如果未指定表达式,address 被置为0。


V ?在value 中任意类型的表达式。如果你期望整数表达式,检查 value.dtype 是 DEC_DWORD 并使用 value.u 的内容。


v ?等同于 V 但可选。如果未指定表达式,value.dtype 是 DEC_UNKNOWN 并 value.u 为 0。


S - 在 string 中的 ASCII 串,可能为空。


第三个元素是将被跳过命令过程的常量,

第四个是执行命令的过程地址:


typedef int t_exefunc(char *answer,ulong parm);


如果可识别命令的所有操作数被正确解析和评估,插件调用该过程。首先是变元,answer,是长256个字节的串指针。命令被执行后它的内容会被显示在命令行窗口中。第二个变元是从 cmdlsit[] 取出的参数。如果函数的返回值为 0,说明命令正确执行并将其添加到历史列表中。


Ollydbg1.10汉化版有些地方意思翻译得不准确

例如“调试选项”中的"sfx"中的“停止在自释放解释器的入口”这句话的翻译根本就是错的。原文是Stop at entry of self-extractor,原文意思为“Ollydbg doesn't attempt to trace real entry.”就是“Ollydbg不试图跟踪真实入口”。还有一些类似的翻译也是错的。容易引起误解,建议大家还是用英文原版,不懂的看帮助文件。
请教:怎么在Ollydbg中保存当前正在调试的程序?
在代码区修改程序后,点右键-》复制到可执行文件-》选择部分,在弹出的窗口里点右键-》保存文件。起个文件名吧。

Ollydbg 常用快捷热键

聆风听雨整理
===============================================================
打开一个新的可执行程序 (F3)

重新运行当前调试的程序 (Ctrl+F2)

当前调试的程序 (Alt+F2)

运行选定的程序进行调试 (F9)

暂时停止被调试程序的执行 (F12)

单步进入被调试程序的 Call 中 (F7)

步过被调试程序的 Call (F8)

跟入被调试程序的 Call 中 (Ctrl+F11)

跟踪时跳过被调试程序的 Call (Ctrl+F12)

执行直到返回 (Ctrl+F9)

显示记录窗口 (Alt+L)

显示模块窗口 (Alt+E)

显示内存窗口 (Alt+M)

显示 CPU 窗口 (Alt+C)

显示补丁窗口 (Ctrl+P)

显示呼叫堆栈 (Alt+K)

显示断点窗口 (Alt+B)

打开调试选项窗口 (Alt+O)
我想知道在OD中如何下地址断点
比如bpx 5022e2
是不是在命令行中?有其他办法没?
命令行在98下不能用


ctrl+g输入地址,F2下断
请问用Ollydbg如何跟踪被跟踪进程的子进程

我在跟踪一个程序的时候,它用CreatProgressA产生了一个子进程,然后关闭父进程,请问我如何在子进程的入口处下断?请高手指教!
指令为:
0045447650PUSH EAX
004544776A 00PUSH 0
00454479E8 C218FBFFCALL kernel32.CreateProcessA

00454479处堆栈内容如下:
0012FD4000000000|ModuleFileName = NULL
0012FD4400956B94|CommandLine = "C:\QXJDGL\QXJDGL.DLL 2"
0012FD4800000000|pProcessSecurity = NULL
0012FD4C00000000|pThreadSecurity = NULL
0012FD5000000000|InheritHandles = FALSE
0012FD5400000020|CreationFlags = NORMAL_PRIORITY_CLASS
0012FD5800000000|pEnvironment = NULL
0012FD5C00000000|CurrentDir = NULL
0012FD600012FD84|pStartupInfo = 0012FD84
0012FD640012FD74\pProcessInfo = 0012FD74

飞叶流枫回答:
C:\QXJDGL\QXJDGL.DLL 2,这个程序是一个EXE程序,你可以改入口点为INT 3,也就是CCh,将OD设为最终异常处理程序。当程序启动的时候会产生一个INT 3非法操作,你点调试就可以中断在QXJDGL.DLL中了。

阅读(1987) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~