OllyDbg指令

OllyDbg指令,第1张

运行该指令不会对寄存器、内存以及堆栈造成任何影响,英文意思是”无 *** 作”,它没有特殊的用途袜拆激

例如,你用一个短指令来替换一个长指令的话,如果处理器没有错误多余的空间将会被NOP填充

适当数目的nop指令可以将其他指令完全替换掉

将 *** 作数压入堆栈,PUSH *** 作后会更新ESP指向新的栈顶地址,可 *** 作数值、寄存器和内存地址

堆栈保存数据窗口中颠倒过来的值,即倒序放置,读/写的内容在内存中倒序是处理器的特点之一

如data(CA 20 40 00)则stack(00 40 20 CA)

PUSH 401000 将数据401000压入栈

PUSH [401000] 取内存地址为401000中的数据压入栈

它会取出堆栈顶部的第一个字母或者第一个值,然后存放到指定的目标地址内存单元中

POP *** 作后会更新ESP指向新的栈顶地址

如,POP EAX从栈顶中取出第一个值存放到EAX中,随后的一个值随即变成栈顶

指令把所有通用寄存器的内容按一定顺序压入到堆栈中,相当于

"PUSH EAX,PUSH ECX,PUSH EDX,PUSH EBX,PUSH ESP,PUSH EBP,PUSH ESI,PUSH EDI"

PUSHA 等价于 "PUSH AX, CX, DX, BX, SP, BP, SI, DI"

与PUSHAD正好相反,它从堆栈中取值,并将它们放到相应的寄存器中,相当于

"POP EDI,POP ESI,POP ESP,POP ESP,POP EBX,POP EDX,POP ECX,POP EAX"

POPA 等价于 "pop DI, SI, BP, SP, BX, DX, CX, AX"

PUSHA,POPA/PUSHAD,POPAD在16位程序中使用,我们不感兴趣,OllyDbg是一个32位调试器

该指令将第二个 *** 作数赋值给第一个 *** 作数,如: MOV EAX, EBX

p2是寄存器也可能是内存单元,p1的位数比p2多,p2的符号位填充p1剩余部分

如:

EAX = 00000000,BX = F000

MOVSX EAX,BX

执行后EAX = FFFFF000,因为F000是负数,所以EAX的高位用F填充

EAX = 00000000,BX = 7FFF

MOVSX EAX,BX

执行后EAX = 00007FFFF,因为7FFF是正数,所以EAX的高位用0填充

16位范围0000~FFFF, 正 0000~7FFF, 负8000~FFFF

32位范围00000000~FFFFFFFF, 正 00000000~7FFFFFFF, 负80000000~FFFFFFFF

MOVZX类似于MOVSX,但是这种情况下,剩余的部分不根据第二个 *** 作数的正御链负来进行填充

剩告袜余的部分总是被填充为0

类似于MOV指令, 但是第一个 *** 作数是一个通用寄存器,并且第二个 *** 作数是一个内存单元。

当计算的时候要依赖于之前的结果的话,那么这个指令就非常有用。

如:

LEA EAX, DWORD PTR DS:[ECX+38]

在这个例子中,LEA指令就计算ECX + 38的值,然后将计算的结果赋值给EAX

因为完成的是赋值 *** 作,所以我们会认为 *** 作数是内存单元中的值,

但实际上, *** 作数仅仅是内存单元的地址,而不是里面的内容

该指令交换两个 *** 作数的值

如:

XCHG EAX,ECX

EAX的值将被存放到ECX中,反之亦然,也可以交换寄存器和内存单元的值

最简单的方法是启动OllyDbg,点击File|Open,然后选择你想调试的程序。程序需要命令行参数输入对话框下方的文本栏。

重新开始调试最后一个程序的快捷键是Ctrl+F2,并且OllyDbg使用相同的参数。

你也可以点选历史记录。把程序拖入OllyDbg也可以开始调试。

当然,当启动OllyDbg时,你在命令行中也能指定被调试的程序名和参数。比如:

你可以创建桌面快捷方式指向OllyDbg,选择属性,到快捷方式,把程序名加入目

标栏。每次你双击这个快捷图标,OllyDbg自动装载被调试程序。

你可以attach OllyDbg到某个正在运行的进程。点击File|Attach,从列表中选择

该进程。注意:当你关闭OllyDbg,这个进程也会终止。不要试图attach系统进程

,这很可能使系统完全死机。(事实上,大多数情况下,OS不允许attach敏感进

程)

