OllyDbg调试器

OllyDbg称为Ring3级的首选工具。可以识别数千个被和Windows频繁使用的函数,并能将其注释出来。它会自动分析函数过程、循环语句等

OllyDbg主界面

快捷键

  • Address列:显示被双击行地址的相对地址,再次双击返回标准地址模式。

  • Hex dump列:设置或取消无条件断点,对应的快捷键是"F2键"

  • Disassembly列:调用汇编器,可直接修改汇编代码,对应的快捷键是空格键

  • Comment列:允许增加或编辑注释,对应的快捷键是 ";" 键

    从键盘上选择多行,可按Shifit键和上下光标键来实现。

信息面板窗口

在进行动态跟踪时,信息面板窗口(Information window)将显示与指令相关的各个寄存器的值、API函数调用提示和跳转调试等信息。

数据面板窗口

数据面板窗口(Dump window)以十六进制和字符方式显示文件在内存中的数据。要显示指定内存地址的数据,可的那几右键快捷菜单中的"Go to expression"命令或按"Ctrl+G"快捷键,打开地址窗口,输入地址。

寄存器面板窗口

寄存器面板窗口(Registers Window)显示CPU各寄存器的值,支持浮点、MMX和3DNow!寄存器可以单击右键或窗口标题切换显示寄存器的方式。

栈面板窗口

栈面板窗口(Stack window)显示栈的内容,即ESP指向地址的内容。将数据放入栈的操作为入栈(push) 从栈中取出数据的操作称为出栈(pop)。栈窗口非常重要,各API函数和子程序都利用它传递参数和变量等

基本操作

单步功能的快捷键是 F7键(路过) 和 F8键(跟进)

1.

在编译时,优化时有两种选择一个是 Maximize Speed (最大速度) 和Minimize Size(最大)优化选项进行编译



因为优化选项不同,所以生成的汇编代码也会不同。

这就涉及到编译原理的知识了。

IDA编译器

IDA安装成功后,会在桌面上生成两个图标,分别为IDA Pro(32-bit)和IDA Pro(64-bit),它们分别对于32位和64位程序的分析。IDA支持的文件类型非常丰富,除了常见的PE格式,还支持DOS、UNIX、Mac、Java、.NET等平台的文件格式。单击"File"->"Open"菜单项,打开要目标文件.exe文件,IDA一般能自动识别其格式



IDA是按区块装载PE文件的,例如.text(代码块)、.data(数据块)、.rsrc(资源块)、.data(输入表)和.edata(输入表)等。IDA反汇编所消耗的时间与程序大小及复杂程度有关,通常需要等待一段时间才能完成。

第一阶段

将程序的代码和数据分开,分别标记函数并分析其参数调用,分析跳转,调用等指令关系并给标签赋值等。

第二阶段

如果IDA能够识别文件的编译类型,就装载对应的编译器特征文件,然后给各函数赋名。随后,IDA会创建一个数据库,其组件分别保存在扩展名为  .id0、id1、.nam 和 .til的4个文件里,这些文件的格式为IDA专用,在关闭当前项目时,这四个文件将被存档为一个IDB文件。一旦IDA创建了数据库,就不需要再访问这个可执行文件,除非使用IDA的集成调试器调试这个可执行文件本身。再次分析该目标文件时,IDA只需要打开现有数据库,就会将界面恢复为上次关闭时的状态。

"Kernel option1" "Kernel option2" "Processor option" 这3个选项可以控制反汇编引擎的工作状态,一般使用默认设置。IDA会自动识别程序类别与处理器类型,在大多数情况下,分析选项的默认值会在准确与方便性之间提供一个折中的参数。

导航栏

注释

使用IDA可以方便地在代码后面输入注释。在窗口右键空白处单击右键,将显示输入注释的快捷菜单项,一个是"Enter comment"(快捷键时冒号),另一个是"Enter repeatable comment"(快捷键是分号)按";"

按";"键输入的注释在所有交叉参考处都会出现,按":"键输入的注释只在该处出现。如果一个地址处有两种注释,将只显示非重复注释。

跳转到地址窗口

可以在反汇编窗口上下滚动,直至看到想要访问的地址。若直到目标地址,可以用IDA提供的快捷键"G"打开"Jump to address"(跳转到地址)

交叉参考

通过交叉参考(XREF)可以直到指令代码相互调用的关系。如下图:"CODE XREF":sub_401120+ j表示该调用地址是401120h,"j"表示跳转(jump)。此外,"o" 表示偏移量(offset) "p"表示子程序(procedure)双击此处或按"Enter"键可以跳转到调用该处的地方。

参考重命名

