复习基础知识1
局部变量

写程序时,程序员经常会用到局部变量
汇编中寄存器、栈,可写区段、堆,函数的局部变量该存在哪里呢?
注意:局部变量有易失性
一旦函数返回,则所有局部变量会失效。
考虑到这种特性,人们将局部变量存放在栈上,在每次函数被调用时,程序从栈上分配一段空间,作为存储局部变量的区域
每个函数在被调用时候都会产生这样的局部变量的区域、存储返回地址的区域和参数的区域
程序一层层地深入调用函数,每个函数自己地区域就是一层层地叠在栈上
人们把每个函数自己的这一片区域称位帧,由于这些帧都在栈上,所以又被称为栈帧
栈的内存区域并不一定时固定的,而且随着每次调用的路径不同,栈帧的位置也会不用,那么如何才能正确引用局部变量呢?
虽然栈的内容随着进栈和出栈会一直不断变化,但是一个函数中每个局部变量相对于该函数栈帧的偏移都是固定的
所以可以引入一个寄存器专门来存储当前栈帧的位置,即 ebp称为帧指针
程序在函数初始化阶段赋值ebp位栈帧中间的某个位置,这样可以用ebp引用所有的局部变量
由于上一层的父函数也要使用ebp,因此要在函数开始时先保存ebp,再赋值ebp为自己的栈帧的值,这样的流程在汇编代码中便是经典的组合
push ebp
mov ebp,esp
现在每个函数的栈帧便由局部变量、父栈帧的值,返回地址、参数四部分构成
可以看出ebp在初始化后之际上指向的是父栈帧地址的存储位置
因此,#ebp形成了一个链表,代表一层层的函数调用链
随着编译技术的发展,编译器也可以通过跟踪计算每个指令执行时栈的位置
从而直接越过ebp,而使用栈指针esp来引用局部变量
这样可以节约每次保存ebp时需要的时间,并增加了一个通用寄存器,从而提高了程序性能
于是现在有两种函数:一是有帧指针的函数,二是经过优化后没有帧指针的函数
现代的分析工具将使用高级的栈指针跟踪方法来针对性地处理这两种函数,从而正确处理局部变量
IDA
1.打开文件

IDA Pro使用的是递归下降反汇编算法
在界面中“New”按钮,并在弹出的对话框中选择要打开的文件,也可以单击“Go”按钮,然后在打开的界面中将文件拖拽进去,或者通过"Previous",按钮、双击列表项等快速打开之前打开过的文件
注意:在打开文件之前需要选择正确的构架版本

上面IDA显示此文件为AMD64,PE文件,所以用64位打开
2.加载文件
“Load a new file"对话框中的选项主要针对高级用户,初学者可以使用默认设置,不需要改动,单击“OK”按钮,加载文件进去IDA
注意:在初次使用时,IDA可能弹出选择是否使用”Proximity Browser"的对话框,单击NO按钮,进入正常的反汇编界面。
IDA会为文件生成一个数据库(IDB)将,整个文件所需的内容存入其中
以后的分析中,就不再需要访问输入文件了,对数据库中的各种修改也会独立于输入的文件
以下有几个部分
- 导航栏:显示程序的不同类型数据(普通函数、未定义函数的代码、数据、未定义等)的分布情况
- 反汇编的主要窗口:显示反汇编的结果、控制流图等,可以进行拖动、选择等操作
- 函数窗口:显示所有的函数名称和地址(拖动下方滚动条即可查看到),可以通过Ctrl+F组合键进行筛选
- 输出窗口:显示运行过程中IDA的日志,也可以在下方的输入框中输入命令执行
- 状态指示器:显示位“AU:idle”即代表IDA已经完成了对程序的自动化分析
在汇编窗口中,使用右键菜单或者快捷键空格可以在控制流图中和文本界面反汇编键切换