OllyDbg能作为just-in-time debugger。这需要在注册表中登记。点击

Options|Just-in-time debugging,在对话框中按“Make OllyDbg just-in-time

debugger”。现在,当一些程序崩溃,你会被询问是否调试它。这样, *** 作系统

可以启动OllyDbg并直接停在异常发生处。如果你选择attaching without

confirmation,OllyDbg不会询问直接启动。要恢复原来的just-in-time

debugger,在出现的对话框中按相应的按纽就行了。

其它方法还有,把OllyDbg加入可执行文件的d出式菜单。点击Options|Add to

Explorer,按“Add OllyDbg to menu in Windows Explorer”。以后你可以右击

可执纳轮行文件点选OllyDbg。这个选项创建注册表键

HKEY_CLASSES_ROOT/exefile/shell/Open with OllyDbg and

HKEY_CLASSES_ROOT/exefile/shell/Open with OllyDbg/command

OllyDbg可以调试控制台(基于文本)程序。

注意:WindowsNT或Windows2000下,你必须有管理员权限

OllyDbg的help-通用快捷键(翻译)

Golbal shortcuts(通用快捷键)

这些快捷键在OllyDbg中通用,不依赖于当前活动窗口。

Ctrl+F2---OllyDbg重置,重新开始调试。如果没有活动程序,OllyDbg装入历史列表中的第一个程序。OllyDbg重置会释放内存移除硬断点

Alt+F2--关闭被调试的程序。如果程序还在活动状态,你纤塌会被询问是否执行该 *** 作。

F3--显示“Open 32-bit .exe file”对话框,这里可以选择可执行文件和指定参数

Alt+F5--使OllyDbg显示在屏幕最前方。如果被调试程序中断时显示窗口遮住OllyDbg的一些区域,不继续运行又不能移动或最小化它。激活OllyDbg按Alt+F5可以解决。如果你再次按Alt+F5,OllyDbg会恢复为普通窗口。OllyDbg的当前状态显示在状态栏。

F7--step into,执行下一条简单命令。如果该命令是一个函数调用,进入调用函数内部。如果命令有REP前缀,执行该命令的一步 *** 作。

Shift+F7--与F7相同,除了当被调试程序遇到某些异常时,首先尝试调用程序自己的异常处理过程。

Ctrl+F7--animate into,一步一步执行程序,也进入函数调用(就象你一直按着F7,不过更快)。当你执行一些单步或继续命令,程序到达有效断点,一些异常发生时,Animation终止。每步执行,OllyDbg重画所有窗口。要加速animation,关闭所有窗口而不要只改变现有窗口的大小。终止animation,也可按Esc。

F8-step over,执行下一条简单命令。如果该命令是一个函数调用,立刻执行完该函数(除非毁茄圆函数内部有断点或产生异常)如果命令有REP前缀,执行所有重复 *** 作,并停于下一条命令。

Shift+F8--与F8相同,除了当被调试程序遇到某些异常时,首先尝试调用程序自己的异常处理过程。

Ctrl+F8--animate over,一步一步执行程序,但不进入函数调用(就象你一直按着F8,不过更快)。当你执行一些单步或继续命令,程序Animation到达有效断点或异常发生时,Animation终止。每步执行,OllyDbg重画所有窗口。要加速animation,关闭所有窗口而不要只改变现有窗口的大小。终止animation也可按Esc。

F9--继续执行程序。

Shift+F9--与F9相同。除了当被调试程序遇到某些异常时,首先尝试调用程序自己的异常处理过程。

Ctrl+F11--run trace into,一步一步执行程序,要进入函数调用,记录寄存器内容。Run trace 不重绘CPU窗口.

F12-悬挂所有线程以停止程序执行。最好用继续键和菜单命令(像F9)恢复执行线程,而不要用其它手动方法恢复。

Ctrl+F12--run trace over,一步一步执行程序,不进入函数调用,记录寄存器内容。Run trace不重绘CPU窗口。

ESC--如果animation或跟踪正在进行,将被终止。如果CPU窗口显示跟踪时的数据,此时转为显示实际数据。

Alt+B--打开或恢复Breakpoint窗口。这里可以编辑,删除和观察断点。

Alt+C--打开或恢复CPU窗口。

Alt+E--打开或恢复模块列表

Alt+E--打开或恢复Call stack窗口。

Alt+L--打开或恢复Log窗口。

Alt+M--打开或恢复Memory窗口。