参考重命名(Renaming of reference)是IDA的一个极好的功能,它可以将反汇编清单中的一些默认名称更改为有意义的名称,增加了代码的可读性。要修改一个名称,只需单击希望修改的名称(使其突出显示),并使用快捷键"N"打开更名对话框。

  • Local name: 局部符号名的作用域仅限于当前函数。

  • Include in names list:勾选这个选型,将有一个名称被添加到名称窗口中。

  • Pulic name: 由二进制文件(例如 DLL)输出的名称。

  • Autogenerated name:自动创建符号名。

标签的用法

单击菜单项"Jump"-->"Mark position",打开"标记当前位置"功能,会出现如图3.12所示的对话框。
为这个标记(当前光标位置)加上标签,"WndProc" 标签就是需要返回的位置。当离开这个标记并返回时,选择菜单项"Jump"->"Jump to marked position",或者按"Ctrl+M"快捷键,执行"跳转到标记位置"功能

格式化指令操作数

IDA可以格式化指令使用的常量,因此应尽可能使用符号名称而非数字,从而使反汇编编码更具有可读性。IDA根据被反汇编指令的 上下文、所使用的数据作出格式化决定。对其他情况,IDA一般会将相关常量格式化成一个十六进制常量。

IDA可以提供多种进制显示。将光标移到需要转换进制的常量上,单击右键,所示的上下文菜单。该菜单提供的选项可将常量格式化十进制、八进制或二进制的值。

代码和数据转换

很多工具在进行反汇编的时候可能无法正确区分数据和代码,IDA也不例外,数据字节坑能被错误地识别为代码字节,而代码字节可能被错误地识别为数据字节。有些程序就是利用这一点来对抗静态反汇编的。IDA的交互性使用户可以将某段十六进制数据指定为代码或数据,即利用用脑来区别代码和数据

如果确信某段十六进制数据是一段指令,只要将光标移到其第一个字节的编译位置,执行菜单命令"Edit"->"Code"或按"C"键即可。按"P"键可以将某段代码定义为子程序,并列处参数调用。若要取消定

字符串

数组

IDA有着强大的聚合能力。它可以将一串数据声明变成一个反汇编行,按数据的 形式显示,从而简化反汇编代码清单。

用IDA打开实例Arrays.exe,数组用C语言的描述,代码如下。

static int a[3] = {0x11,0x22,0x33};

汇编代码如下。

.text:00401009         mov edi,dword_4070330[eax]

其中,407030h指向一个数组,如图



将光标移到需要处理的数据处,选择菜单项"Edit"——>"Array"或按 "*" 键,打开数组排列调整窗口



设置完成,数据按1x3的形式排列,如图

.data:00407030 dword_407030 dd 11hh ,22h,33h ; DATA XREF:_main:loc_401009

结构体

在C语言中,结构体(struct)是一种数据结构,可以将不同类型的数据结构组合到一个复合的数据类型中,结构体可以被声明为变量、指针或数组等,从而实现比较复杂的数据结构。

创建结构体

对一些常见的文件类型,IDA会自动加载相应的类型库,例如vc6.0在进行底层分析时,可以增强mssdk(windows.h) ntddk(ntddk.h)等这些类型库中有相应的结构体,用户分析代码时可以直接引用。按Shift+F11快捷键,打开加载类型库窗口(Loaded Tyepe Libraries),在弹出的"Available Type Livbraries" 窗口中选择类型库

此时就可以查看内置的结构体数据结构了。选择"View" -> "Open subviews" ->"Structures"菜单选项,打开结构体管理窗口

枚举类型

可以在反汇编时用IDA动态定义和操作枚举类型(Enumerated Types)。看看下面这段简单的C语言程序,在用IDA进行反汇编后,得到了一些没有意义的数字

//Enumerated.cpp
int main(void)
{
enum weekday {
MONDAY,
TUESDAY,
WEDNESDAY,
THUSDAY,
FRIDAY,
SATURDAY,
SUNDAY};
printf("%d,%d,%d,%d,%d,%d,%d",MONDAY,TUESDAY,WEDNESDAY,THUSDAY,FRIDAY,SATURDAY,SUNDAY);
return 0;
}



可以用枚举类型来表示这些数字。执行"View"-->"Open subviews" -->"Enumerations"选项,打开枚举窗口,按"Insert"键插入一个新的枚举类型"weekday".在新建的weekday枚举类型中按"N"键添加枚举成员 "0"对应于"MONDAY","1"对应于"TUESDAY"

