OllyDbg应用方法大全

OllyDbg应用方法大全!

所有文章均为散落在DFCG论坛各处或其他网络文集的经典。
雪很冷搜集整理于学习笔记或与朋友讨论之中


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 ****硬件断点

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


                                    Fxyang
                            属于中国破解组织[OCN][BCG][FCG]
                                       2003-10-1

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

例如“调试选项”中的"sfx"中的“停止在自释放解释器的入口”这句话的翻译根本就是错的。原文是Stop at entry of self-extractor,原文意思为“OllyDbg doesn't attempt to trace real entry.”就是“Ollydbg不试图跟踪真实入口”。还有一些类似的翻译也是错的。容易引起误解,建议大家还是用英文原版,不懂的看帮助文件。


修正转打造对抗 CMPXCHG8G 的 OD

【破文作者】 simonzh2000

【使用工具】 Ollydbg1.10B 英文版

【破解平台】 Win2000SP4 English

【软件名称】 Ollydbg1.10B 英文修改版  

【软件简介】 感谢OD的作者提供这么好的免费软件.

【修改声明】 现在好多壳软件都使用反调试技术, 我们需要对OD动点手术,才能顺利调试.
             我们整天用OD调试其他软件, 今天也让他尝尝被调试的滋味. hehe.


1. 修改 Window Caption 和 ClassName
   这一步就不多说了, 将 Ollydbg.exe 拷贝到 CMD.EXe, 用 UltraEdit 打开CMD.EXE,  
   搜索 OllyDBG 字符, 替换为个性化字符, 下面以 ZSMOZSM 为例

2. 复制 Ollydgb.ini 到 ZSMOZSM.ini
   这样一来, 你原来的配置就生效了, 以后也不需要 Ollydbg.exe 了

3. 最近好多壳开始利用 CMPXCHG8B 非法指令, 弹出警告, 去掉他.


From Intel
===============================================================================================

CMPXCHG8B—Compare and Exchange 8 Bytes

Opcode Instruction Description
0F C7 /1 m64      CMPXCHG8B m64      
Compare EDX:EAX with m64. If equal, set ZF and load ECX:EBX into m64. Else, clear ZF and load m64 into EDX:EAX.
  Description
Compares the 64-bit value in EDX:EAX with the operand (destination operand). If the values
are equal, the 64-bit value in ECX:EBX is stored in the destination operand. Otherwise, the
value in the destination operand is loaded into EDX:EAX. The destination operand is an 8-byte
memory location. For the EDX:EAX and ECX:EBX register pairs, EDX and ECX contain the
high-order 32 bits and EAX and EBX contain the low-order 32 bits of a 64-bit value.

This instruction can be used with a LOCK prefix to allow the instruction to be executed atomically.

To simplify the interface to the processor’s bus, the destination operand receives a write
cycle without regard to the result of the comparison. The destination operand is written back if
the comparison fails; otherwise, the source operand is written into the destination. (The
processor never produces a locked read without also producing a locked write.)


Intel Architecture Compatibility

This instruction is not supported on Intel processors earlier than the Pentium processors.

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


从上面最后一行, 我们可以看到, 这条指令不能在 Pentium 以前的 CPU 上使用,
所以OD有一个警告框. 其实是多此一举, 现在谁还用 486 啊?
让我们去掉他.  

Linson 的新版仙剑刚刚出炉, 里面也有CMPXCHG8B, 我们就用他吧, Main.exe.


运行 Ollydbg.exe,  打开 CMD.EXE , F9, 现在桌面有两个 OD,
Ollydbg 是调试器, CMD.exe 就是被调试的程序, 别搞错了.

在 Ollydbg 里 Search For Name(label) in Current Module -- Name窗口, MessageBoxA ,Enter --  References窗口
有好多个对 MessageBoxA 的调用, Set BreakPoint on Every Command


切换到 CMD.EXE,  打开 Main.EXE, 被 Ollydbg.exe 断在这里

