飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 53558|回复: 135

[分享] OllyDbg知识专题

[复制链接]
  • TA的每日心情
    开心
    2016-6-16 14:07
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2005-2-14 15:11:27 | 显示全部楼层 |阅读模式
    转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果然强大,太强大了,在欲修改的指令处右击-->复制到可执行文件,弹出窗口中光标所在行即是欲修改的指令所在的偏移地址,右击-->汇编,直接修改汇编指令,不用记机器码,又不用虚拟地址到偏移地址的转换.改完后保存文件.爽丫!
    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,象上面那样做。
    以下命令适用于 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 函数的帮助

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

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

    本帖被以下淘专辑推荐:

    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-2-15 09:16:30 | 显示全部楼层
    收藏起来, 边用边学
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-3-7 12:06:27 | 显示全部楼层
    第一 寻常断点
    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 ****硬件断点
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-6-16 14:07
  • 签到天数: 10 天

    [LV.3]偶尔看看II

     楼主| 发表于 2005-3-7 12:18:19 | 显示全部楼层
    3楼的是什么意思啊?
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-3-7 20:59:51 | 显示全部楼层
    这篇文章我找了好久啊,太感谢了,!!!!!
    PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2020-4-10 17:02
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2005-5-5 22:10:58 | 显示全部楼层
    感谢!!!!!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-5-9 11:06:50 | 显示全部楼层
    我用的就是OllyDbg~~谢谢
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-5-13 13:34:44 | 显示全部楼层
    把楼主的文章打印出来了,慢慢学习。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2005-5-13 15:27:36 | 显示全部楼层
    感谢老大
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2020-3-30 17:42
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2005-5-13 20:30:02 | 显示全部楼层
    三楼的写的很不错!建议加精!
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表