Alt+O--打开Option对话框

Ctrl+P--打开Patch窗口。

Ctrl+T--打开Pause run trace对话框

Alt+X-中断OllyDbg。

多数窗口可以使用下列快捷键:

Alt+F3--关闭活动窗口。

Ctrl+F4--关闭活动窗口。

F5--最大化或恢复活动窗口。

F6--激活下一个窗口。

Shift+F6--激活前一个窗口。

F10--打开激活窗口或面板的右键菜单。

LeftArrow--左移一个字符。

Ctrl+LeftArrow--左移一行。

RightArrow--右移一个字符。

Ctrl+RightArrow--右移一行。

OllyDbg的help-分析模块介绍(翻译)

分析

OllyDbg集成了快速超强的代码分析器。装载它,可以用d出式菜单或者CPU窗口

的反汇编栏按Ctrl+A或者在执行模块选“Analyze all modules”。

分析器非常有用。它在数据中分辨代码,标记入口点和jump的目标,辨认switch

tables,ASCII和UNICODE字符串,定位过程、循环、高级switch语句和解码标准

API函数参数(看范例)。OllyDbg的其它部分也广泛用于数据分析。

这怎么可能呢?我稍微介绍一下原理。首先,OllyDbg反汇编代码区所有可能的地

址,记下所有发现的调用及指向的目标。当然,许多这样的调用不正确,但是未

必会有两个错误的调用指向同一条命令,并且三个或三个以上更不可能。这样,

三个或更多调用指向同一地址,我就确信该地址是经常使用的子过程入口。从这

个入口开始,我跟踪所有的跳转和调用,反复 *** 作。这种方法使我99.9%确定所