0045CC20  |.  6A 30         PUSH 30                                  ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0045CC22  |.  68 6A9F4B00   PUSH CMD.004B9F6A                        ; |Title = "Entry Point Alert"
0045CC27  |.  50            PUSH EAX                                 ; |Text
0045CC28  |.  52            PUSH EDX                                 ; |hOwner => 000A00CC ('zsmozsm - Main.exe - [CPU]',class='zsmozsm')
0045CC29  |.  E8 84100500   CALL <JMP.&USER32.MessageBoxA>           ; /MessageBoxA

这个就是 "Entry Point Alert" 对话框, F2取消断点, F9, 切换到 CMD.EXE, 点OK,  停在 Main.exe 入口点 412060 , F9,


再次被 OllyDBG.EXE 断下, 4340B8, 就是那个烦人的警告了, 去掉其他的断点.

0043402A  |.  6A 00         PUSH 0                                   ; /Arg7 = 00000000
0043402C  |.  8D8D 50F4FFFF LEA ECX,DWORD PTR SS:[EBP-BB0]           ; |
00434032  |.  6A 01         PUSH 1                                   ; |Arg6 = 00000001
00434034  |.  51            PUSH ECX                                 ; |Arg5 = 12E8B8
00434035  |.  6A 00         PUSH 0                                   ; |Arg4 = 00000000
00434037  |.  53            PUSH EBX                                 ; |Arg3 = 00412167 (Main.exe 中 CMPXCHG8B 的 VA)
00434038  |.  8B45 E8       MOV EAX,DWORD PTR SS:[EBP-18]            ; |
0043403B  |.  8D95 CCFDFFFF LEA EDX,DWORD PTR SS:[EBP-234]           ; |
00434041  |.  50            PUSH EAX                                 ; |Arg2 = 10h, 机器码长度最长 16 字节
00434042  |.  52            PUSH EDX                                 ; |Arg1 = 12F234, 放 Main.EXE 中 412167 开始的 16 字节
00434043  |.  E8 741EFEFF   CALL CMD._Disasm                         ; /_Disasm
                           ;   // 这个 CALL 将分析 412167 开始的 16 字节,  
                                                                     ;  // 找出最合理的一条机器指令, 返回机器指令长度   

00434048  |.  83C4 1C       ADD ESP,1C
0043404B  |.  8945 E8       MOV DWORD PTR SS:[EBP-18],EAX            ;  // 指令长度
0043404E  |.  837D 10 00    CMP DWORD PTR SS:[EBP+10],0              ;  // 判断是不是危险指令, 见 _Disasm 原程序.
00434052  |.  74 76         JE SHORT CMD.004340CA                    ;  // 将这条语句改成 JMP 4340CA, (74->EB), 就可以了
00434054  |.  F685 8DFAFFFF>TEST BYTE PTR SS:[EBP-573],30
0043405B  |.  74 6D         JE SHORT CMD.004340CA
0043405D  |.  80BD 54F8FFFF>CMP BYTE PTR SS:[EBP-7AC],0
00434064  |.  75 04         JNZ SHORT CMD.0043406A
00434066  |.  33C0          XOR EAX,EAX
00434068  |.  EB 15         JMP SHORT CMD.0043407F
0043406A  |>  80BD 54F9FFFF>CMP BYTE PTR SS:[EBP-6AC],0
00434071  |.  75 07         JNZ SHORT CMD.0043407A
00434073  |.  B8 01000000   MOV EAX,1
00434078  |.  EB 05         JMP SHORT CMD.0043407F
0043407A  |>  B8 02000000   MOV EAX,2
0043407F  |>  C1E0 08       SHL EAX,8
00434082  |.  8D95 54F7FFFF LEA EDX,DWORD PTR SS:[EBP-8AC]
00434088  |.  03C2          ADD EAX,EDX
0043408A  |.  53            PUSH EBX                                 ; /Arg4
0043408B  |.  50            PUSH EAX                                 ; |Arg3
0043408C  |.  8D8D DCFDFFFF LEA ECX,DWORD PTR SS:[EBP-224]           ; |
00434092  |.  68 B4484B00   PUSH CMD.004B48B4                        ; |Arg2 = 004B48B4 ASCII "%s Do you REALLY want to execute this code at address %08X?"
00434097  |.  51            PUSH ECX                                 ; |Arg1
00434098  |.  E8 2B130700   CALL CMD.004A53C8                        ; /CMD.004A53C8, sprintf()生成字符串
0043409D  |.  83C4 10       ADD ESP,10
004340A0  |.  8D85 DCFDFFFF LEA EAX,DWORD PTR SS:[EBP-224]
004340A6  |.  8B15 F4174D00 MOV EDX,DWORD PTR DS:[4D17F4]
004340AC  |.  68 34010000   PUSH 134                                 ; /Style = MB_YESNO|MB_ICONEXCLAMATION|MB_DEFBUTTON2|MB_APPLMODAL
004340B1  |.  68 F0484B00   PUSH CMD.004B48F0                        ; |Title = "Dangerous command"
004340B6  |.  50            PUSH EAX                                 ; |Text
004340B7  |.  52            PUSH EDX                                 ; |hOwner => 000A00CC ('zsmozsm - Main.exe - [CPU - m...',class='zsmozsm')
004340B8  |.  E8 F59B0700   CALL <JMP.&USER32.MessageBoxA>           ; /MessageBoxA