3.数据类型操作
IDA的一大亮点是用户可以通过界面交互来自由控制反汇编的流程
在加载文件的过程中,IDA已经尽其所能,为用户自动定义了大量位置的类型,如IDA将代码段的多数数据正确标注为代码类型,并对其进行反汇编,将特殊段的部分位置标注为8字节类型qword
IDA的能力是有限的,一般情况下并不能正确标出所有的数据类型,而用户可以通过正确的定义1字节或一段区域的类型,纠正IDA出现的问题
低版本的IDA没有撤销功能
用户可以根据地址的颜色来分辨某个位置的数据类型
被标注为代码的位置,将地址将会是黑色显示的;标注为数据的位置,为灰色;未定义数据类型的位置则会使显示位黄色


下面介绍快捷键,使用这些快捷键需要光标在对应上才能生效
- U(Undefine)键:即取消一个地方已有的数据类型定义,此时会弹出确认的对话框,单击“Yes”按钮即可
- D(Data)键:即让某一个位置变成数据。一直按D键,这个位置的数据类型将会以1字节(byte/db)、2字节(word/dw)、4字节(dword/dd)、8字节(qword/dq)进行循环。IDA为了防止误操作,如果定义数据的操作会影响到已经有数据类型的位置,IDA会弹出确认的对话框;如果操作的位置及其附近完全是Undefiend,则不会弹出确认对话框
- C(Code)键:即让某一个位置位指令。确认对话框的弹出时机也与D键类似。在定义为指令后,IDA会自动以此为起始位置进行递归下降反汇编
以上是基本的定义数据的快捷键,为了应对日益复杂的数据类型,IDA还内建了各种数额据类型,如数组、字符串等
-
A(ASCII)键:会以该位置为起点定义一个以“\0”结尾的字符串类型,

-
*键:将此处定义为一个数组,此时弹出一个对话框,用来设置数组的属性
-
O(Offset)键:即将此处定义一个地址偏移

4.函数操作
反汇编不是完全连续的,而是由分散的各种函数拼凑而成
每个函数有局部变量、调用约定等信息,控制流图也只能以函数为单位生成和显示,故正确定义函数同样非常重要
IDA处理函数的操作:
- 删除函数:在函数窗口中选中函数后,Delete键
- 定义函数:在反汇编窗口中选中对应后,按P键
- 修改函数参数:在函数窗口中并按Ctrl+E组合键,或反汇编窗口的函数内部按Alt+P组合键
在定义函数后,IDA即可进行很多函数层面的分析,如调用约定分析、栈变量分析、函数调用参数分析等
这些分析对于还原反汇编的高层语义都有着直接和巨大的帮助
5.导航作用
虽然可以通过鼠标点击在不同的函数之间切换,但是随着程序规模的增大,使用这种方式来定位显得不太现实
IDA有导航历史的功能,类似资源管理器和浏览器的历史纪录,可以后退或者前进到某次浏览的地方
6.类型操作
IDA开发了一套类型分析系统,用来处理C/C++语言的各种数据类型(函数声明、变量声明、结构体声明等),并且允许用户自由指定。这无疑让反汇编的还原变得更加准确。选中变量、函数后按Y键,弹出“Please enter the type declaration”对话框,从中输入正确的C语言类型,IDA就可以解析出并自动应用这个类型
7.IDA操作的操作模式
- IDA的反汇编窗口中的各种操作在选中时和未选中时会是有不同的功能 Ag:快捷键C对应的操作在选中反汇编窗口时,能指定递归下降反汇编的扫描区域
- IDA的反汇编窗口中的部分快捷键在多次使用的时候会有不同功能,如快捷键O在对着同一个位置第二次使用时会恢复第一次的操作
- IDA的右键快捷菜单中会标注各种快捷键
- IDA的对话框的按钮可以通过其首字母的来取代鼠标点击(“Yes”,按钮Y就行)
8.IDAPython
IDAPython时IDA内建的Python环境,可以通过接口进行数据库的各种操作,目前它及已经可以执行绝大多数IDA SDK中的C++函数和IDC函数,可以说是同时有着IDC的便捷和C++SDK的强大
Alt+F7组合键或者"File->Script file‘菜单命令
执行Python脚本文件
输出窗口中也有一个Python的Console框
执行Python语句
按Shift+F2组合键,或者”File->Script command“菜单命令,可以打开脚本面板,将”Scripting language"改为Python即可获得一个简易的编译器

