C/C++软件逆向:IDA基本使用

news2024/12/26 1:12:30

这篇文章主要来说一下IDA的基本使用,那么在此之前先来准备一个简单的程序,作为IDA使用的实例。VS 创建一个C++项目,并设置项目属性:设置运行库为MTd(默认是MDd)

运行库选项区别:

在Visual Studio中,运行库选项(Runtime Library)决定了项目在编译和链接时使用的C/C++运行时库。Visual Studio中的主要运行库选项包括:

1. /MT (Multi-threaded):使用多线程、静态链接的C运行时库。这意味着C/C++运行时库代码会被直接嵌入到生成的可执行文件或库文件中,生成的可执行文件不依赖外部的C运行时DLL(如msvcrt.dll),因此在没有外部DLL的情况下也能运行,但是最终生成的二进制文件可能会较大。
2. /MTd (Multi-threaded Debug):与/MT类似,但使用的是调试版的C运行时库。这些库包含额外的调试信息,并在运行时执行更多的检查,有助于在开发阶段发现内存泄漏和其他运行时错误。但是,生成的二进制文件较大,而且包含调试信息,性能不如发布版好。
3. /MD (Multi-threaded DLL):使用多线程、动态链接的C运行时库。程序在运行时依赖于C运行时DLL(如msvcrt.dll),因此需要在目标系统上确保这些DLL存在。
4. /MDd (Multi-threaded Debug DLL):与/MD类似,但使用的是调试版的C运行时库。调试版的DLL通常是msvcrtd.dll。

直接生成程序:

打开当前项目所在目录,找到生成的exe程序;可以看到与exe同目录下还存在着.ilk.pdb两个文件;那么这两个文件是什么,与exe文件的关系又是什么。

ilk文件(增量链接文件)
.ilk文件记录了上一次链接操作的信息,包括哪些对象文件发生了变化。这样,在后续的编译过程中,如果只有部分代码发生了变化,链接器可以利用.ilk文件中的信息,仅对更改部分进行链接,而不需要重新链接整个项目。增量链接的主要目的是加快开发阶段的链接时间,特别是对于大型项目,这种方式可以显著减少每次编译所需的时间。
pdb文件(调试信息文件)
.pdb文件包含了与可执行文件关联的调试符号和源代码信息。这些信息包括函数名、变量名、源代码行号等。在调试时,.pdb文件使得调试器能够将二进制代码映射回源代码,从而允许开发者查看变量的名称和类型、设置断点、查看调用堆栈以及源代码的确切行号等。没有.pdb文件,调试器只能展示汇编代码和原始的内存地址,极大地增加了调试的难度。

.pdb文件时,静态分析可以更加直接和高效,工具能够提供丰富的符号信息、源代码映射、调试功能等,大大简化了理解和分析程序的过程。

OK,程序准备完成,我们正式开始来说说IDA的基本使用方法。我们只要将程序拖到IDA中即可。

拖入后会显示一个窗口,这边可以选择使用哪种方式对该程序进行解析:

①Portable executable for 80386 (PE) [pe.dll]   #以解析PE文件的方式对其进行解析
②MS-Dos executable (EXE)[dos.dll]              #以DOS方式对其进行解析
③Binary file                                   #以二进制文本的方式对其进行解析
①Portable executable for 80386 (PE) [pe.dll]

这是 Windows 平台上常见的可执行文件格式,适用于 80386 及以上的处理器架构。PE 文件格式包括了用于 Windows 操作系统的所有类型的可执行文件(EXE、DLL、SYS 等),选择这个选项时,IDA 会使用 pe.dll 插件来解析和反汇编 PE 文件。这种格式包含丰富的元数据,如导入/导出表、资源表等,方便反汇编和逆向工程分析。

②MS-Dos executable (EXE)[dos.dll]

这是早期 DOS 操作系统使用的可执行文件格式,主要用于 16 位程序。虽然现代系统很少使用这种格式,但在分析老旧软件或遗留系统时仍然有用。选择这个选项时,IDA 会使用 dos.dll 插件来解析和反汇编 DOS 可执行文件。这种格式的结构相对简单,通常不包含复杂的元数据。

③Binary file

这是一个通用选项,适用于没有特定文件格式的原始二进制文件。这种文件通常没有固定的结构或元数据;选择这个选项时,IDA 不会使用任何特定的插件进行解析,而是将文件作为原始的二进制数据加载。用户需要手动指定入口点、处理器架构、加载地址等信息,以便 IDA 进行正确的反汇编。这对于嵌入式系统固件、裸机程序等没有标准文件格式的二进制文件尤为有用。如果IDA不能识别的二进制代码,例如ShellCode代码,可选择Binary file方式加载,

一般我们在解析exe文件时选择Portable Executable for 80386 (PE) [pe.dll]即可。

