Ollydbg使用技巧

声明:本文中的知识点均来自小甲鱼的《OD使用教程-调试篇》,在此向小甲兄表示深深的感激,让我走进了逆向的世界。有兴趣的朋友可以观看该视频教程。在此奉上小甲鱼的官方论坛地址:http://bbs.fishc.com/forum.php

1.NGA窗口去除的方法:

对于windows的对话框窗口的定位有一个技巧,就是通过资源管理器之类的工具先找到窗口的ID。然后在代码块中搜索命令push 0xID,之所以这样是因为windows在创建对话框窗口的时候都有一步将窗口ID入栈的操作,利用这个定位到启动对话框的地方,然后想办法去除掉这个窗口。这里举个小例子:

这有一款老软件,MrBills。一打开就会有个提示窗口,利用这个方法可以将其去掉。


可以用Resource Hacker工具查看这个软件的资源,找到这个NGA窗口的ID


由于OD里面都是16进制,所以这里将204转化为CC。然后在OD中搜索push 0xCC。将所有的地方都下断点,看看哪个会断下来。




找到了相应启动对话框的地方,就可以选择屏蔽掉了。这里有多种方法,比如直接nop,或者向上找跳转语句避开等。这里提一个小技巧,对于用MessageBox产生的对话框,可以通过将父句柄的那个参数设置为1(一般都是NULL,表示属于当前窗口),这样1是不存在的窗口,那么这个Messagebox也就失效了,不会弹出对话框。

2.空格是修改内容的快捷键。比如想修改某处的指令或某个内存地址的内容,可以点击空格会自动弹出修改框。

3.运行加载的程序,如果出现异常。我们可以屏蔽异常。操作方法是点击选项-〉调试设置-〉异常,全选里面的选项,添加异常范围,比如可以添加8个0到8个F,意味着忽略32位系统所有异常。


4.查找字符串的一种方法,点击M,然后点击ctrl+B进行字符串搜索。修改字符串的时候注意最好保持大小,不然程序可能会出错。


5.对于计算天数的程序(比如试用期,当然前提是信息保存在本地,服务器验证的话那就不适用),可以放到沙盘中运行,这样沙盘结束后就自动清理了所有信息,天数就一直不变了。

6.有一种跳转是可变跳转,就是这样jmp eax。通过控制eax的值来实现可变跳转。

7.内存断点只能设置一个,前一个自动删除。一个内存断点会改变整个页(4KB)内存的属性,哪怕只设置一个字节的内存断点。

8.软件断点只能在OD的CPU界面里下,在数据段下不了,在一条指令的中间也下不了。

9.如果断点想下在动态链接库里,那就需要硬件断点。因为软件断点下在dll里,在相应文件里是不保存的,重启程序后会丢失断点。

10.ctrl+F8 是让OD自动逐条指令执行

11.F12是暂停程序,alt+F9是回到程序领空。

12.暂停法:对话框出来的时候,按暂停,点击K,看调用堆栈。

13.突破试用期限制的一种方法:试用结束后的代码和试用中的代码逻辑必然不同,那如何找到关键点呢?在试用中时可以逐条执行指令,遇到跳转就注释一下Y或N(在所有程序领空标记)。然后看过期后相应位置的跳转情况。找到不同的地方,即找到了关键点。

14.如果“复制到可执行文件”这个按钮不在了,可以点击所有修改-〉Olly Advance插件-〉Options,勾选Always enable “Copy all”显示出来。

15.push ebp是win32程序的入口点

16.双击注释面板空白处或点击;,都可以写入注释。

17.test 和 cmp 是判断的关键点,win32程序中函数的返回值一定在eax里。

18.做好注释,事倍功半。进入一个call中,先大致走一遍,看看返回处指令。

19.汇编代码中的neg指令,是取补码指令。

20.VB程序的逆向思路。几乎所有的VB都依赖于一个外部的动态链接库MSVBVM60.dll,这个dll版本可能有多个,但名字差不多。VB中所有的API函数都在DLL中实现。

     对于VB的变量比较,常用函数如下:

    __vbaVarCompEq   __vbaVarCompLe   __vbaVarCompLt   __vbaVarCompGe   ___vbaVarCompGt          

    __vbaVarComNe    __vbaVarTstEq   __vbaVarTstNe

     对于字符串的比较,常用函数如下:

     __vbaStrCmp __vbaStrComp __vbaStrCompVar __vbaStrLike __vbaStrTextComp _vbaStrTextLike

21.查找函数的一种快捷方法:直接在点击ctrl+N,就会调出函数面板,然后直接键盘输入函数名,OD会自动检索那个函数。

22.alt+B是打开断点列表。

23.delphi程序的特色(第12讲内容):

    1.看到retn就看上面有没有push + 地址,有的话就相当于jmp。

    2.N多的call

24. -号是操作退一步,+号是操作进一步

25.给程序加入变量:如果想插入变量,我们先到数据段。点击M,找到数据段,双击进去。然后往下拉,找到0000...的位置,也就是用作填充的位置,我们往这些位置插入自己的数据。但要注意,虽然这部分应该是填充用的,但我们还是得测试一下,因为万一程序运行起来用到这部分值,那就糟了。选中想写入的位置,下硬件写入断点,其实一个word就够了,跑起来看看程序有没有中断下来,没有则可以在里面写入数据。

26.内嵌补丁:一个程序的每个段,肯定不会使用完,因为有些字节对齐,填充会有一些多余的000..00部分,在段的最后面,我们可以将自己的指令放到这里,然后跳转到相应指令。之所有这么做,是因为在修改原程序的时候,我们一般不能覆盖不作修改的指令,除非你确信,被覆盖的指令以后不再使用。比如我们将jmp改成mov eax,1.这时候mov指令长,必然会覆盖一些jmp后面的指令,如果这些指令还会被调用,那覆盖后就没有了,程序极可能会崩溃。

27.通过书签来记录位置

28.nonawrite插件,帮助我们内嵌补丁填充代码。

29.跳转语言的修改越早越好。

30.如果mov eax,1会覆盖后面的指令,则换成mov al,1试试,变通一下。

31.脱壳技巧,但凡是高级点的壳都需要重建输入表。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值