004340BD  |.  83F8 06       CMP EAX,6                                ; // 用户点 Yes, 继续执行
004340C0      74 08         JE SHORT CMD.004340CA
004340C2  |.  83C8 FF       OR EAX,FFFFFFFF
004340C5  |.  E9 F8060000   JMP CMD.004347C2
004340CA  |>  8BBD 54FAFFFF MOV EDI,DWORD PTR SS:[EBP-5AC]           ; // 这里执行
004340D0  |.  81E7 F0000000 AND EDI,0F0
004340D6  |.  837D 10 02    CMP DWORD PTR SS:[EBP+10],2


修改 434052 处 74 为 EB, Copy to Execute, 保存文件 CMD2.EXE , 退出ollydbg.EXE.

用 CMD2.EXe 打开 Main.EXE , 忽略所有异常, F9,  

在 412167 处异常, ExceptionCode = C000001E

Debug Option -- Exception -- Add last Exception -- Ignore custom Exception,  

Shift + F9, 这个异常要经过好多次, 等一会儿, 仙剑就运行了.

http://www.chinadfcg.com/viewthread.php?tid=2033



http://www.chinadfcg.com/viewthread.php?tid=277

修正我的抗Antidbgod 1.10b2含全部插件下载

在上面的基础继续增加这个加强版,去除了讨厌的入口警告和危险指令提示,可以调试Acprotect1.x和某些刻意Antiod的软件。

这次应该没有问题了,大家帮忙测试一下.

直接覆盖上一版,设置一下插件和od工作路径。

用修改版OD脱DLL壳的问题:

请教脱DLL壳时如何在载入DLL后退出,即卸载laddll
因为我看到书上说到的DLL脱壳全部是用TRW,而我却不知道如何用OD来具体操作
脱DLL,研究了几天无果。

和脱EXE绝对不一样。
DLL调用时两次用到入口点的。载入DLL和卸掉DLL时各一次
根据看雪破解2要求,一般在第2次解压调用时脱壳。
可是教材完全是用TRW,我就是不会用OD操作。
如果和EXE操作步骤一样就好办了


载入DLL
停在
10001000  /$  8B4424 04     MOV EAX,DWORD PTR SS:[ESP+4]
10001004  |.  A3 589A0010   MOV DWORD PTR DS:[10009A58],EAX
10001009  |.  B8 01000000   MOV EAX,1
1000100E  /.  C2 0C00       RETN 0C
10001011      90            NOP
10001012      90            NOP
10001013      90            NOP