OlllyDbg调试器和IDA调试器的更多相关文章

  1. VS2003"无法启动调试 没有正确安装调试器"的解决办法

    VS2003"无法启动调试 没有正确安装调试器"的解决方法 在用VS2003做项目的时候,经常调试程序,但是有时候回出现如下问题“无法启动调试,没有正确安装调试器,请运行安装程序或 ...

  2. vs2008调试 Release(链接器来生成调试信息)

    VS2008 Release 修改配置: 1.项目——>属性——>C/ C++ ——> 常规 ——>调试信息格式——>用于“编辑并继续”的程序数据库(/ZI) 2.项目— ...

  3. w2wp.exe 已附加有调试器,但没有将该调试器配置为调试此未经处理的异常

    一.问题描述 昨天系统联调,用到了VS2010 附件进程,把w2wp.exe 进程添加到vs2010 的调试进程中,这样其他系统访问我们系统,就可以捕获断点进行调试 但是,今天F5 调试的时候,发现直 ...

  4. BGFX 渲染引擎中着色器代码的调试方法

    在实时渲染的图形开发中,着色器代码(Shader)越来越复杂,于是单纯的靠经验和不断试错的开发和调试方法早已不能满足实际需求.使用调试工具进行调试,成为开发中重要的方法.Bgfx 是一款跨平台.抽象封 ...

  5. 安卓动态调试七种武器之孔雀翎 – Ida Pro

    安卓动态调试七种武器之孔雀翎 – Ida Pro 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是 ...

  6. ida调试ios应用

    收集,整理http://www.cnblogs.com/fply/p/8488842.html 这个文章讲了ios上debugserver相关配置 http://iphonedevwiki.net/i ...

  7. IDA 调试 Android 方法及简单的脱壳实现

    IDA 调试 Android 方法及简单的脱壳实现 标签: android原创逆向调试dalvik 2016-05-24 14:24 9286人阅读 评论(3) 收藏 举报 分类: 原创(25) An ...

  8. 动态方式破解apk进阶篇(IDA调试so源码)

    动态方式破解apk进阶篇(IDA调试so源码) 来源 https://blog.csdn.net/qq_21051503/article/details/74907449 下面就说关于在IDA中And ...

  9. Android动态方式破解apk进阶篇(IDA调试so源码)

    一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为 ...

  10. ida 调试 android fork

    在使用ida 调试android native代码时经常会碰见fork子进程的情况出现,而运行一个 android_server只能对一个进程进行调试或者attach,而ida 默认端口是23946, ...

随机推荐

  1. Yapi及Swgger使用+注解

    1.Yapi 1.1 介绍 YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布.维护 API,YApi 还为用户提供 ...

  2. ROS机器人摄像头寻线

    ROS机器人摄像头寻线 连接小车 注意:必须在同一区域网 ssh clbrobort@clbrobort 激活树莓派主板 roslaunch clbrobot bringup.launch 开启摄像头 ...

  3. ts、typescript、enum、枚举、ts 获取枚举对应的类型、获取 enum 的 key 和 value

    ts.typescript.enum.枚举.ts 获取枚举对应的类型 // 假设我一个枚举 enum ENUM_TYPE { ALL = 'all', SOME = 'some', LITTLE = ...

  4. Go中的有限状态机FSM的详细介绍

    1.FSM简介 1.1 有限状态机的定义 有限状态机(Finite State Machine,FSM)是一种数学模型,用于描述系统在不同状态下的行为和转移条件. 状态机有三个组成部分:状态(Stat ...

  5. python 编程规范有哪些?

    Python 编程规范主要包括代码布局.命名规范.注释规范.函数编写规范等多个方面,下面给出一些常见的编程规范及其示例代码. 1. 代码布局规范 代码布局规范主要是指代码的缩进.行宽.空行.换行等方面 ...

  6. 如何使用jsDelivr+Github 实现免费CDN加速?

    目录 序言 1 cdn简介 2 cdn请求分发原理 3 jsDelivr简介 4.jsDelivr 的简单使用 5 jsDelivr + Github 的具体实现 5.1 新建Github仓库 5.2 ...

  7. 如何在 🤗 Space 上托管 Unity 游戏

    你知道吗?Hugging Face Space 可以托管自己开发的 Unity 游戏!惊不惊喜,意不意外?来了解一下吧! Hugging Face Space 是一个能够以简单的方式来构建.托管和分享 ...

  8. 文心一言 VS chatgpt (11)-- 算法导论2.3 7题 3.1 4~5题

    四.2 ^ (n+1)=O(2 ^ n)成立吗? 2^(2n)=O(2 ^ n)成立吗? 文心一言: chatgpt: 第一个式子不成立,第二个式子成立. 2 ^ (n+1) = O(2 ^ n) 该 ...

  9. 2022-02-26:k8s安装swagger,yaml如何写?

    2022-02-26:k8s安装swagger,yaml如何写? 答案2022-02-26: yaml如下: apiVersion: apps/v1 kind: Deployment metadata ...

  10. status能否设置为布尔值类型,前端采用复选框形式

    是的,可以将status设置为布尔类型,这样可以在前端使用复选框形式展示.在模型中的定义可以如下: class Acceptance(models.Model): # ... status = mod ...