IDA反汇编工具详解之工程和窗口

2024-03-20 04:28

本文主要是介绍IDA反汇编工具详解之工程和窗口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 什么是反汇编
    • 反汇编的目的
    • ID介绍
    • 打开创建工程
    • IDA的基本规则
    • 窗口介绍
      • 反汇编窗口
      • Names窗口
      • Strings窗口
      • 十六进制窗口
      • 导出窗口
      • 导入窗口
      • 函数窗口
      • 结构体窗口
      • 枚举窗口
      • 段窗口
      • 签名窗口
      • 类型库窗口
      • 函数调用窗口
      • 问题窗口

什么是反汇编

程序员使用编译器、汇编器和链接器中的一个或几个创建可执行程序的过程叫做编译过程(代码输入 --> 可执行程序输出)
使用反汇编器和反编译器回溯编译过程来撤销汇编和编译过程,输出汇编语言或高级语言的过程叫做反汇编(机器语言输入 --> 汇编语言或高级语言输出)
反汇编的难点: 1.编译过程中会造成损失 2.编译属于多对多操作 3.反编译器非常依赖于语言和库 4.要想准确的反编译一个二进制文件,需要近乎完美的反汇编能力

反汇编的目的

1.分析恶意软件
2.分析闭源软件的漏洞
3.分析闭源软件的互操作性
4.分析编译器生成的代码,以验证编译器的性能和准确性
5.调试时显示程序指令

ID介绍

IDA(Interactive Disassembler Professional) 交互式反汇编器专业版,是一种递归下降反汇编器; 这里以IDA 7.0为例进行说明

打开创建工程

在这里插入图片描述

打开工程的三个子介绍说明:
New(新建): 启动一个向导,它将引导你选择一个文件进行分析
Go(运行): 终止加载过程,使IDA打开一个空白的工作区
Previous(最近工程): 打开最近打开过的一个文件

新建工程并打开文件之后IDA会根据打开文件,生成一个文件列表,显示如下图所示:
在这里插入图片描述

Portable executable for AMD64(PE)[pe64.dll] 和 MS-DOS executable (EXE) [dos64.dll] 加载器均声称能够识别选定的文件
Binary File(二进制文件)会一直显示,因为它是IDA加载无法识别的文件的默认选项,它提供了最低级的文件加载方法
如果IDA提供几个加载器,这时选择默认选项倒即可

在Processor Type(处理器类型): 指定在反汇编过程中使用的处理器模块,多数情况下IDA将根据它从可执行文件的头中读取到的信息选择合适的处理器。

同时选择了二进制文件输入格式和一种x86系列处理器Loading Segment(加载段)和Loading Offset(加载偏移量)字段将处于活动状态。
由于二进制加载器无法提取任何内存布局信息,在这里输入的段和偏移量值将共同构成所加载文件内容的基址。

Kernel Options(核心选项) 按钮用于配置特定的反汇编分析选项,IDA可利用这些选项改进递归下降过程,使用默认的即可。
Processor Options(处理器选项) 按钮用来选择适用于选中的处理器模块的配置选项.

当处理完对应的操作之后会保存对应的工程,点击保存或退出会弹出下面的窗口:

在这里插入图片描述

Don’t pack database 不打包数据库,这个选项仅仅刷新对4个数据库组件文件所做的更改,在关闭桌面前并不创建IDB文件, 在关闭数据库时,不建议使用这个选项。
Pack database(Store) 打包数据库不压缩,选择Sotre选项会将4个数据库组件文件存到一个IDB文件中,之前的任何IDB不经确认即被覆盖
Pack database(Deflate) 打包数据库并压缩
Collect Garbage 如果请求垃圾收集,IDA会在关闭数据库之前,从数据库中删除任何没有用的内存页面
DON’T SAVE the datebase 不保存数据库

IDA的基本规则

1.IDA不提供撤销功能
2.几乎所有的操作都有其对应的菜单项、热键和工具栏按钮
3.IDA提供方便的、基于上下文的鼠标右键操作菜单

窗口介绍

反汇编窗口

在这里插入图片描述

反汇编窗口也叫IDA-View窗口,它是操作和分析二进制文件的主要工具
反汇编窗口有两种形式: 1.面向文本的列表视图 2.基于图形的视图 默认以图形视图显示。可以通过空格键在两种视图之间切换