点菜单
查看
执行模块
右键相击对应模块
点跟随入口
可以得到入口程序
1000E001 >  60              PUSHAD
1000E002    E8 03000000     CALL CAPTUREH.1000E00A
1000E007  - E9 EB045D45     JMP 555DE4F7
1000E00C    55              PUSH EBP
1000E00D    C3              RETN
1000E00E    E8 01000000     CALL CAPTUREH.1000E014
1000E013    EB 5D           JMP SHORT CAPTUREH.1000E072
1000E015    BB EDFFFFFF     MOV EBX,-13
1000E01A    03DD            ADD EBX,EBP
1000E01C    81EB 00E00000   SUB EBX,0E000
1000E022    83BD 22040000 0>CMP DWORD PTR SS:[EBP+422],0
1000E029    899D 22040000   MOV DWORD PTR SS:[EBP+422],EBX
1000E02F    0F85 65030000   JNZ CAPTUREH.1000E39A
1000E035    8D85 2E040000   LEA EAX,DWORD PTR SS:[EBP+42E]


但估计这是第一次解压DLL程序,DLL和EXE不同,无法跟踪。

教材中提到,卸载DLL时第2次调用解压。达到入口点
可能可以跟踪,但我不知道用OD如何卸掉DLL

兄弟是什么系统。莫非又是98在作怪
用的也是win98系统呀。对了,你用的OD是什么版本的,我的是10.0C汉化版






用原版OD后一切问题解决:
很简单,脱Dll的壳和EXE的方法一样,比如一个dll用UPX加的壳,你在载入的时候他会提示载入laddll,选是,然后选不分析,接下来就和脱EXE一样了,只要注意一下地址就行了,如EXE的虚拟地址是00400000,而Dll的地址是01000000的。但在修正入口的时候还是和EXE一样。如Dll入口地址是01001000的话,在修正入口点的时候应该是00001000才对。
你放上的附件是ASPACK2.12加的壳,脱壳后用FI查是C++编的,你先用OD载入这个dll,OD会提示用载入laddll,选是,然后选不继续分析,中断在壳的入口点。你先按F9运行程序,这时OD又会中断,在左下角提示dll初始化完成,你再按一下F9运行。这时Laddll就会启运一个程序窗口,你再关闭这个窗口,这个程序窗口就会卸载这个Dll了,这时OD又会中断在dll的入口,这时你就可以像脱EXE程序一样了。最后,谢谢你的程序(Dll),使我复习了一下脱Dll的方法并脱壳成功,只是不知能不能运行,现附上我脱的Dll:

我明白了,你用的是修改后的OD,现在你用没有修改过的OD试一试就不会有这个问题了。忘了说,我一般是用没有修改过的OD的。只是有时用一下。刚才我用修改过的OD载入也出现和你一样的问题,这个可能是二哥修改过的OD的Bug吧?

以上是战神和雪很冷的脱DLL壳讨论稿

请教:怎么在OLLYDBG中保存当前正在调试的程序?
在代码区修改程序后,点右键-》复制到可执行文件-》选择部分,在弹出的窗口里点右键-》保存文件。起个文件名吧。

以下命令适用于 OllyDbg 的命令行插件 Cmdline.dll(显示于程序的插件菜单中)
聆风听雨整理
===============================================================
命令行插件支持的命令

CALC
判断表达式

WATCH
添加监视表达式

AT
在指定地址进行反汇编

FOLLOW
跟随命令

ORIG
反汇编于 EIP

DUMP
在指定地址进行转存

DA
转存为反汇编代码

DB
使用十六进制字节格式转存

DC
使用 ASCII 格式转存

DD
转存在堆栈格式

DU
转存在 UNICODE 格式

DW
使用十六进制字词格式转存

STK
前往堆栈中的地址

AS
(AS + 地址 + 字符串)
在指定地址进行汇编

BP
进行条件中断(有条件的断点)

BPX
中断在全部调用 (Call)

BPD
清除全部调用中的断点

BC
清除断点

MR
内存断点于访问时

MW
内存断点于写入时

MD
清除内存断点

HR
访问时进行硬件中断

HW
写入时进行硬件中断

HE
执行时进行硬件中断

HD
清除硬件断点

STOP
停止运行程序调试

PAUSE
暂停执行程序调试

RUN
运行程序进行调试

GE
运行和通过例外

SI
单步进入 Call 中

SO
步过 Call

TI
跟踪进入直到地址

TO
跟踪步过直到地址

