zoukankan      html  css  js  c++  java
  • OllyDbg的基本使用

    注:内容整理自《逆向工程核心原理》,结合我的OllyDbg版本修改了一些内容

    1. OllyDbg常用命令及其快捷键

    指令 快捷键 含义
    Restart Ctrl+F2 重新开始调试
    Step Into F7 执行一句OP code,若遇到CALL,进入函数代码内部
    Step Over F8 执行一句OP code,若遇到CALL,仅执行函数自身,不跟随进入
    Run F9 运行(遇到断点时暂停)
     Execute till return Ctrl+F9   执行函数代码内的命令,直到遇到RETN命令,用于跳出函数体
     Execute till cursor F4  执行到光标所在位置 
     Comment 添加注释 
    User-defined comment 鼠标右键菜单Search for-User defined comment 查看用户输入的注释目录
    Label : 添加标签
    User-defined label 鼠标右键菜单Search for-User defined Label 查看用户输入的标签目录
    Breakpoint F2 设置或取消断点
    All referenced text strings 鼠标右键菜单Search for-All referenced text strings 查看代码中引用的字符串
    All intermodular calls 鼠标右键菜单Search for-All intermodular calls 查看代码中调用的所有API函数
    Name in all modules 鼠标右键菜单Search for-Name in all modules 查看所有API函数
    Edit data Ctrl+E 编辑数据
    Assemble 空格键 编写汇编代码
    Copy to executable file 鼠标右键菜单Copy to executable file 创建文本副本(修改的项目被保留)

    2. 设置点的方法(这里我们假设大本营的地址为004010ED)

    ①Goto命令

    执行Goto命令(Ctrl+G),在打开的对话框中输入004010ED,然后单击OK按钮,这样光标就会自动定位到004010ED处

    然后执行Execute till cursor(F4)命令,让调试流运行到该处

    ②设置断点

    选中004010ED这一行(可以手动找,也可以使用上述Goto命令中的第一步),设置BreakPoint(F2),调试运行到断点处会暂停

    然后执行Run debugged application(F9)即可让调试直接运行到断点处暂停

    注:在OllyDbg菜单栏中选择View-Breakpoints(Alt+B),可以打开Breakpoints对话框,列出代码中设置的断点。在断点列表中双击某个断点会直接跳转到相应位置

     ③使用注释

    选中004010ED这一行(可以手动找,也可以使用上述Goto命令中的第一步),按;键添加注释

    在鼠标右键菜单中选择Search for-User defined comment,就能看到用户输入的所有注释,双击相应注释,光标将自动定位到相应位置

    然后执行Execute till cursor(F4)命令,让调试流运行到该处

    ④使用标签

    选中004010ED这一行(可以手动找,也可以使用上述Goto命令中的第一步),按:键为其添加标签

    在鼠标右键菜单中选择Search for-User defined labels,就能看到用户设置的所有标签,双击相应标签,光标将自动定位到相应位置

    然后执行Execute till cursor(F4)命令,让调试流运行到该处

    3. 快速查找指定代码的方法

    ①代码执行法

    当代码量不大且程序功能非常明确时,逐条执行指令来查找需要查找的位置。

    具体方法为结合使用F8和F7

    ②字符串检索法

    OllyDbg会先经历一个预分析过程,此过程中会查看进程内存,程序中引用的字符串和调用的API都会被摘录出来,整理到另外一个列表中,这样的列表可以使用鼠标右键菜单Search for-All referenced strings来查看

    地址00401007处有一条PUSH OFFSET 00411AF0指令,该指令中引用的00411AF0处即是字符串Hello World!,双击字符串,光标将定位到00401007这一位置

    使用Goto命令查看00411AF0地址处的字符串:

    即是Hello World!这个字符串

    ③API检索法——在调用代码中设置断点

    OllyDbg的预分析中不仅可以分析出程序中使用的字符串,还可以摘录出程序运行时调用的API函数列表,可以通过鼠标右键菜单中Search for-Intermodular calls来查看该列表

    双击其中的任意一行可以定位到该处所对应的代码位置,使用F2下断点即可。

    ④API检索法——在API代码中设置断点

    我们编写的应用程序执行某种操作时(如各种IO操作),必须使用OS提供的API向OS提出请求,然后与被调用API对应的系统DLL文件就会被加载到应用程序的进程内存。使用OllyDbg中的Search for-Names可以列出被加载的DLL文件中提供的所有API

    单击Name栏目按名称排序,通过键盘敲出MessageBoxW后,光标会自动定位到MessageBoxW上,双击之后就会显示其代码???(我这里好像不太行,此处存疑)

    在MessageBoxW函数的内部实现中的起始地址按下F2下断点,调试时程序运行到该处就会暂停。

    4. 修改字符串的方法

    ①直接修改字符串缓冲区

    首先找到Hello World!字符串所在的位置(我这里是00411AF0),在Dump窗口中按Ctrl+G,跳转到这一位置,使用鼠标选中Hello World这一字符串,按Ctrl+E快捷键打开编辑窗口

    在弹出的编辑窗口的UNICODE文本框中输入Hello Reversing字符串,Unicode字符串必须以NULL结束,它占据两个字节(00 00),添加NULL只能在HEX文本框中添加,修改完毕之后点击OK即可

    这种方法的优点是使用起来非常简单,缺点是对新字符串的长度有限制,新字符串的长度不应比原字符串长(虽然可执行文件保存时一般会给字符串多留出一些空间)

    注意:这种修改方式只是暂时的,终止调试后,程序中的字符串仍然没有改变。要把这种更改保存下来,就要把更改后的程序另保存为一个可执行文件。

    方法如下:在Dump窗口中,选中更改后的Hello Reversing字符串,单击鼠标右键Edit-Copy to Executable,会打开Hex窗口,在弹出的Hex窗口中点击鼠标右键,选择Save file,保存为新的可执行文件即可。

    ②在其他内存区域新建字符串并传递给消息函数

    待补充

  • 相关阅读:
    leetcode(js)算法605之种花问题
    如何使绝对定位内部元素不继承父级宽度,而是靠内容自动撑开宽度(转载)
    SQL连接查询、变量、运算符、分支、循环语句
    SQL主外键和子查询
    数据库函数
    数据库的备份恢复和部分操作语句
    SQL部分 数据库的建立 增删改查
    【转】毛玻璃特效
    Font Awesome符号字体
    form表单验证和事件
  • 原文地址:https://www.cnblogs.com/Briddle-ch/p/10340100.html
Copyright © 2011-2022 走看看