除此之外在这里我们还可以选择程序的架构类型:

此处根据程序架构进行选择即可,选择完成点击OK后IDA就能对程序进行分析,分析的内容可以包括源代码(如果可用)、反汇编代码、反编译后的伪代码、程序结构、数据流、控制流等。这个时候我们就可以得到这样一个页面:

IDA组件介绍

接着我们就来说一下这个页面中都包含了哪些内容:

1.导航条

主界面中存在一项颜色各异的导航条。通过导航条可了解分析可执行文件各部分数据分布情况,它用于概览和快速跳转到二进制文件的不同部分;导航条提供了对程序整体结构的可视化表示,并通过颜色编码显示不同类型的内容。部分颜色代表含义如下:

蓝色:表示常规的指令函数,绝大部分为用户编写的代码,上图中绝大部分数据属于蓝色数据。
黑色:表示间隙部分内容,可执行文件中包含多个节段,相邻节段之间存在空隙,红色表示空隙部分。
银白色:表示数据项部分内容,可执行文件中会包含大量数据,银白色表示数据项部分内容。
粉色:表示外部导入符号,通常可执行文件会导入外部的库函数。
暗黄色:表示IDA未识别的内容,需要用户根据需求自行分析。

当然,IDA也允许用户自定义导航栏的颜色:option->colors->navigation band

在这个位置用户可以根据自身喜好对导航栏各部分内容所显示的颜色进行设置。

2.反汇编窗口

IDA View-A显示的是反汇编视图,也就是目标二进制文件的汇编代码。这是IDA中最常用的视图之一,用于展示程序的机器代码如何被反汇编成汇编语言指令。

反汇编窗口可分为两种模式,分别为:默认模式和图形模式。在IDA的View-A(反汇编视图)中,按下空格键,会在反汇编视图图视图(Graph View)之间切换。

①反汇编视图(如上图):显示程序的汇编代码,可以看到每条指令的地址、机器码和对应的汇编指令;这个视图以线性的方式显示代码,即按内存地址顺序逐行显示。
②图视图:展示了函数的控制流图(Control Flow Graph, CFG),这是一个可视化的图表,显示了函数中的各个基本块(Basic Block)以及它们之间的跳转关系。

3.Hex View-1

在IDA中,Hex View-1是一个专门用于显示和分析二进制文件原始字节数据的窗口。这个视图展示了程序的原始内容,即内存中的实际字节值,以十六进制(hexadecimal)形式显示。

二进制窗口可支持用户查看可执行文件对应相对偏移的二进制机器码数据;Hex View-1视图分为左侧,中间,右侧三个部分:

①左侧:显示内存地址,这些地址表示显示的每一行字节数据在内存中的位置,地址列帮助我们定位程序在文件或内存中的特定部分。
②中间部分:显示内存中的原始数据,每行通常有16个字节,每个字节以两位十六进制数表示;直观地表示了文件或内存中的实际内容,这对于分析文件格式、识别数据结构或查找特定的字节模式非常有用。
③右侧:显示每个字节对应的ASCII字符;可以帮助我们识别数据中的字符串或文本内容,例如可读的文件名、路径、标识符等。

右侧内容乱码解决方法:

Options->general->Strings->Default 8bit修改为UTF-8

修改后的结果:

3.结构窗口(Structures)

Structures用于管理和查看程序中定义的结构体(structures)。这个窗口允许你查看、编辑和创建结构体,从而更好地理解和解析二进制文件中复杂的数据结构。结构体在逆向工程和调试中起到关键作用,特别是在处理涉及多字段的复杂数据时。

Structures窗口列出了所有在程序中定义的结构体。每个结构体都有一个名称以及与其相关的属性。我们可以通过双击结构体的名称来查看其详细内容,包括结构体的字段、字段的类型和大小等信息,还可以直接在这个窗口中编辑现有结构体或添加新字段。

结构窗口提供用户查询已定义的结构体,同时IDA可识别出可执行文件包含的部分结构体数据,结构窗口可通过快捷键“+”、“-”(或双击结构体名)展开和收缩结构体,IDA结构窗口支持用户自定义结构体。

4.枚举窗口(Enums)

Enums(枚举)窗口是一个用于管理和查看程序中定义的枚举类型的工具。

5.导入函数窗口(Imports)

Imports窗口是一个用于查看和管理程序中导入函数和库的工具。导入(imports)通常是指程序从外部库(如动态链接库DLL)中引用的函数和变量。这些导入的函数和变量在程序运行时由操作系统加载,并链接到程序中使用。

IDA提供导入函数窗口,用于可在导入函数窗口中查看当前可执行文件导入哪些外部函数库及函数,通过导入函数窗口可获取到函数内存相对偏移地址、函数名、导入函数所属的库文件。

6.导出函数窗口(Exports)