TC
跟踪进入直到满足条件

TOC
跟踪步过直到满足条件

TR
运行直到返回

TU
运行直到用户代码

LOG
查看记录窗口

MOD
查看模块窗口

MEM
查看内存窗口

CPU
查看 CPU 窗口

CS
查看 Call 堆栈

BRK
查看断点窗口

OPT
打开选项设置窗口

EXIT
退出 OllyDbg

QUIT
退出 OllyDbg

OPEN
打开一个可执行文件

CLOSE
关闭可执行文件

RST
重新运行当前程序

HELP
查看 API 函数的帮助

olldbg 下怎么下消息断点?

如在softice 中下 BMSG 0084 WM_DESTROY,在olldbg下该怎么做?

不如下断 SendMessage,PostMessage,程序中的消息不一定都经过消息循环。

Ollydbg下消息断点的一个方法

原文:
SoftIce can trace application messages. And Olly?
by FuZzYBiT

SoftIce can trace application messages. And Olly?
And so does OllyDbg. That’s a very “hidden feature”. I guess it is sooo useful.
1. Open program
2. Names window [CTRL+N in CPU Window]
3. Find User32.TranslateMessage API
4. right click/FindReferences
5. conditional breakpoint [SHIFT+F4]
6. expression: MSG
7. Log function arguments: Always
If you cannot find it, try right click SEARCH FOR-> ALL INTERMODULAR CALLS.
But if I want to trap a specific message like WM_COMMAND?
To Log Only WM_COMMAND
Do it in this fashion:
1. Open program
2. Names window [CTRL+N in CPU Window]
3. Find User32.TranslateMessage API
4. right click/FindReferences
5. conditional breakpoint [SHIFT+F4]
6. Condtion box: MSG==WM_COMMAND
7. Log function arguments: On Condition
If you can’t find User32.TranslateMessage API, do the same as above.

翻译:

SoftIce 能够跟踪应用程序的消息,那么OllyDbg呢?
by FuZzYBiT

OllyDbg也是可以的,那是一个非常"隐蔽的功能"。它是如此的有用。
1. 打开程序
2. 名字窗口[ 在CPU窗口中按CTRL+N ]
3. 查找 User32.TranslateMessage API
4. 右击/FindReferences(查找参考)
5. 下条件断点 [SHIFT+F4]
6. 表达式: MSG
7. 记录函数参数:永远

如果你不能找到它,试试右击鼠标,然后搜索全部模块中的名称。
但是如果我想要捕捉一个特定的消息如WM_COMMAND呢?
只对WM_COMMAND记录
用这个方法做:
1. 打开一个程序
2. 名字窗口[ 在CPU窗口中按CTRL+N ]
3. 查找 User32.TranslateMessage API
4. 右击/FindReferences(查找参考)
5. 下条件断点 [SHIFT+F4]
6. 条件框:MSG==WM_COMMAND
7. 记录函数参数: 条件满足时
如果你不能找到User32.TranslateMessage API,象上面那样做。

http://www.chinadfcg.com/viewthread.php?tid=4050

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)

转OllyDbg实用技巧六则

标题: OllyDbg实用技巧六则

作者:  dOSKEY lEE

关键词: OllyDbg、OD、技巧

1、让跳转路径显示出来

   打开Options/Debugging Option。弹出Debugging Option对话框,选择CPU页,选定“Show direction to jumps”、“Show jump path”和“Show grayed path if jump is not taken”。如此以来在  Disassembler窗口就会显示跳转的路径了。

2、让OD显示MFC42.DLL中的函数

   如果程序是用MFC进行的动态编译,那么在OD中将只能显示MFC42.DLL中的函数为:

00410E40  |.  E8 43000000  CALL    <JMP.&MFC42.#1576> 1576是函数在MFC42.DLL中的序号。打开Debug/Select import libraries,单击弹出的对话框中“Add”,在弹出的打开文件对话框中选择“MFC42.LIB”并打开,重新载入MFC程序,你就可以看见函数名称变为:

00410E40  |.  E8 43000000  CALL    <JMP.&MFC42.#1576_?AfxWinMain@@Y>