有命令。然而,某些字节不在这条链中,我采用大约20个更高效的方法(最简单

的如:“MOV [RA],Ra"是无效命令).

过程检测也简单。过程,从分析器的角度看,就是从入口开始的代码的连续区域

,(理论上)可以到达其它命令(除NOP或对齐填充外)。你可以指定三种识别级

。Strict级严格确认一个入口和至少一个出口。heuristical级,分析器尝试确认

入口。如果你选择fuzzy级,或多或少相容的代码区被分离为过程。现代编译器把

过程分成几个部分作公用代码优化。这种情况下,fuzzy级特别有用!然而,误解

的概率也相当高。

类似的,loop是一个封闭的连续命令序列,这里最后的命令跳到开头、一个入口

几个出口。Loop相当于高级 *** 作语言中的do,while和for。OllyDbg能认识任何复

杂的嵌套循环。在反汇编区,他们用长长的大括号标记。如果入口不是循环的第

一条命令,OllyDbg用个小三角形作标记。

实现switch语句,多数编译器把switch变量装入寄存器,然后减去一部分,像下

面代码序列一样:

MOV EDX,<switch variable>

SUB EDX,100

JB DEFAULTCASE

JE CASE100 Case 100

DEC EDX

JNE DEFAULTCASE

... Case 101

这些序列也可能包含一级或两级switch表,直接比较,优化,填充等等。如果你

深入研究比较和跳转树,很难说哪一条命令是某个case语句。OllyDbg为你代劳。

它标记所有的case语句,包括default,甚至尝试猜测case的意思,如'A',

WM_PAINT 或者 EXCEPTION_ACCESS_VIOLATION。如果命令序列不修改寄存器(只

由比较命令构成),那么不大可能是switch语句,但可能是if嵌套:

if (i==0) {...}

else if (i==5) {...}

else if (i==10) {...}

让OllyDbg解码if嵌套为switch,选择Analysis1中相应的选项。

OllyDbg预置超过1900个常用API函数的描述。包括KERNEL32, GDI32, USER32,

ADVAPI32, COMDLG32, SHELL32, VERSION, SHLWAPI, COMCTL32, WINSOCK,

WS2_32 和 MSVCRT。你也可以加入自己的描述。如果分析器遇到已知函数名的调

用(或跳转到该函数),它尝试解码调用跟前的PUSH命令。因此,你可以粗略翻

译该调用的功能。OllyDbg也内置大约400个标准C函数的描述。如果你利用新库,

我建议你分析前先扫描对象文件。这种情况下,OllyDbg也会解码已知的C函数参

数。

如果选项“Guess number of arguments of unknown functions”被设置,分析

器尝试确认调用过程进栈的双字数目,并标记他们为参数Arg1,Arg2等等。注意:

如果有寄存器参数,OllyDbg还是不认识也不包括在上面的统计中。分析器采用了

一个安全的方法。例如,它不分辨无参数过程和返回前用POP恢复寄存器代替舍弃

参数的case语句。然而,能分辨出的函数数目相当多,并非常有助于提高代码的

可读性。

分析器能跟踪寄存器的值。现代优化编译器,特别是面向Pentium的,经常把常量

和地址装入寄存器便于重复使用或减小内存占用空间。如果一些常量装入寄存器

,分析器会注意它,并用于解码函数及其参数。还能执行简单的算术计算跟踪

push和pop命令。

分析器不能区别不同类型的名字。如果你用已有的名字命名一些函数,OllyDbg会

解码所有该地址的调用为原过程。WinMain,DllEntryPoint和WinProc是特殊的预

定义名。你可以使用这些标号标记主程序入口,DLL入口指针和window过程(注意

:OllyDbg不会检查用户定义标号的唯一性)。当然,最好的方法是显示已定义的

参数。

非常不幸,没有一般的规则用于100%的准确分析。有些情况下,例如当模块包含

p-代码或者代码区嵌入大量数据,分析器可能认为部分数据是代码。如果统计分

析显示代码可能被打包或加密,分析器会警告你。如果你想用hit跟踪方式,我建

议你不要用fuzzy分析方式,否则断点被设置在被误认为代码的数据上的几率很高。

自解压文件通常在主体代码外有解压代码。如果你选择SFX选项“Extend code

section to include self-extractor”,OllyDbg会扩大代码区,形式上允许分

析它并跟踪。

OllDbg的一般原理(翻译)部分

我希望你熟悉80x86兼容CPU的内部结构,并且有汇编写程序的经历。我也希望你

熟悉Microsoft Windows.

OllyDbg是一个单进程多线程的“机器代码级”debugger,用于Windows环境下的32位程序。它允许你debug和patch PE格式的可执行程序。OllDbg仅仅使用列入文档的Win32 API调用,所以可用于下一代32位Windows系统。OllDbg看来也可工作于Windows XP,但是我没有详尽的测试,因此不能保证功能完整。

OllyDbg不是面向编译器。它不含特别的规则显示某些情况下特定的编译程序生成哪些代码序列。因此,你可以一样对待任何编译器编译的,或者汇编书写的任何代码。

OllyDbg与被调试的程序同时工作。你可以浏览代码和数据、设置断点、停止或继续线程,甚至运行期修改内存(有时这叫作软调试方式)。当然,如果被请求的 *** 作不是最基本的,OllyDbg就会短时暂停程序,但这对用户透明。有时不在调试状态运行的程序会意外崩溃。OllyDbg,这个“及时”debugger,会指出异常发生的位置。

OllyDbg强烈面向模块。模块这里指启动时加载的或动态加载的主执行文件或动态连接库。在调试区,你可以设置断点,定义新标号和注释汇编语句。当一些模块从内存卸载后,OllyDbg保存这些信息到扩展名为.UDD名字同被调试模块的文件中。下次当装载这些模块时,OllyDbg自动复原所有调试信息,不论程序是否使用这些模块。比如:你调试使用Mydll的程序Myprog1,并且在Mydll中设置一些断点。那么当你调试Myprog2时,也使用Mydll,你会发现所有在Mydll中的断点还在那里,不管Mydll是否装载在不同的位置。

一些调试器把被调试进程的内存视为单个2**32字节区域。OllyDbg做了别的处理方法。内存由几个独立的块组成。任何内存 *** 作都限制于块内。在大多数案例中,这工作优良并且容易调试。但是模块包含几个执行部分等等,你将不能立刻看到整个代码。然而这些例外不常见。

OllyDbg是内存消耗大户。启动时就要分配3MB内存,甚至更多。每次分析,备份,跟踪或文件转储另外再分配。所以当你调试大工程时消耗40或60M内存很正常。

要有效的调试一些无源代码的程序,你首先必须理解它是如何工作的。OllyDbg提供了大量的手段使理解更容易

OllyDbg教程2007-10-16 12:57(以下内容全部来自网络)

预备知识

大多数壳都有一个共同的特点。在壳准备开始解压时都要执行PUSHAD,当壳解压

完时都要调用POPAD。到底PUSHAD和POPAD是什么干什么用的呢?其实PUSHAD是用来将

所有普通寄存器顺序进栈的指令,POPAD是所有普通寄存器顺序出栈指令。POPAD的出

栈顺序和PUSHAD相反。壳为了保护寄存器,便在解压前将所有寄存器进栈保护起来,

当解压完成后又将寄存器出栈,恢复其原貌,并将IP设置为原程序的OEP。这样我们就

可以通过这个特点快速脱掉多种软件的壳。

32位程序级的调试器--ollyDbg,这个东东 *** 作简便,提示信息量大,介绍一些简单的 *** 作

快捷键:

F3,装入程序

F8,单步执行,不进入call

F9 (运行)

F7,单步执行,进入call

CTRL+F9,相当于trw2000的F12

ALT+F9,相关于trw2000的pmodule

F2,设置断点(相当于trw2000的F9)

CTRL+N(当前模块中的名称)

F12(暂定)

CTRL+F12(重新运行)

CTRL+F11(跟踪进入)

CTRL+T(设置条件)

CTRL+F7(自动步入)

CTRL+F8(自动步过)

CTRL+F9(执行到返回)

另转的快捷键使用方法如下

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)