Exports窗口用于显示和管理当前分析的二进制文件中导出的函数和变量。导出(exports)通常是指程序或动态链接库中可以被其他程序或模块引用和调用的函数和变量;这些导出项使得一个模块能够提供功能或数据给其他模块使用。IDA的导出函数窗口提供可执行文件导出函数信息,通过导出函数窗口可获取到导出的函数名、函数对应的内存相对偏移地址。

7.函数窗口(Function Window)

在IDA中,函数窗口(Functions Window)是一个非常重要的工具,它列出了当前分析的二进制文件或可执行程序中所有已识别的函数。这个窗口有助于你快速浏览、定位和分析程序中的不同函数,是逆向工程和程序分析的核心部分之一。

在窗口按下“CTRL + F”快捷键便可根据需求搜索函数名,快速定位函数名方式可提供逆向分析效率。

8.Strings窗口

Strings窗口是一个专门用于显示和管理二进制文件或可执行文件中字符串的工具。字符串通常是程序中存储的文本数据,如错误信息、调试信息、用户提示、文件路径、网络地址等。通过分析这些字符串,你可以获得有关程序功能、逻辑和操作的许多有用信息。Strings窗口默认是不显示的,开启的路径为:

View->Open Subview->Strings

IDA的快捷键:

这边先写几个,后续文章如果有用到其他的快捷键则在后续文章中进行补充。

1.注释

添加注释很简单,只是一个快捷键分号;,找到需要添加注释的代码块,按下分号,输入注释内容即可。

2.空格键:反汇编窗口切换文本跟图形
3.交叉引用

交叉引用(Cross-Reference,简称Xref)在软件逆向工程和程序分析中是一个非常重要的概念,它指的是在代码中,一个特定的符号、函数、变量或数据被引用(使用)的所有位置,通过分析交叉引用,你可以了解一个符号在程序中的使用情况,追踪程序的执行流,以及理解程序的逻辑和结构。

快捷键:Ctrl+X,类似于OD中的栈回溯操作;此时我选择_main函数,输入Ctrl+X则会显示该函数在何处被引用

点击OK后则跳转至被引用的位置:

4.打开签名窗口

签名窗口(Signatures Window)是一个用于管理和应用函数签名的工具,函数签名是预定义的函数特征,用于自动识别二进制文件中的已知函数,通过应用签名,IDA 可以帮助你快速标识和命名那些常见的或已知的库函数,从而减少手动分析的工作量。

快捷键:Shift+F5

5.搜索字符串(文本搜索)

快捷键:Alt + T

无论你是刚刚踏入逆向工程领域的新手,还是经验丰富的安全研究员,IDA都能帮助你更高效地理解和解读复杂的二进制文件。逆向工程的道路充满挑战,但也是不断发现和学习的过程。愿你在未来的探索中,能够利用IDA这把利器,攻克更多的技术难题,收获更多的成就感。

【注】:后台回复“IDA”获取IDA工具,另外还有其他学习数据也可以自行回复获取。

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

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

相关文章

Git使用速通

目录 一、Git相关配置系统配置文件存放处用户配置文件所在地用户名称和e-mail地址 二、初始化仓库git init——初始化仓库git status——查看仓库的状态git add——向暂存区中添加文件git commit——保存仓库的历史记录 三、版本回退与文件修改git log——查看提交日志git refl…

基于Java的线上售楼系统的设计与实现(论文+源码)_kaic

摘 要 现代化的线上售楼管理正在逐渐成为现代社会的重要需求,而目前的线上售楼由于存在管理不规范等缺点,严重制约了楼房和房地产公司的发展,建设一个更加规范化的线上售楼系统是十分迫切需要的。为此,使用Java语言,S…

leetCode - - - 双指针

目录 1.寻找重复数(LeetCode 287) 解法一:二分查找 解法二:快慢指针 2.验证回文串(LeetCode 125) 3.三数之和(LeetCode 15) 4.四数之和(LeetCode 18) …

Unity 麦扣 x 勇士传说 全解析 之 怪物基类与野猪(附各模块知识的链接,零基础也包学会的牢弟)(案例难度:★★☆☆☆)

通过一阵子的学习,我是这么认为的,因为该教程是难度两星的教程 ,也就是适合学了一阵子基础组件以后的学习者 (什么都不会的学习者要是学这套课程会困难重重,如果你什么都不会那么需要学习一星教程) 所以该…

基于asp.net的webform框架的校园点餐系统源码

今天给大家分享一套基于asp.net的webform框架的网页点餐系统,适合课程设计参考及其自己学习,需要的小伙伴自己参考下,下载链接我放在后面了 主要功功能 系统的主要功能包含:前端点餐页面、加入购物车、商品食物浏览、我的购 物车…

ffmpeg开发者视频剪辑器