IDA中分析出了来的东西一样了!呵呵,以后不用等待IDA的“细嚼慢咽”也可以轻松搞定MFC程序了。其他的DLL类似,如果有序号,可以在VC的LIB目录中找到相关的.LIB文件,加到OD中便可。如果你没有“MFC42.DLL”,你可以的到看学论坛的下载区找,我已经上传到那里了。

3、让OD轻松躲过“ANTI-DEBUG”
   
   很多“ANTI-DEBUG”的程序都是在程序开始时来检查是否安装调试器的。用这种特性我们可以轻松的用OD的“Attach”绕过检查部分。如“X语言”,如果你哟内TRW2K/S-ICE/OD 直接加载它的话,程序回警告你安装了调试器并结束。但是我们在“X语言”开启后再运行OD,并用“Attach”系上它就就可以了,轻松通过检查。而且在OD系上它后仍然可以用CTRL+A进行分析。如此一来,快哉!:)

4、轻松对付调用“MessageBoxA”以及类似的模态对话框的程序
   
   很多人都认为OD不好拦截“MessageBoxA”这类API函数。其实我们有个很简单的办法将API拦截下来,并且快速找到比较地点/主算法地点。首先用OD加载目标程序,如果不能加载,用上面的方法“Attach”目标程序。然后,F9运行目标程序,并且有意让目标程序显示“ MessageBox”,然后切换到OD中,F12暂停,如

0041201F  |>  53            PUSH    EBX                    ; /Style
00412020  |.  57            PUSH    EDI                    ; |Title
00412021  |.  FF75 08       PUSH    [ARG.1]                ; |Text
00412024  |.  FF75 F4       PUSH    [LOCAL.3]              ; |hOwner
00412027  |.  FF15 A8534100 CALL    DWORD PTR DS:[4153A8]  ; /MessageBoxA
0041202D  |.  85F6          TEST    ESI, ESI              ; 停在此处
0041202F  |.  8BF8          MOV    EDI, EAX
00412031  |.  74 05         JE      SHORT 1551-CRA.00412038

F8单步一下,切换到“MessageBox”中,确认,被OD中断。我们可以看见上面的代码41201F处有一个“〉”,说明可以从某段代码跳转到此处,我们选择41201F这一行,在“Information”栏看见一句“JUMP FROM 412003”,右键单击,选择“GO TO JUMP FROM 412003”。回到412003,一般都是条件跳转,上面的内容就是比较的地方啦。:)

5、使用OD的TRACK功能
   
   OD拥有强大的TRACK功能,在分析算法时十分有用。首先我们要设定OD的TRACK缓冲区大小,选择Option/Debugging Option,在弹出的对话框中选择TRACK页,“Size of run track buffer(byte/record)”,缓冲区大小,当然约大约好。其他的设置在我以前的OLLYDBG.INI中都已经设置好了。然后,开启目标程序,在DEBUG中选择“Open or clear run track”。然后我们就可以用CTRL+F11或CTRL+F12开启“Track into”和“Track over”了。当我们暂停程序的时候,可以用小键盘上的“+”,“-”,“*”来控制TRACK功能了。

“Track into”和运行类似,但是记录所有指令以及寄存器变化。并且会自动进入所有的CALL中。
“Track over”和“Track into”类似,但是不进入CALL
“+”用来显示TRACK缓冲区中的下一条指令
“-”用来显示TRACK缓冲区中的上一条指令
“*”用来发返回当前指令

6、不是技巧的技巧
   当你遇到花指令的时候一定会很头痛。但是如果你用OD进行分析的时候就会轻松得多。OD会自动标识出无效指令,即花指令。如果OD没有正确识别,你还可以用CTRL+↑/↓来单个 字节的移动。可以很有效的识别出花指令的所在。

后记

本人脑袋不太好使,一时记不起所有内容,以后想起来再贴。转贴时请保持本文的完整。

我想知道在OD中如何下地址断点
比如bpx 5022e2
是不是在命令行中?有其他办法没?
命令行在98下不能用


ctrl+g输入地址,F2下断