图形视图类似流程图: 它将一个函数分解成许多基本块,以生动显示该函数由一个块到另一个块的控制流程。
图形视图的控制流(也就是各个箭头): Yes执行流(默认绿色)、NO执行流(默认红色)、正常执行流(默认为蓝色)
相关操作: Ctrl+鼠标滚轮 调整图形大小;
控制视图的显示方式: 1.平移图块 2.重新调整块位置 3.分组和折叠块 4.创建其它反汇编窗口(View->OpenSubviews->Disassembly)
Options->General->Disassembly 选项卡配置图形视图显示的详略信息

在这里插入图片描述

窗口最左边的是箭头窗口用于描述函数中的非线性流程:
实线箭头表示非条件跳转
虚线箭头表示条件跳转
如果一个跳转将控制权转交给程序中的某个地址(以前的),这时会使用粗线。出现这类逆向流程,通常表示程序中存在循环

再右边点是虚拟地址显示显示格式为[区域名称]:[虚拟地址] 如.text:0040110C0

DllMain函数声明的位置,是IDA对于函数栈帧布局最准确估算。
以分号开头的注释属于交叉引用

Names窗口

在这里插入图片描述

Names窗口列举了一个二进制文件的所有的全局名称; Ctrl+F 可以调出查询窗口查询特定的名称; 双击对应的名称可以跳转到显示该名称的反汇编视图。

Names窗口通过颜色和字母编码来区分不同的符号:
F: 常规函数,IDA认为这些函数不属于库函数。
L: 库函数,IDA通过签名匹配算法来识别库函数。
I: 导入的名称,通常为共享库导入的函数名称。
G: 命名代码,当IDA在程序的符号表中找到一个名称,但没发现对程序位置的任何调用时,就会出现这种情况。
D: 数据,已命名数据的位置通常表示全局变量。
A: 字符串数据。这是一个被引用的数据位置,其中包含的一串字符符合IDA的某种已知的字符串数据类型.

Names窗口的变量命名规则:
sub_xxxxxx;地址xxxxxx处的子例程
loc_xxxxxx:地址xxxxxx处的一个指令
byte_xxxxxx:位置xxxxxx处的8位数据
word_xxxxxx:位置xxxxxx处的16位数据
dword_xxxxxx:位置xxxxxx处的32位数据
unk_xxxxxx:位置xxxxxx处的大小未知的数据

Strings窗口

在这里插入图片描述

Strings窗口中显示的是从二进制文件中提取出的一组字符串,以及每个字符串所在的地址。
双击Strings窗口中的任何字符串,反汇编窗口将跳转到该字符串所在的地址。
将Strings窗口与交叉引用相结合,可迅速定位你感兴趣的字符串,并追踪到程序中任何引用该字符串的位置。
右键菜单->Setup 可以设置字符串窗口的显示风格; Ctrl + F可以用来检索特定符号的字符串;

十六进制窗口

在这里插入图片描述

十六进制窗口显示程序内容和列表的标准十六进制代码,每行显示16个字节,以及其对应的ASCII字符
十六进制窗口可以和反汇编窗口同步,如果一个反汇编窗口与一个十六进制窗口同步,在一个窗口中滚动鼠标另一个窗口也会滚动到相同的位置。
如果在反汇编窗口中选中一个项目,十六进制窗口中的对应字节也将突出显示。

导出窗口

在这里插入图片描述

导出窗口列出文件的入口点,这包括程序的执行入口点(在程序的文件头部分指定),以及任何由文件导出给其他文件使用的函数和变量。
通常用户可在共享库(如Windows DLL文件)中找到导出的函数。导出的项目按名称、虚拟地址和序数排列。
对于可执行文件,导出窗口中至少包含一个项目:程序的执行入口点。IDA将这个入口点取名为start。
与其他IDA窗口一样,双击弹出窗口的一个条目,IDA会跳转到反汇编窗口对应的位置。 Ctrl+F可以搜索对应的函数名称。

导入窗口

在这里插入图片描述

导入窗口的功能与导出窗口的功能正好相反。它列出由被分析的二进制文件导入的所有函数。只有在二进制文件使用共享库时,IDA才需要用到导入窗口。静态链接的二进制文件不存在外部依赖关系,因此不需要导入其他内容。导入窗口中的每个条目列出一个导入项目(函数或数据)的名称,以及包含该项目的库的名称。
由于被导入的函数的代码位于共享库中,窗口中每个条目列出的地址为相关导入表条目的虚拟地址。

函数窗口

在这里插入图片描述

