IDA入门【二】IDA数据显示窗口

news2024/11/25 21:16:14

主窗口

IDA图形视图

图形视图会让人联想到程序流程图,因为它将一个函数分解成许多基本块,以生动显示该函数由一个块到另一个块的控制流程。
image.png
在屏幕上你会发现,IDA使用不同的彩色箭头区分函数块之间各种类型的流。
根据测试条件,在条件跳转位置终止的基本块可能会生成两种流:

  • Yes边的箭头(是的,执行分支)默认为绿色
  • No边的箭头(不,不执行分支)默认为红色
  • 只有一个后继块的基本块会利用一个正常边(默认为蓝色)指向下一个即将执行的块。

在图形模式下,IDA一次显示一个函数

  • 使用“CTRL+鼠标滑轮”来调整图形的大小
  • 键盘缩放控制需要使用“CTRL+加号键”来放大,或使用“CTRL+减号键”来缩小

大型或复杂的函数可能会导致图形视图变得极其杂乱,使得用户难于导航。在这种情况下,使用“图形概况”窗口会有所帮助。概况窗口会始终显示图形完整的块状结构,并用一个虚线框指出你当前在反汇编窗口中查看的图形区域。用户可以用鼠标在概况窗口中拖动该虚线框,以迅速将图形视图调整到任何想到的位置。
image.png
几种方式控制图形视图的显示方式:

  • 平移。首先,除了使用“图形概况”窗口迅速定位图形外,你还可以通过单击和拖动图形视图的背景来定位图形。
  • 重新调整块位置。通过单击指定块的标题栏并将其拖动到一个新位置,用户可以移动图形中的每一个块的位置。如果希望还原默认的图形布局,可以右击图形,并在出现的菜单中选择Layout Graph。
  • 分组和折叠块。最后,你可以对块分组,每个块单独分组,或者与其他块一起分组;并可将分组后的块折叠起来,以减少显示的混乱程度。折叠块特别有用,可以帮助你追踪已经分析过的块。要折叠块,可以右击块的标题栏,然后在出现的菜单上选择“Group Nodes”。
  • 创建其他反汇编窗口。如果你想要同时查看两个不同函数的图形,可以通过Views-Open Subviews-Disassembly命令打开另一个反汇编窗口。这样打开的第一个反汇编窗口叫做IDA View-A。随后的反汇编窗口叫做IDA View-B、IDA View-C,依次类推。每个反汇编窗口都独立于其他窗口。你完全可以在一个窗口中查看一个图形,在另一个窗口中查看文本列表,或者在3个不同的窗口中查看3个不同的图形。

IDA文本视图

面向文本的反汇编窗口是查看和操作IDA生成的反汇编代码的传统显示窗口。文本显示窗口会呈现一个程序的完整反汇编代码清单(而在图形模式下一次只能显示一个函数),用户只有通过这个窗口才能查看一个二进制文件的数据部分。图形显示窗口中的所有信息均以某种形式存在于文本显示窗口中。
image.png
显示窗口的左边部分叫做箭头窗口,用于描述函数中的非线性流程。实线箭头表示非条件跳转,虚线箭头则表示条件跳转。如果一个跳转(条件或非条件)将控制权转交给程序中的某个地址(以前的),这时会使用粗线(实线或虚线)。出现这类逆向流程,通常表示程序中存在循环。在图5-4中,地址004011CF至004011C5之间就有一个循环箭头。
image.png
声明(也出现在图形视图中)是IDA对于函数栈帧布局的最准确估算。IDA会对函数栈指针及函数使用的任何栈帧指针的行为进行仔细分析,从而计算出该函数的栈帧的结构。
image.png
注释(以分号开头)属于交叉引用。在这个例子中,我们看到的是代码交叉引用(而不是数据交叉引用),它表示另一个程序指令将控制权转交给交叉引用注释所在位置的指令。

函数窗口

image.png
与其他显示窗口一样,双击Functions窗口中的一个条目,反汇编窗口将跳转到选定函数所在的位置。

输出窗口