转Draren总结的ollydbg v1.09d 中文版使用说明

一点一滴的积累,也就会了.

之所以选择ollydbg

1.我的os是winXP,无法使用trw2000,而softice装了多次均未成功,还蓝屏死机多次.郁闷.

2.友好的gui界面,不像softice.可以边干活边听歌,不像softice,把整个os都挂起了.多用两次,连时间都不知道了.

3.强大的内存查看功能,再不用什么-d了,而且跳转方便,爽!一目了然.

4.强大的右键菜单功能

ollydbg的界面:

菜单:

文件:
    1.其中包括该菜单的下部有上次打开的纪录,该纪录保存有上次未清除的断点.
    2.附加.对付那些Anti-Debug程序.先运行程序,再运行od,文件-->附加.
查看:
    1.执行模块(Alt+E),查看程序使用的动态链接库
    2.查看断点.Alt+B
调试:
    1.运行(F9)加载程序后,运行!
    2.暂停(F12)
    3.单步进入(F7)遇见CALL进入!进入该子程序.
    4.单步跳过(F8)遇见CALL不进去!
    5.执行到返回(ALT+F9)就是执行到该子程的返回语句

ollydbg的16进制编辑功能.类似与hiew,hex workshop

查看-->文件

二进制文件编辑功能.查看-->文件,打开的文件是二进制显示.选中要改变的机器指令,空格,修改,右击-->保存.

ollydbg的四个区域

左上角是cpu窗口,分别是地址,机器码,汇编代码,注释;注释添加方便,而且还能即时显示函数的调用结果,返回值.
右上角是寄存器窗口,但不仅仅反映寄存器的状况,还有好多东东;双击即可改变Eflag的值,对于寄存器,指令执行后发生改变的寄存器会用红色显示.
cpu窗口下面还有一个小窗口,显示当前操作改变的寄存器状态.  不错;
左下角是内存窗口.可以ascii或者unicode两种方式显示内存信息;
右下角的是当前堆栈情况,还有注释啊.

F3选择打开程序.

使用

F9执行程序.

下断点:

1.对函数下下断点

在代码区右击-->搜索-->当前模块中的名称(ctrl+N),在跳出来的对话框中选择需要下的断点函数.->右击->查找导入参考(enter),按F2下断点.如果有多个地方调用了该函数就这样操作。

2.在需要的地方下断点  F2

添加注释:

在代码区第四列,右击-->注释

查看内存地址

右击内存地址列-->前往-->输入要查看的内存地址

在函数lstrlen的注释的上方,有一个变量string,当执行到该函数的时候,string后面会出现lstrlen函数的参数字符串.在实际使用中一般是输入的字符串.(很好用哦)

类似的还有lstrcmp,上面有string1,string2能够显示将要比较的两个字符串.

另外,一般在执行getwindowtext等函数后,右边寄存器列,eax会显示函数的返回值,即取到的内容.同时内存中也会有显示.

在反汇编中选中一条命令,如果其中有用到内存中的地址,右击-->在转存中跟随-->直接常数
此时内存地址会显示指令中引用到的内存字符

拷贝功能十分强大.直接选择要拷贝的内容.右击-->复制-->文件or剪贴板

ollydbg的条件断点可以按寄存器,存储器,消息(必须是消息的数字,如wm_command就是111)等等设断,非常强大,一旦设了之后记录到文件中,下次restart程序还能用,不用拿笔记,很方便。

显示跳转路进:
选项-->调试设置-->cpu页-->显示跳转的方向,显示跳转的路径,如果跳转没有实现则显示灰色路径。在cpu窗口中,机器码的前面显示">"符号.同时,在cpu窗口下的小缝中会显示跳转路径,从何跳转而来.右击-->前往...一般都是条件跳转,上面的内容就是比较的地方啦。:)