5G 时代的来临,加速了视频类作品的创作,由于现在的流量越来越便宜,网速越来越快,特别是流量无限用套餐,大家更愿意去看视频作品,特别是抖音的兴起,更是加速了小视频的流量。不会剪辑的我们该如何…

windows安装android studio

下载 https://developer.android.google.cn/studio?hlzh-cn 安装 打开cmd输入如下命令 android-studio-2024.1.1.12-windows.exe /NCRC 注意 运行命令后可能还报错,但是会出现弹窗 如果还是报错可以选择zip 运行 不设置代理 等待下载即可,…

SAP LE学习笔记04 - MM与WM跨模块收货到仓库的流程中 如何既创建TR又同时立即在前台创建TO

上一章讲了在MM模块的IM(在库管理)中收货到仓库的流程,以及关联WM移动Type与IM移动Type。 SAP LE学习笔记03 - 在IM(在库管理)中收货到仓库的流程,关联 WM移动Type与IM移动Type-CSDN博客 本章继续将LE的其他知识。 - MM与WM跨模块收货到仓库的流程中,如…

深入探索Amazon EC2:解锁云端计算的无限可能

欢迎来到本次的实验教程,这将引导您在功能强大且充满活力的 Amazon Web Services (AWS) 云中启动并配置虚拟机。 在本次实验中,您将亲身体验如何利用 Amazon 机器映像 (AMI) 启动 Amazon EC2 实例,并掌握使用密钥对进行 SSH 认证登录实例的技…

第18 章探讨 C++新标准.可变参数模板,模板和函数参数包,展开参数包

第18 章探讨 C新标准.可变参数模板,模板和函数参数包,展开参数包 第18 章探讨 C新标准.可变参数模板,模板和函数参数包,展开参数包 文章目录 第18 章探讨 C新标准.可变参数模板,模板和函数参数包,展开参数包18.6 可变参数模板18.6.1 模板和函数参数包18.6.2 展开参数包18.6.3 …

Bootstrap个人技术博客响应式网页模板

Bootstrap个人技术博客响应式模板基于Bootstrap3.3.5制作,自适应分辨率,兼容PC端和移动端,全套模板,包括首页、关于、网页配色、内容页、友情链接、读者墙、标签云、点赞等网站模板页面。模板下载地址http://m.bokequ.com/moban/1…

我在高职教STM32——I2C通信之SHT20传感器(2)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助CSDN平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分…

ubuntu基于sealos搭建k8s集群,helm3安装配置自动化扩容Prometheus,grafana出图展示,以及动态web搭建

1.项目简介 大方向:k8s云原生方向,运维技术,配置问题解决 解决技术:ubuntu模板机安装,配置远程xshell连接ubuntu,设置静态ip,换ubuntu阿里云源,配置集群间域名解析,解决双IP冲突网…

I2C的10-bit地址空间

10-bit地址空间: I2C支持 10-bit的设备地址,此时的时序如下图所示: 在 10-bit地址的 I2C系统中,需要两个帧来传输 slave的地址。第一个帧的前 5个 bit固定为 b11110,后接 slave地址的高 2位,第 8位仍然是 …

牛客面经学习笔记(四)

这种拨码开关在PLC里面很是常用: 这种弧型线就很漂亮: 这个白色按键很漂亮: 快恢复保险丝: 继电器电路: 这里的续流二极管很重要,因为继电器是感性元件: 【【必考】5招搞清楚!单点接…

关于pytorch后续学习需要下载的包太慢怎么办?tensorboard为例

启发: anaconda python3.7安装TensorFlow 1.9.0(CPU版) 和这个佬的 我是CPU版本(好像是需要找anaconda对应版本,我不知道咋找版本,不知道不同版本的对应关系) 此时,我们可以浅浅pip…

民航网上订票系统设计和实现--论文pf

TOC springboot427民航网上订票系统设计和实现--论文pf 第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。随着电脑和…

【系统分析师】-综合知识-系统架构

1、设计模式 1)观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新【消息订阅】。在该模式中,发生改变的对象称为观察目标,被通知的对象称为观察者&…

泰坦尼克号 - 从灾难中学习机器学习/Titanic - Machine Learning from Disaster(kaggle竞赛)第二集(加载数据)

此次目的: hello大家好,俺是没事爱瞎捣鼓又分享欲爆棚的叶同学!!!准备出几期博客来记录我学习kaggle数据科学入门竞赛的过程,顺便也将其中所学习到的知识分享出来。这是第一集(了解赛题&#x…

Ansible可视化管理之web界面集成使用探究(未完待续)

一、前言 因某集成商管理的客户资源涉及4A接入管控要求,其中密码必须3个月更新一次,随着纳管主机的数量增多,手动去修改密码变得不现实,考虑无侵入性和资源耗用,便捷性等因素,首先选用Ansible作为此需求的…