当你打开一个新文件时,IDA工作区底部的输出窗口与其他窗口一起组成了IDA的默认窗口。输出窗口是IDA的输出控制台,从中可以找到与IDA所执行的任务有关的信息。

次窗口

十六进制窗口

默认情况下,十六进制窗口显示程序内容和列表的标准十六进制代码,每行显示16个字节,以及其对应的ASCII字符。
image.png

导出窗口

导出窗口导出窗口列出文件的入口点。这包括程序的执行入口点(在程序的文件头部分指定),以及任何由文件导出给其他文件使用的函数和变量。
image.png
通常,用户可在共享库(如Windows DLL文件)中找到导出的函数。导出的项目按名称、虚拟地址和序数(如果可用)排列。对于可执行文件,导出窗口中至少包含一个项目:程序的执行入口点。IDA将这个入口点取名为start。

导入窗口

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

结构体窗口

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

枚举窗口

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

其他窗口

每一个窗口都可通过View-Open Subviews命令打开
默认关闭

Strings窗口

Strings窗口中显示的是从二进制文件中提取出的一组字符串,以及每个字符串所在的地址。
image.png右击该窗口,在出现的菜单中选择Setup,即可开始设置
image.png
Display only defined strings(仅显示已定义的字符串)
这个选项使Strings窗口仅显示IDA自动创建或用户手动创建的已命名字符串数据项。在选中这个选项的同时禁用所有其他选项,IDA将不会自动扫描其他类型的字符串。
Ignore instructions/data definitions(忽略指令/数据定义
这个选项会使IDA扫描指令和现有数据定义中的字符串。使用这个选项,可以让IDA扫描二进制代码中错误地转换成指令的字符串,或扫描数据中非字符串格式(如字节数组或整数)的字符串。这个选项还会导致IDA生成许多垃圾字符串,即那些由5个或更多ASCII字符构成的字符串(无论其是否合法)。使用这个选项的效果类似于使用strings -a命令。

Names窗口

简要列举了一个二进制文件的所有全局名称。名称是指对一个程序虚拟地址的符号描述。在最初加载文件的过程中,IDA会根据符号表和签名分析派生出名称列表。名称可以按字母排序,也可以按虚拟地址排序(升序或降序)。用户可通过Names窗口迅速导航到程序列表中的已知位置。双击Names窗口中的名称,可立即跳转到显示该名称的反汇编视图。
image.png
Names窗口中显示的名称采用了颜色和字母编码。其编码方案总结如下。

  • F,常规函数。IDA认为这些函数不属于库函数。
  • L,库函数。IDA通过签名匹配算法来识别库函数。如果某个库函数的签名并不存在,则该函数将被标记为常规函数。
  • I,导入的名称,通常为共享库导入的函数名称。它与库函数的区别在于:导入的名称没有代码,而库函数的主体将在反汇编代码清单中显示。
  • C,命名代码。这些是已命名的程序指令位置,IDA认为它们不属于任何函数。当IDA在程序的符号表中找到一个名称,但没发现对程序位置的任何调用时,就会出现这种情况。
  • D,数据。已命名数据的位置通常表示全局变量。
  • A,字符串数据。这是一个被引用的数据位置,其中包含的一串字符符合IDA的某种已知的字符串数据类型,如以’\0’字节结束的ASCIIC字符串。

在对一个程序进行反汇编的过程中,IDA会为所有直接作为代码(分支或调用目标)或数据(读取的、写入的或使用的地址)引用的位置生成名称。如果一个位置已在程序符号表中命名,IDA将采用该名称。如果符号表中某一程序位置没有名称,则IDA会生成一个默认的名称,以在反汇编过程中使用。

  • sub_xxxxxx:地址xxxxxx处的子例程。
  • loc_xxxxxx:地址xxxxxx处的一个指令。
  • byte_xxxxxx:位置xxxxxx处的8位数据。
  • word_xxxxxx:位置xxxxxx处的16位数据。
  • dword_xxxxxx:位置xxxxxx处的32位数据。
  • unk_xxxxxx:位置xxxxxx处的大小未知的数据。

段窗口

段窗口显示的是在二进制文件中出现的段的简要列表。需要注意的在,在讨论二进制文件的结构时,IDA术语段(segment)常称为节(section)。
该窗口中显示的信息包括段名称、起始和结束地址以及许可标志。起始和结束地址代表程序段在运行时对应的虚拟地址范围。
image.png
双击段窗口中的任何条目,IDA将跳转到反汇编窗口中该段的起始位置。右击一个条目,IDA将显示一个上下文菜单,你可以选择添加新段、删除现有段、或者编辑现有段的属性。在对非标准格式的文件进行逆向工程时,这些功能特别有用,因为二进制文件的段结构可能还没有被IDA加载器检测出来。

签名窗口

image.png
IDA利用一个庞大的签名库来识别已知的代码块。签名用于识别由编译器生成的常用启动顺序,以确定可能已被用来构建给定二进制文件的编译器。签名还可用于将函数划归为由编译器插入的已知库函数,或者因为静态链接而添加到二进制文件中的函数。
image.png
在签名窗口中按下INSERT键或右击窗口,IDA都会为你提供Apply new signature(应用新签名)选项

类型库窗口

image.png
要请求IDA加载其他类型库,可以在类型库窗口中按下INSERT键,或右击窗口并在出现的菜单中选择Load Type Library(加载类型库)。
image.png

函数调用窗口

image.png
image.png

问题窗口

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1349953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring实战】15 Logback

文章目录 1. 依赖2. 配置3. 打印日志4. 启动程序5. 验证6. 调整日志级别7. 代码详细总结 Spring 作为一个现代化的 Java 开发框架,提供了很多便利的功能,其中包括灵活而强大的日志记录。本文将介绍如何结合 Spring 和 Logback 配置和使用日志&#xff0c…

旅游平台网页前后端

功能清单 游客功能 用户注册、登录登录权限拦截按名称搜索房间支付流程查看订单信息和状态评论预定过的房间,并自动修改订单状态查看统计剩余房间数量,数量为0时不可预定 管理员功能 房间分类管理 类型的删除、修改、查询(准备添加增添功能…

一文通透Text Embedding模型:从text2vec、openai-ada-002到m3e、bge

前言 本文一开始是属于此文《知识库问答LangChainLLM的二次开发:商用时的典型问题及其改进方案》的1.2节,但为把Text Embedding模型阐述的更为精准、全面,特把那部分的内容抽取出来,不断完善成此文 第一部分 衡量文本向量表示效果…

【Java系列】文件操作详解

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得,欢迎大家在评论区交流讨论💌 目录 …

天气预报网站windy的使用简介

原来这些文章我都写在QQ日志里,只为方便自己翻阅,但QQ日志很不好的地方就是没有查找功能,自己想翻看都很不方便,以后就还是在熟悉的CSDN作记录吧。 windy是个很不错的天气预报网站,对喜欢钓鱼的我来说,能方…

Python-docx 深入word源码 带有序号的段落无法设置段后、段前距离、间距等段落属性

如果使用p doc.add_paragraph(内容, styleList Number)来创建序号段落,会发现设置序号段落之间的段前、段后以及段落间距无法生效。后来将docx库生成的word文档打开后发现段落的设置出现问题,如下图红框所示,将该选项去掉即可使段落间距属性…

软件设计模式 --- 类,对象和工厂模式的引入

Q1:什么是软件设计模式? A:软件设计模式,又称设计模式。它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。综上&…

mysql原理--MySQL基于规则的优化

设计 MySQL 的大叔依据一些规则,竭尽全力的把一些很糟糕的语句转换成某种可以比较高效执行的形式,这个过程也可以被称作 查询重写 (就是人家觉得你写的语句不好,自己再重写一遍)。 1.条件化简 我们编写的查询语句的搜…

怎么给直播录屏?超简单教程,一学就会!

随着直播行业的兴起,许多玩家和观众都希望能够录制直播内容以方便随时回顾或与他人分享。可是怎么给直播录屏呢?本文将详细介绍两种流行的直播录屏方法。通过学习这两种工具,你可以轻松实现直播录屏,记录并分享你的直播内容。 怎么…

jsp结合servlet

servlet配置 环境配置2023.12.31 idea配置搭建 创建一个普通的java项目 由于新版idea去除了add framework support的ui显示,可以在左边项目栏中使用快捷键shiftk或者setting中搜索add framework support在修改对应的快捷键 点击ok然后应该就是下面这样的结果 这里…

Zookeeper-Zookeeper选举源码

看源码方法: 1、先使用:先看官方文档快速掌握框架的基本使用 2、抓主线:找一个demo入手,顺藤摸瓜快速静态看一遍框架的主线源码,画出源码主流程图,切勿一开始就陷入源码的细枝末节,否则会把自…

用户侧智能配电与智能用电系统的应用及未来——安科瑞 顾烊宇

摘要:随着科技的发展,电力系统正逐步向智能化、数字化、互联网化迈进。智能配电与智能用电是电力产业发展的重要方向,将为传统电力系统带来革命性的变革。本文将对智能配电和智能用电的概念、特点、关键技术及应用进行详细介绍。 1、智能配电…

SQL Server从0到1——基本语法

信息收集 用户: 当前用户名: select user 用户权限: 服务器级别: select IS_SRVROLEMEMBER(sysadmin) 数据库级别: select IS_MEMBER(db_owner) 2005的xp_cmdshell 你要知道他的权限一般是system 而2008他是nt …

云计算:OpenStack 分布式架构添加LVM存储(单控制节点与多计算节点)

目录 一、实验 1.环境 2.安装并配置控制节点 3. 安装并配置存储节点 4.使用LVM存储 一、实验 1.环境 (1) 主机 表1 主机 主机架构IP备注controller控制节点192.168.204.210已部署compute01计算节点1192.168.204.211 已部署compute02计算节点2192.168.204.212已部署sto…

Docker:部署若依前后端分离版

Docker:部署若依前后端分离版 1. 停止天翼云上的原来跑的若依项目2. 停止腾讯云上的若依项目3. 使用Docker部署3.1 天翼云数据库&Redis3.1.1 部署数据库3.1.2 部署Redis数据库3.1.1 部署Nginx(这里被天翼云坑了换的腾讯云运行nginx) 3.2 腾讯云部署后端&前端…

ubuntu 20.04 自由切换 python 的版本

问题描述 当前 ubuntu 20.04 默认安装了多个 python 的版本,执行 python 时,默认版本是 Python 2.7.18 zhangszzhangsz:~$ python Python 2.7.18 (default, Jul 1 2022, 12:27:04) [GCC 9.4.0] on linux2 Type "help", "copyright&quo…

【unity知识点】Unity 协程Coroutine

文章目录 前言使用协程的步骤:使用场景示例:yield return new WaitForSeconds和yield return new WaitForFixedUpdate的区别开始和停止携程完结 前言 Unity 协程是一种特殊的函数,可以在游戏中实现延迟执行、按顺序执行和异步操作等功能。它…

多人协同开发git flow,创建初始化项目版本

文章目录 多人协同开发git flow,创建初始化项目版本1.gitee创建组织模拟多人协同开发2.git tag 打标签3.git push origin --tags 多人协同开发git flow,创建初始化项目版本 1.gitee创建组织模拟多人协同开发 组织中新建仓库 推送代码到我们组织的仓库 2…

uni-app设置地图显示

使用前需到**高德开放平台(https://lbs.amap.com/)**创建应用并申请Key 登录 高德开放平台,进入“控制台”,如果没有注册账号请先根据页面提示注册账号 打开 “应用管理” -> “我的应用”页面,点击“创建新应用”&…

Golang leetcode707 设计链表 (链表大成)

文章目录 设计链表 Leetcode707不使用头节点使用头节点 推荐** 设计链表 Leetcode707 题目要求我们通过实现几个方法来完成对链表的各个操作 由于在go语言中都为值传递,(注意这里与值类型、引用类型的而区别),所以即使我们直接在…