跟踪功能:
选项-->调试跟踪-->跟踪:设置运行跟踪的缓存大小.越大越好.
调试-->打开或清除运行跟踪
然后我们就可以用CTRL+F11或CTRL+F12开启“跟踪进入”和“ 跟踪跳过”了。当我们暂停程序的时候,可以用小键盘上的“+”,“-”,“*”来控制跟踪功能了。
其中,“跟踪进入”和运行类似,但是记录所有指令以及寄存器变化。并且会自动进入所有的CALL中。
“ 跟踪跳过”和“跟踪进入”类似,但是不进入CALL
“+”用来显示跟踪缓冲区中的下一条指令
“-”用来显示跟踪缓冲区中的上一条指令
“*”用来发返回当前指令

让OD显示MFC42.DLL中的函数
打开调试-->选择导入库-->添加-->选择MFC43.LIB加入.重新载入MFC程序,就可以看到call后面的api函数了.

动态暂停以messagebox为例)
先运行目标程序,再运行od,选择文件-->附加.在目标程序运行出现对话框时,切换至od,F12暂停.

字符串参考:
在汇编代码区,右击-->搜索-->字符参考

更改二进制文件:

方法1.查看-->文件,打开文件,找到欲修改的偏移,使用机器码修改,然后右击保存文件.缺点是需要使用其他软件来获取偏移地址.

方法2.直接在反汇编代码区更改,这时可以使用汇编代码更改,不用记机器码.完了.右击-->复制到可执行文件-->保存文件.很是方便哪!

关于虚拟地址和偏移地址:
ollydbg果然强大,太强大了,在欲修改的指令处右击-->复制到可执行文件,弹出窗口中光标所在行即是欲修改的指令所在的偏移地址,右击-->汇编,直接修改汇编指令,不用记机器码,又不用虚拟地址到偏移地址的转换.改完后保存文件.爽丫!

请问用ollydbg如何跟踪被跟踪进程的子进程

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

00454479处堆栈内容如下:
0012FD40   00000000  |ModuleFileName = NULL
0012FD44   00956B94  |CommandLine = "C:/QXJDGL/QXJDGL.DLL 2"
0012FD48   00000000  |pProcessSecurity = NULL
0012FD4C   00000000  |pThreadSecurity = NULL
0012FD50   00000000  |InheritHandles = FALSE
0012FD54   00000020  |CreationFlags = NORMAL_PRIORITY_CLASS
0012FD58   00000000  |pEnvironment = NULL
0012FD5C   00000000  |CurrentDir = NULL
0012FD60   0012FD84  |pStartupInfo = 0012FD84
0012FD64   0012FD74  /pProcessInfo = 0012FD74

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先关于 [评价可免费] 的严重声明: 一、评价=评论加评价(评星星); 二、评价必须是下载完了该资源后的评价,没下载就评论无效; 三、如果正确评价了,返还积分可能需要等等,系统需要反应下。呵呵 评论时记得要评分。然后会返回给你花费的分再加1分.理论上有十分就可以下载完所有的资源了。一般人我不告诉他。 MFC 程序逆向 – 消息篇(上) 作者:szdbg Email:szdbg@sina.com 前言: 记得前一段时间,我刚接触软件破解和逆向这一行时,对于一些软件不知从何处跟踪按钮消息,试了好多方法,就是断 不下来,在系统模块中经常转得晕头转向,而一无所获。 MFC 程序是一种常见类型的程序,我静下心来,潜心研究了一下MFC 消息流程。弄清原委之后,一切豁然开朗,发现跟 踪MFC 程序和消息处理原来是如此。。。,跟踪按钮事件处理也由此变得特别简单。 于是,我将这些研究整理成文,以备后忘。并希望大家有所帮助,失误之处,请高手指正。 的确, .Net之类的程序必定是大势所趋,不过,就目前来说,MFC程序在软件市场还是占有重要的一席之地,所以,了解它,对于逆向和破解此类程序还是很有必要的. MFC之所以显的复杂,就在于它隐藏了它的消息的处理机制,可以说, 程序员基本上不需要懂得它的消息处理过程,就可以写出一套满足应用的软件来.这有好有坏,好的是大大简化了程序员写程序的过程,坏的一方面是,给一般程序员留下了一个迷团: 我只知道这样做,而不知道为什么这样做.心里老是觉得不踏实.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值