我这里版本可能低了,没有python
9.IDA其他功能
IDA的菜单栏“View——>Open subviews”下可以看见各种类型的窗口

String窗口:按Shift+F12组合键即可以打开,可以识别程序中的字符串,双击即可在反汇编窗口中定位到目标字符串
十六进制窗口:默认打开,可以按F2键对数据库中的数据进行修改,修改后再次按F2键即可应用修改

递归下降反汇编算法
递归下降反汇编算法是一种反汇编算法,它使用递归来分析指令流。它与线性扫描反汇编算法不同,后者逐个分析指令。
递归下降反汇编算法的工作原理如下:
- 从起始地址开始。
- 识别当前指令的类型。
- 根据指令类型,执行相应的操作。
- 如果指令是跳转指令,则将跳转目标地址添加到要反汇编的地址列表中。
- 递归地反汇编地址列表中的地址。
递归下降反汇编算法的优点是:
- 可以轻松处理跳转指令。
- 可以生成更准确的反汇编代码。
递归下降反汇编算法的缺点是:
- 可能存在递归调用过多导致栈溢出的问题。
- 难以处理循环指令。
以下是一些递归下降反汇编算法的示例:
// 识别 add 指令
if (opcode == 0x01) {// 解析第一个操作数operand1 = parse_operand();// 解析第二个操作数operand2 = parse_operand();// 生成汇编代码emit("add %s, %s", operand1, operand2);
}// 识别 jmp 指令
if (opcode == 0x02) {// 解析跳转目标地址target_address = parse_address();// 将跳转目标地址添加到要反汇编的地址列表中addresses.push_back(target_address);
}
在实际应用中,递归下降反汇编算法通常与其他反汇编技术结合使用,以提高反汇编的准确性和效率。
相关文章:
复习基础知识1
局部变量 写程序时,程序员经常会用到局部变量 汇编中寄存器、栈,可写区段、堆,函数的局部变量该存在哪里呢? 注意:局部变量有易失性 一旦函数返回,则所有局部变量会失效。 考虑到这种特性,人们…...
java8-用流收集数据-6
本章内容口用co1lectors类创建和使用收集器 口将数据流归约为一个值 口汇总:归约的特殊情况 数据分组和分区口 口 开发自己的自定义收集器 我们在前一章中学到,流可以用类似于数据库的操作帮助你处理集合。你可以把Java8的流看作花哨又懒惰的数据集迭代器。它们…...
[前端开发] JavaScript基础知识 [上]
下篇:JavaScript基础知识 [下] JavaScript基础知识 [上] 引言语句、标识符和变量JavaScript引入注释与输出数据类型运算符条件语句与循环语句 引言 JavaScript是一种广泛应用于网页开发的脚本语言,具有重要的前端开发和部分后端开发的应用。通过JavaSc…...
初识Qt | 从安装到编写Hello World程序
文章目录 1.前端开发简单分类2.Qt的简单介绍3.Qt的安装和环境配置4.创建简单的Qt项目 1.前端开发简单分类 前端开发,这里是一个广义的概念,不单指网页开发,它的常见分类 网页开发:前端开发的主要领域,使用HTML、CSS …...
机器学习:过拟合和欠拟合的介绍与解决方法
过拟合和欠拟合的表现和解决方法。 其实除了欠拟合和过拟合,还有一种是适度拟合,适度拟合就是我们模型训练想要达到的状态,不过适度拟合这个词平时真的好少见。 过拟合 过拟合的表现 模型在训练集上的表现非常好,但是在测试集…...
变分自编码器(VAE)PyTorch Lightning 实现
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
设备驱动开发_1
可加载模块如何工作的 主要内容 描述可加载模块优势使用模块命令效率使用和定义模块密钥和模块工作1 描述可加载模块优势 开发周期优势: 静态模块在/boot下的vmlinuz中,需要配置、编译、重启。 开发周期长。 LKM 不需要重启。 开发周期优于静态模块。 2 使用模块命令效率…...
C语言位域(Bit Fields)知识点精要解析
在C语言中,位域(Bit Field)是一种独特的数据结构特性,它允许程序员在结构体(struct)中定义成员变量,并精确指定其占用的位数。通过使用位域,我们可以更高效地利用存储空间࿰…...
离散数学——图论(笔记及思维导图)
离散数学——图论(笔记及思维导图) 目录 大纲 内容 参考 大纲 内容 参考 笔记来自【电子科大】离散数学 王丽杰...
opencv图像像素的读写操作
void QuickDemo::pixel_visit_demo(Mat & image) {int w image.cols;//宽度int h image.rows;//高度int dims image.channels();//通道数 图像为灰度dims等于一 图像为彩色时dims等于三 for (int row 0; row < h; row) {for (int col 0; col < w; col) {if…...
Java学习第十四节之冒泡排序
冒泡排序 package array;import java.util.Arrays;//冒泡排序 //1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置 //2.每一次比较,都会产生出一个最大,或者最小的数字 //3.下一轮则可以少…...
第1章 计算机网络体系结构-1.1计算机网络概述
1.1.1计算机网络概念 计算机网络是将一个分散的,具有独立功能的计算机系统通过通信设备与路线连接起来,由功能完善的软件实现资源共享和信息传递的系统。(计算机网络就是一些互连的,自治的计算机系统的集合) 1.1.2计算机网络的组成 从不同角…...
蓝桥杯:C++排序
排序 排序和排列是算法题目常见的基本算法。几乎每次蓝桥杯软件类大赛都有题目会用到排序或排列。常见的排序算法如下。 第(3)种排序算法不是基于比较的,而是对数值按位划分,按照以空间换取时间的思路来排序。看起来它们的复杂度更好,但实际…...
数据结构-堆
1.容器 容器用于容纳元素集合,并对元素集合进行管理和维护. 传统意义上的管理和维护就是:增,删,改,查. 我们分析每种类型容器时,主要分析其增,删,改ÿ…...
奔跑吧小恐龙(Java)
前言 Google浏览器内含了一个小彩蛋当没有网络连接时,浏览器会弹出一个小恐龙,当我们点击它时游戏就会开始进行,大家也可以玩一下试试,网址:恐龙快跑 - 霸王龙游戏. (ur1.fun) 今天我们也可以用Java来简单的实现一下这…...
Ubuntu 1804 And Above Coredump Settings
查看 coredump 是否开启 # 查询, 0 未开启, unlimited 开启 xiaoUbuntu:/var/core$ ulimit -c 0# 开启 xiaoUbuntu:/var/core$ ulimit -c unlimited查看 coredump 保存路径 默认情况下,Ubuntu 使用 apport 服务处理 coredump 文件ÿ…...
docker 2:安装
docker 2:安装 ubuntu 安装 docker sudo apt install docker.io 把当前用户放进 docker 用户组,避免每次运行 docker 命都要使用 sudo 或者 root 权限。 sudo usermod -aG docker $USERid $USER 看到用户已加入 docker 组 …...
LeetCode Python - 19.删除链表的倒数第N个结点
目录 题目答案运行结果 题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: 输入:head [1], n 1 输出&a…...
Spring Boot 笔记 005 环境搭建
1.1 创建数据库和表(略) 2.1 创建Maven工程 2.2 补齐resource文件夹和application.yml文件 2.3 porn.xml中引入web,mybatis,mysql等依赖 2.3.1 引入springboot parent 2.3.2 删除junit 依赖--不能删,删了会报错 2.3.3 引入spring web依赖…...
【解决(几乎)任何机器学习问题】:超参数优化篇(超详细)
这篇文章相当长,您可以添加至收藏夹,以便在后续有空时候悠闲地阅读。 有了优秀的模型,就有了优化超参数以获得最佳得分模型的难题。那么,什么是超参数优化呢?假设您的机器学习项⽬有⼀个简单的流程。有⼀个数据集&…...
ECC 从安装到精通
一句话:从零安装 ECC,手把手构建一个 CLI TODO 工具,走完完整的 AI 辅助开发工作流。为什么要用 ECC Claude Code 原生能力很强,但缺乏一套系统级的开发工具链。ECC(Everything Claude Code)就是这层补充—…...
Windows HEIC缩略图插件:为什么你的iPhone照片在Windows上无法预览?
Windows HEIC缩略图插件:为什么你的iPhone照片在Windows上无法预览? 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC/HEIF files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumb…...
ghw高级功能:系统信息、基板、BIOS和产品信息的完整教程
ghw高级功能:系统信息、基板、BIOS和产品信息的完整教程 【免费下载链接】ghw Go HardWare discovery/inspection library 项目地址: https://gitcode.com/gh_mirrors/gh/ghw ghw是一个功能强大的Go硬件发现/检查库,能够帮助开发者轻松获取系统硬…...
FreeRTOS源码解析(9)任务通知
1.任务通知本质:直接操作目标任务的 TCB 字段。 它不自带控制块、不分配独立存储、不维护自己的等待列表——全程只做一件事:读写目标任务 TCB 里已有的 ulNotifiedValue 和 ucNotifyState,必要时将对方从延迟列表移到就绪列表。正因如此&…...
【NotebookLM戏剧研究辅助实战指南】:20年戏剧学者亲授AI赋能文本细读的5大黄金工作流
更多请点击: https://intelliparadigm.com 第一章:NotebookLM戏剧研究辅助的底层逻辑与学科适配性 NotebookLM 以“语义锚点驱动”为核心机制,将用户上传的原始文本(如莎士比亚手稿影印本OCR结果、梅兰芳口述史转录稿、《奥尼尔书…...
解放Windows潜能:APK安装器让安卓应用在电脑上完美运行
解放Windows潜能:APK安装器让安卓应用在电脑上完美运行 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾梦想过在Windows电脑上直接运行手机应用&am…...
修一个Bug,引入另一个Bug:从Tomcat高危漏洞看中间件安全修复的困境
攻击者无需认证,仅需向集群通信端口发送构造数据,即可绕过加密校验并触发反序列化,实现远程代码执行。这个漏洞的特殊之处在于——它是官方修复上一个漏洞时“顺手”引入的。2026年5月,Apache Tomcat官方披露了一个高危漏洞CVE-20…...
2026学数据分析对就业能力提升的价值
一、行业需求与就业前景数据分析行业近年来的增长趋势和未来预测,2026年市场对数据分析师的需求量。不同行业(金融、医疗、电商等)对数据分析技能的具体需求。二、技能要求与学习路径数据分析岗位的核心技能(Python/R、SQL、统计学…...
基于DS18B20与WipperSnapper的无代码物联网温度监测方案
1. 项目概述:当经典传感器遇上无代码物联网 在物联网和智能硬件的世界里,温度监测是一个永恒的基础需求。无论是想监控家里的温室环境、记录鱼缸水温,还是追踪服务器机柜的热量变化,你都需要一个可靠、精确且易于集成的温度传感器…...
Opensmile实战:从零到一的音频特征提取指南
1. 为什么选择Opensmile处理音频特征? 第一次接触音频分析时,我被各种专业工具搞得眼花缭乱。直到实验室的师兄推荐了Opensmile,这个开源工具彻底改变了我的工作效率。它最吸引我的地方在于三点:全流程覆盖(从特征提取…...
