当前位置: 首页 > news >正文

复习基础知识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键即可应用修改
在这里插入图片描述

递归下降反汇编算法

递归下降反汇编算法是一种反汇编算法,它使用递归来分析指令流。它与线性扫描反汇编算法不同,后者逐个分析指令。

递归下降反汇编算法的工作原理如下:

  1. 从起始地址开始。
  2. 识别当前指令的类型。
  3. 根据指令类型,执行相应的操作。
  4. 如果指令是跳转指令,则将跳转目标地址添加到要反汇编的地址列表中。
  5. 递归地反汇编地址列表中的地址。

递归下降反汇编算法的优点是:

  • 可以轻松处理跳转指令。
  • 可以生成更准确的反汇编代码。

递归下降反汇编算法的缺点是:

  • 可能存在递归调用过多导致栈溢出的问题。
  • 难以处理循环指令。

以下是一些递归下降反汇编算法的示例:

// 识别 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)中定义成员变量,并精确指定其占用的位数。通过使用位域,我们可以更高效地利用存储空间&#xff0…...

离散数学——图论(笔记及思维导图)

离散数学——图论(笔记及思维导图) 目录 大纲 内容 参考 大纲 内容 参考 笔记来自【电子科大】离散数学 王丽杰...

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.比较数组中&#xff0c;两个相邻的元素&#xff0c;如果第一个数比第二个数大&#xff0c;我们就交换他们的位置 //2.每一次比较&#xff0c;都会产生出一个最大&#xff0c;或者最小的数字 //3.下一轮则可以少…...

第1章 计算机网络体系结构-1.1计算机网络概述

1.1.1计算机网络概念 计算机网络是将一个分散的&#xff0c;具有独立功能的计算机系统通过通信设备与路线连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。(计算机网络就是一些互连的&#xff0c;自治的计算机系统的集合) 1.1.2计算机网络的组成 从不同角…...

蓝桥杯:C++排序

排序 排序和排列是算法题目常见的基本算法。几乎每次蓝桥杯软件类大赛都有题目会用到排序或排列。常见的排序算法如下。 第(3)种排序算法不是基于比较的&#xff0c;而是对数值按位划分&#xff0c;按照以空间换取时间的思路来排序。看起来它们的复杂度更好&#xff0c;但实际…...

数据结构-堆

1.容器 容器用于容纳元素集合&#xff0c;并对元素集合进行管理和维护&#xff0e; 传统意义上的管理和维护就是&#xff1a;增&#xff0c;删&#xff0c;改&#xff0c;查&#xff0e; 我们分析每种类型容器时&#xff0c;主要分析其增&#xff0c;删&#xff0c;改&#xff…...

奔跑吧小恐龙(Java)

前言 Google浏览器内含了一个小彩蛋当没有网络连接时&#xff0c;浏览器会弹出一个小恐龙&#xff0c;当我们点击它时游戏就会开始进行&#xff0c;大家也可以玩一下试试&#xff0c;网址&#xff1a;恐龙快跑 - 霸王龙游戏. (ur1.fun) 今天我们也可以用Java来简单的实现一下这…...

Ubuntu 1804 And Above Coredump Settings

查看 coredump 是否开启 # 查询&#xff0c; 0 未开启&#xff0c; unlimited 开启 xiaoUbuntu:/var/core$ ulimit -c 0# 开启 xiaoUbuntu:/var/core$ ulimit -c unlimited查看 coredump 保存路径 默认情况下&#xff0c;Ubuntu 使用 apport 服务处理 coredump 文件&#xff…...

docker 2:安装

docker 2&#xff1a;安装 ‍ ubuntu 安装 docker sudo apt install docker.io‍ 把当前用户放进 docker 用户组&#xff0c;避免每次运行 docker 命都要使用 sudo​ 或者 root​ 权限。 sudo usermod -aG docker $USER​id $USER ​看到用户已加入 docker 组 ​​ ‍ …...

LeetCode Python - 19.删除链表的倒数第N个结点

目录 题目答案运行结果 题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&a…...

Spring Boot 笔记 005 环境搭建

1.1 创建数据库和表&#xff08;略&#xff09; 2.1 创建Maven工程 2.2 补齐resource文件夹和application.yml文件 2.3 porn.xml中引入web,mybatis,mysql等依赖 2.3.1 引入springboot parent 2.3.2 删除junit 依赖--不能删&#xff0c;删了会报错 2.3.3 引入spring web依赖…...

【解决(几乎)任何机器学习问题】:超参数优化篇(超详细)

这篇文章相当长&#xff0c;您可以添加至收藏夹&#xff0c;以便在后续有空时候悠闲地阅读。 有了优秀的模型&#xff0c;就有了优化超参数以获得最佳得分模型的难题。那么&#xff0c;什么是超参数优化呢&#xff1f;假设您的机器学习项⽬有⼀个简单的流程。有⼀个数据集&…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

Mysql故障排插与环境优化

前置知识点 最上层是一些客户端和连接服务&#xff0c;包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念&#xff0c;为通过安全认证接入的客户端提供线程。同样在该层上可…...

【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析

1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器&#xff08;TI&#xff09;推出的一款 汽车级同步降压转换器&#xff08;DC-DC开关稳压器&#xff09;&#xff0c;属于高性能电源管理芯片。核心特性包括&#xff1a; 输入电压范围&#xff1a;2.95V–6V&#xff0c;输…...

英国云服务器上安装宝塔面板(BT Panel)

在英国云服务器上安装宝塔面板&#xff08;BT Panel&#xff09; 是完全可行的&#xff0c;尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎&#xff0c;虽然官方主要面向中国大陆…...

AT模式下的全局锁冲突如何解决?

一、全局锁冲突解决方案 1. 业务层重试机制&#xff08;推荐方案&#xff09; Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减&#xff08;自动加全…...