窗口:

左上:代码区

左下:内存数据

右上:寄存器

右下:stack区

以下命令适用于 OllyDbg 的快捷命令栏插件(显示于程序的状态栏上方)

========================================================

CALC

判断表达式

WATCH

添加监视表达式

AT / FOLLOW

Disassemble at address

在地址进行反汇编

orIG

Disassemble at EIP

反汇编于 EIP

DUMP

Dump at address

在地址转存

DA

Dump as disassembly

转存为反汇编代码

DB

Dump in hex byte format

转存在十六进制字节格式

DC

Dump in ASCII format

转存在 ASCII 格式

DD

Dump in stack format

转存在堆栈格式

DU

Dump in UNICODE format

转存在 UNICODE 格式

DW

Dump in hex word format

转存在十六进制字词格式

STK

Go to address in stack

前往堆栈中的地址

AS + 地址 + 字符串

Assemble at address

在地址进行汇编

L + 地址 + 字符串

Label at address

在地址进行标号

C + 地址 + 字符串

Comment at address

在地址进行注释

BP

Break with condition

使用条件中断

BPX

Break on all calls

中断在全部调锋亏用

BPD

Delete break on all calls

清除位于全部调用的断点

BC

Delete breakpoint

清除断点

MR

Memory breakpt on access

内存断点于访问时

MW

Memory breakpt on write

内存断点于写入时

MD

Remove memory breakpoint

清除内存断点

HR

HW break on access

硬件中断在访问

HW

HW break on write

硬件中断在写入

HE

HW break on execution

硬件中断在执行

HD

Remove HW breakpoint

清除硬件断点

STOP

Pause execution

暂停执行

PAUSE

PAUSE

RUN

Run program

运行程序

Run till address

运行到地址

GE

Run and pass exception

运行和通过例外

SI

Step into

步入

SO

Step over

步过

TI

Trace in till address

跟踪进入直到地址

TO

Trace over till address

跟踪步过直到地址

TC

Trace in till condition

跟踪进入直到条件

TOC

Trace over till condition

跟踪步过直到条件

TR

Till return

直到返回

TU

Till user code

直到用户代码

LOG

View Log window

查看记录窗口

MOD

View Modules window

查看模块窗口

MEM

View Memory window

查看内存窗口

CPU

View CPU window

查看 CPU 窗口

CS

View Call Stack

查看 Call 堆栈

BRK

View Breakpoints window

查看断点窗口

OPT

Open Options

打开选项

EXIT / QUIT

Quit OllyDbg

退出 OllyDbg

OPEN

Open executable file

打开可执行文件

CLOSE

Close executable

关闭程序

RST

Restart current program

恢复当前程序

HELP

Help on API function

API 函数的帮助

ASM