函数窗口用于列出数据库中的每一个函数,与名称窗口不同函数窗口并不列出使用自动生成的名称的函数。函数窗口会列出IDA在数据库中识别的所有函数。(标识函数的位置和长度)
与其他显示窗口样,双击函数窗口中的一个条目,IDA将跳转到反汇编窗口中选定的函数位置。

结构体窗口

在这里插入图片描述

结构体窗口用于显示IDA决定在一个二进制文件中使用的任何复杂的数据结构(如C结构体和联合)的布局。
在分析阶段,IDA会查询它的函数类型签名扩展库,设法将函数的参数类型与程序使用的内存匹配起来。

双击数据结构的名称,IDA将展开该结构,这允许你查看该结构的详细布局,包括每个字段的名称和大小。
结构体窗口的两个主要用途包括:为标准数据结构的布局提供现成的参考,为你提供一种方法,在你发现程序使用的自定义数据结构时,帮助你创建自己的、可用作内存布局模块的数据结构。

枚举窗口

在这里插入图片描述

枚举窗口有点类似于结构体窗口。如果IDA检测到标准枚举数据类型(Cenum),它将在枚举窗口中列出该数据类型。你可以使用枚举来代替整数常量,提高反汇编代码的可读性。
像结构体窗口一样,在枚举窗口中也可以定义自己的枚举类型,并将其用在经过反汇编的二进制代码中。

段窗口

在这里插入图片描述

段窗口显示的是在二进制文件中出现的段的简要列表,需要注意的在,在讨论二进制文件的结构时,IDA术语"段"(segment)常称为"节"(section)。
该窗口中显示的信息包括段名称、起始和结束地址以及许可标志。起始和结束地址代表程序段在运行时对应的虚拟地址范围。

签名窗口

在这里插入图片描述

IDA利用一个庞大的签名库来识别已知的代码块。签名用于识别由编译器生成的常用启动顺序,以确定可能已被用来构建给定二进制文件的编译器。签名还可用于将函数划归为由编译器插入的己知库函数,或者因为静态链接而添加到二进制文件中的函数。在IDA为你识别库函数时,你可以将更多精力放在分析IDA无法识别的代码上。

类型库窗口

在这里插入图片描述

类型库窗口在概念上与签名窗口类似。类型库保存IDA积累的一些信息,即IDA从最常用的编译器的头文件中搜集到的有关预定义数据类型和函数原型的信息。通过处理头文件,IDA可确定常用库函数所需的数据类型,并为反汇编代码提供相应的注释。同样,IDA还可从这些头文件中了解复杂数据结构的大小和布局。所有这些信息都收集在TIL文件(<IDADIR/til目录>)中,并可在任何时候应用于你分析的二进制文件。与应用签名时一样,在选择加载一组适当的TIL文件之前,IDA必须首先确定一个程序所使用的库。要请求IDA加载其他类型库,可以在类型库窗口中按下INSERT键,或右击窗口并在出现的菜单中选择Load Type Library(加载类型库)。

函数调用窗口

在这里插入图片描述

在任何程序中,一个函数可以调用其他函数,也可以被其他函数调用。实际上,建立一个图形来说明调用方与被调用方之间的关系,是一个相当简单的任务。这样的图形叫做函数调用图形或函数调用树。
有时候,我们并不需要查看程序的完整调用图形,而只对临近函数调用关心,打开函数调用窗口时,IDA会确定光标所在位置的函数的"近邻".

问题窗口

在这里插入图片描述

IDA在问题窗口中显示它在反汇编二进制文件时遇到的困难,以及它如何处理这些困难。有些时候,你可以操纵反汇编代码,帮助IDA解决问题。

这篇关于IDA反汇编工具详解之工程和窗口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/828277

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

HDU 1560 IDA*

给出n个串,求最短公共串(不要求连续) h ,最少还需要多长来匹配所有。 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;imp

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建      首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件、动态链接库文件、可执行文件、脚本文件、配置文件等。      我们在编写hellowor

LabVIEW FIFO详解

在LabVIEW的FPGA开发中,FIFO(先入先出队列)是常用的数据传输机制。通过配置FIFO的属性,工程师可以在FPGA和主机之间,或不同FPGA VIs之间进行高效的数据传输。根据具体需求,FIFO有多种类型与实现方式,包括目标范围内FIFO(Target-Scoped)、DMA FIFO以及点对点流(Peer-to-Peer)。 FIFO类型 **目标范围FIFO(Target-Sc