Assemble (if command needs it's own addres, \"ASM COMMANDADDRESS\")

汇编 (如果命令需要自身的地址 \"ASM COMMANDADDRESS\")

DASM

Disassemble immediate opcode

反汇编直接的机器码

FR

Find reference to selected command/address

查找参考到选定的命令/地址

AC

Analyse code

分析代码

SN

Search for Name(label) in current module

在当前模块中搜索名称(标号)

SOB

Scan object files

扫描项目文件

Name: ollydbg 命令行帮助文件.rar Size: 6071 B

此文件的引用地址为:up/1141912360.rar

Name: OllyDbg-script v1.081命令中文解说.rar Size: 219473 B

此文件的引用地址为:up/1141912390.rar

Ollydbg 中断方法

Quote:

originally posted by dong at 2004-6-1 10:29 PM:

我问个问题

在od中怎么下断点呢??

现在有的程序一点注册就没反映了

这样的怎么下断点呢??

能介绍下什么情况下什么断点吗?

在转存中下硬件访问->Word"断点,下断之后,怎么取消!

9398944(老菜鸟) 11:09:59

alt+D 按H 然后删除

这个没有万能的方法,只能视具体情况而定,就我的经验而言:

第一步,反汇编找有用信息,有时候虽然点击注册按钮后,没有任何反映,但软件也许包含了可用的信息,比如“未注册”,“已注册”等等之类的,都可用做断点的。

第二步,如果反汇编也找不到有用信息,如果用OD可以下HMEMECPY断点,在每个调用的函数上下断,虽然这个法子太笨,但我试过,几乎有70%以上的机会可找到断点,找到断点后再慢慢跟吧!这只是个人的看法,关键只要找到断点,有什么办法都无所谓。

在命令行下bpx hmemcpy断点,然后回车,在每个调用的函数上下断。

有的程序甚至无法用API中断,可以在OD载入程序后上下翻动反汇编窗口查看字符串参考下断,在反汇编窗口里直接找到的,右键查找那里找不到

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

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. 在命令行窗口中输入BPX API函数名或者BP API函数名 后回车。这时出现了所有调用这个函数的地址的窗口,在这个窗口中可以看到调用这个API函数的地址已改变了颜色。说明下好了断点。

说明一下:BPX一般中断在程序调用API的地址处。BP会中断在API的写入地址处。二这有所不同,根据需要选择。

优点:这种方法下的断点是针对每一个API函数的,所以具有明确的目的。

缺点:关键的API函数不容易找到。所以有时下的断点没有作用。

第三 内存断点(跟踪关键数据的断点)

Ollydbg中的内存断点相当于TRW中的bpm 断点。

下断点的方法是:在程序运行中断时选择界面中的转存窗口,用光标选择内存中的一段关键数据(颜色会改变),然后右击鼠标出现功能菜单。选择〔断点〕项,其中有二个选择〔内存访问〕和〔内存写入〕。

〔内存访问〕断点是程序运行时要调用被选择的内存数据时就会被Ollydbg中断,根据这个特点在破解跟踪时只要在关键数据内存中下中断就可以知道程序在什么地方和什么时候用到了跟踪的数据。对于一些复杂算法和流程变态的算法跟踪有很大的帮助。从破解上讲,一个注册码的生成一定是由一些关键数据或者原始数据计算来的。所以在内存中一定要用到这些关键数据。那么〔内存访问〕断点就是最好的中断方法。

〔内存写入〕断点是程序运行时向被选择的内存地址写入数据时就会被Ollydbg中断。根据这个特点在破解时可以跟踪一个关键数据是什么时候生成的,生成的代码段在那个地方。所以一个关键的数据如果不知道他的由来就可以用〔内存访问〕断点查找计算的核心。

内存中断的下断点还有另外的一种方法:程序运行时如果知道关键的数据,比如我们输入的试验码、程序生成的序列号等。这时在内存中一定存在这些数据。用Alt+M打开内存窗口,在这个窗口中搜索知道的关键数据。用光标选择这些数据同样下内存中断,这种方法更容易找的关键的数据。

优点:断点是直接面向关键数据的,所以比较容易到核心部分。

缺点:内存断点重新运行后会消失,干扰比较多。

第四 硬件断点(跟踪关键标志的断点)

硬件断点是Olldbg所特有的断点,他不会因为重新运行就销毁,只要不删除。跟踪这个程序时就有效。但他在98系统下会不起作用。

硬件断点是根据关键标志回逆到关键代码的好方法。下中断的方法和内存断点的方法相同,有三个方式〔硬件访问〕、〔硬件写入〕、〔硬件执行〕。一般用前2个。他也同样有内存断点的特性,所以可以用内存断点的地方也可以用硬件断点。这里介绍利用他来跟踪注册标志的使用方法,一般软件的注册都用到了标志比较。即在内存地址中有一个标志,在判断是不是注册时比较标志的值。不同的值表示不同的注册状态。这个标志的地址一般比较固定。根据这个特点可以下硬件断点来跟踪标志位是什么地方被标志的。

方法:在转存窗口中选择到标志存放的内存地址处,然后选择标志值。下〔硬件写入〕中断(根据标志的字节下不同的长度)。重新运行程序你会发现Ollydbg会不断的中断在这个标志的内存地址处。在功能菜单的〔调试〕选项下选择〔硬件断点〕就打开了硬件断点的窗口,在这个窗口中选择〔跟踪〕,这时转存窗口就会来到被下中断的内存地址处。运行程序跟踪内存地址中的值就会知道被赋标志的代码,跟踪到计算的核心。〔硬件访问〕的使用可以知道程序在运行时多少地方用到了这个注册标志。对于破解复杂效验的程序十分的有效。

直接在命令栏里下bh ****硬件断点

--------------------------------------------------------------------------------

OllyDbg

记住:工具栏的所有功能都能在菜单栏里找到,工具栏是菜单栏的快捷按钮(废话!)

各项详细功能我们在下面说!

再往下看有四个窗口他们是代码窗(左上),寄存器窗口(右上),内存窗口(左下)和堆栈窗口(右下)

2*菜单栏各项命令功能

*文件(F)----这些命令用说吗?

&line____注意**该菜单的下部有你上次打开的纪录,该纪录保存有你上次未清除的断点**注意**

*查看(V)------这个菜单我只介绍一下我常用的,别的我不会!:-)

&line____执行模块(快捷键ALT+E):查看该程序使用的动态连接库(我的理解)

&line

&line____断点(快捷键ALT+B):这个是查看你所有的断点,(有时自己设到哪里都忘了,可以看一下)起到一个辅助功能.

我就会这么多!:-(

*调试(D)-------这个菜单是关键,不明白你就别调试软件了!也只说常用的!

&line_______运行(F9)加载程序后,运行!

&line

&line_______暂停(F12)

&line

&line_______单步进入(F7)遇见CALL就进!进入该子程!行话:"跟进去"

&line

&line______单步跳过(F8)遇见CALL不进去!不去管子程的内部!第一次粗跟的时候常用!

&line

&line______执行到返回(ALT+F9)就是执行到该子程的返回语句!

--------------------------------------------------------------------------------

Ctrl+F2---OllyDbg重置,重新开始调试。如果没有活动程序,OllyDbg装入历史列表中的第一个程序。OllyDbg重置会释放内存移除硬断点。

Alt+F2--关闭被调试的程序。如果程序还在活动状态,你会被询问是否执行该 *** 作。

F3--显示“Open 32-bit .exe file”对话框,这里可以选择可执行文件和指定参数

Alt+F5--使OllyDbg显示在屏幕最前方。如果被调试程序中断时显示窗口遮住OllyDbg的一些区域,不继续运行又不能移动或最小化它。激活OllyDbg按Alt+F5可以解决。如果你再次按Alt+F5,OllyDbg会恢复为普通窗口。OllyDbg的当前状态显示在状态栏。

F7--step into,执行下一条简单命令。如果该命令是一个函数调用,进入调用函数内部。如果命令有REP前缀,执行该命令的一步 *** 作。

Shift+F7--与F7相同,除了当被调试程序遇到某些异常时,首先尝试调用程序自己的异常处理过程。

Ctrl+F7--animate into,一步一步执行程序,也进入函数调用(就象你一直按着F7,不过更快)。当你执行一些单步或继续命令,程序到达有效断点,一些异常发生时,Animation终止。每步执行,OllyDbg重画所有窗口。要加速animation,关闭所有窗口而不要只改变现有窗口的大小。终止animation,也可按Esc。

F8-step over,执行下一条简单命令。如果该命令是一个函数调用,立刻执行完该函数(除非函数内部有断点或产生异常)如果命令有REP前缀,执行所有重复 *** 作,并停于下一条命令。

Shift+F8--与F8相同,除了当被调试程序遇到某些异常时,首先尝试调用程序自己的异常处理过程。

Ctrl+F8--animate over,一步一步执行程序,但不进入函数调用(就象你一直按着F8,不过更快)。当你执行一些单步或继续命令,程序Animation到达有效断点或异常发生时,Animation终止。每步执行,OllyDbg重画所有窗口。要加速animation,关闭所有窗口而不要只改变现有窗口的大小。终止animation也可按Esc。

F9--继续执行程序。

Shift+F9--与F9相同。除了当被调试程序遇到某些异常时,首先尝试调用程序自己的异常处理过程。

Ctrl+F11--run trace into,一步一步执行程序,要进入函数调用,记录寄存器内容。Run trace 不重绘CPU窗口.

F12-悬挂所有线程以停止程序执行。最好用继续键和菜单命令(像F9)恢复执行线程,而不要用其它手动方法恢复。

Ctrl+F12--run trace over,一步一步执行程序,不进入函数调用,记录寄存器内容。Run trace不重绘CPU窗口。

ESC--如果animation或跟踪正在进行,将被终止。如果CPU窗口显示跟踪时的数据,此时转为显示实际数据。

Alt+B--打开或恢复Breakpoint窗口。这里可以编辑,删除和观察断点。

Alt+C--打开或恢复CPU窗口。

Alt+E--打开或恢复模块列表

Alt+E--打开或恢复Call stack窗口。

Alt+L--打开或恢复Log窗口。

Alt+M--打开或恢复Memory窗口。

Alt+O--打开Option对话框

Ctrl+P--打开Patch窗口。

Ctrl+T--打开Pause run trace对话框

Alt+X-中断OllyDbg。

多数窗口可以使用下列快捷键:

Alt+F3--关闭活动窗口。

Ctrl+F4--关闭活动窗口。

F5--最大化或恢复活动窗口。

F6--激活下一个窗口。

Shift+F6--激活前一个窗口。

F10--打开激活窗口或面板的右键菜单。

LeftArrow--左移一个字符。

Ctrl+LeftArrow--左移一行。

RightArrow--右移一个字符。

Ctrl+RightArrow--右移一行。

--------------------------------------------------------------------------------

软件破解常用汇编指令

cmp a,b// 比较a与b

mov a,b// 把b值送给a值,使a=b

ret // 返回主程序

nop // 无作用,英文(no operation)简写,意思“do nothing”(机器码90)

(ultraedit打开编辑exe文件看到90相当汇编语句的nop)

call // 调用子程序,子程序以ret结尾

je或jz// 相等则跳(机器码是74或84)

jne或jnz // 不相等则跳(机器码是75或85)

jmp // 无条件跳(机器码是EB)

jb// 若小于则跳

ja// 若大于则跳

jg// 若大于则跳

jge // 若大于等于则跳

jl// 若小于则跳

pop xxx // xxx出栈

push xxx // xxx压栈

爆破无敌口诀

一条(跳)就死,九筒(90)就胡

(对应上面的2--修改为nop)

一条(跳)就胡,一饼(EB)伺候

(对应上面的1--修改为jmp)

(74) 变(75)

(84) 变 (85)

大家不懂不要紧,一定要先牢记,以后慢慢的理解。

--------------------------------------------------------------------------------

我在刚开始用OD的过程中也遇到了许多麻烦,可刚来论坛时对各个版块也不了解.又看到论坛的首页提示新手从这里开始,所以也没敢去其他版块(主要知道自己很菜).在遇到OD的问题时很是头痛,因为在这里没有关于OD的太多入门使用说明.今天在晕转时偶得下面文章,甚是欣喜,因为早有大哥指点,只是没找到而已.现在与和我一样的菜鸟分享.

OllyDBG 入门系列(一)-认识OllyDBG

http://bbs1.pediy.com:8081/showthre...threadid=21284(网通)

http://bbs.pediy.com/showthread.php...threadid=21284(电信)

OllyDBG 入门系列(二)-字串参考

http://bbs1.pediy.com:8081/showthre...threadid=21308(网通)

http://bbs.pediy.com/showthread.php...threadid=21308(电信)

OllyDBG 入门系列(三)-函数参考

http://bbs1.pediy.com:8081/showthre...?threadid=21330(网通)

http://bbs.pediy.com/showthread.php?threadid=21330(电信)

OllyDBG 入门系列(四)-内存断点

http://bbs1.pediy.com:8081/showthre...?threadid=21378(网通)

http://bbs.pediy.com/showthread.php?threadid=21378(电信)

OllyDBG 入门系列(五)-消息断点及 RUN 跟踪

http://bbs1.pediy.com:8081/showthre...?threadid=21532(网通)

http://bbs.pediy.com/showthread.php?threadid=21532(电信)

OllyDBG 入门系列(七)-汇编功能

http://bbs1.pediy.com:8081/showthre...?threadid=23873(网通)

http://bbs.pediy.com/showthread.php?threadid=23873(电信)

大哥编的:OllyDBG 入门系列教程.CHM

http://bbs1.pediy.com:8081/showthre...mppagenumber=1(网通)

http://bbs.pediy.com/showthread.php...mppagenumber=1(电信)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8274551.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存