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

reserve学习笔记(花指令)

这是闲来无事逛博客时看到的一篇相关文章,觉得挺有意思。

定义

首先花指令其实就是没有用的指令(垃圾指令),它穿插在真正的代码中,会导致反编译时出现问题,从而会影响我们的静态分析

分类以及讲解 

花指令分为两种,其中一种为可执行花指令,另一种为不可执行花指令。

可执行花指令:顾名思义,就是该指令可以执行,但是执行后的结果是没有意义的,不会对寄存器的值产生任何影响,它仅仅是为了增加逆向工程师的工作量。

不可执行花指令:在可执行的代码中插入看似正常的代码,然而这些代码是永远不会被执行的,他会干扰反编译器的运行

垃圾数据必须是某个合法指令的一部分,简单来说,花指令不能是完全随机的乱码,而是要看起来像是正常的指令片段。这是因为反编译器和反汇编器在分析代码时,会按照指令的格式去解析字节。如果花指令是随机的乱码,它们很容易就能识别出来并忽略掉。但如果花指令看起来像是合法指令的一部分,反编译器就会被误导,尝试去解析这些无意义的代码,从而出错。

程序运行时,花指令必须位于实际不可执行的代码路径,这意味着花指令插入的位置很重要。它必须是在程序正常运行时永远不会被执行的代码路径上。换句话说,这些花指令虽然存在,但在程序真正运行时,它们不会被CPU执行,不会影响程序的正常功能。

原理

1. 反汇编算法的两种类型
(1)线性扫描算法
想象你有一本书,书里全是用机器语言写的代码。线性扫描算法就像是从书的第一页开始,逐字逐句地读下去,把每个字节都当作指令来解析。
工作原理:从程序的入口点(也就是程序开始的地方)开始,一条指令一条指令地反汇编,就像按顺序读书一样。
问题:在计算机的世界里,代码和数据是混在一起的(这就是冯·诺依曼体系结构的特点)。线性扫描算法不会区分哪些是代码,哪些是数据,所以它可能会把数据误当作指令来解析。这就像是把书里的标点符号也当作句子来读,结果就会乱七八糟,得到错误的反汇编结果。
(2)递归下降算法
递归下降算法则更聪明一些。它不仅会按顺序读代码,还会关注代码的逻辑结构,也就是“控制流”。控制流可以理解为程序运行时的路径,比如程序可能会根据条件跳到不同的地方执行。
工作原理:它从程序的入口点开始,遇到正常的指令就按顺序反汇编。但如果遇到“跳转”指令(比如“如果条件满足,跳到第10行执行”),它就会跳到那个位置,从那里开始继续反汇编。这样可以更好地理解程序的逻辑结构。
问题:递归下降算法依赖于程序的控制流,但如果有人故意在代码中插入一些虚假的控制流(比如构造一些看起来像是跳转指令,但实际上不会被执行的指令),它就会被误导,从而反汇编出错。
2. 花指令如何利用这些缺陷
(1)针对线性扫描算法
花指令可以插入一些看似是指令,但实际上不是指令的数据。因为线性扫描算法不会区分代码和数据,所以它会把这些花指令当作正常的指令来解析,结果就会出错。这就像是在书里故意插入一些乱码,让按顺序读的人看不懂。
(2)针对递归下降算法
花指令可以构造一些虚假的控制流。比如插入一些永远不会被执行的跳转指令,或者构造一些看起来像是条件分支但实际上没有意义的代码。递归下降算法会试图解析这些虚假的控制流,从而被误导,最终得到错误的反汇编结果。

关于一些简单的花指令的构造,我还没太搞清楚,下一篇博客再讲解吧

http://www.xdnf.cn/news/528571.html

相关文章:

  • 用Python构建学生成绩管理系统的基本方案
  • 系统架构设计师考前冲刺笔记-第3章-软件架构设计
  • 《JVM如何判断一个对象可以被回收?图文详解GC Root算法》
  • Windows 下 Qt 项目配置 FFmpeg 简明指南
  • 使用docker——10分钟内 完成一个高可用的 MongoDB 副本集部署
  • 代理IP高可用性与稳定性方案:负载均衡、节点健康监测与智能切换策略
  • python链接数据库
  • 线程调度与单例模式:wait、notify与懒汉模式解析
  • Excel
  • Vue 中 v-model 的三种使用方式对比与实践
  • B/S架构和C/S架构的介绍与分析
  • UE 材质几个输出向量节点
  • 嵌入式51单片机:C51
  • Qt—模态与非模态对话框
  • 板凳-------Mysql cookbook学习 (四)
  • 分布式天线系统 (DAS, Distributed Antenna System)
  • 机器学习第十六讲:K-means → 自动把超市顾客分成不同消费群体
  • 三维云展展示效果升级​
  • 5个开源MCP服务器:扩展AI助手能力,高效处理日常工作
  • 【11408学习记录】考研英语辞职信写作三步法:真题精讲+妙句活用+范文模板
  • 在linux平台下利用mingw64编译windows程序
  • UE5在Blueprint中判断不同平台
  • [架构之美]从PDMan一键生成数据库设计文档:Word导出全流程详解(二十)
  • C语言之 比特(bit)、字节(Byte)、字(Word)、整数(Int)
  • ABAP实战案例--获取当前数据由哪个用户锁住
  • 微前端记录
  • MFC 编程中 OnInitDialog 函数
  • YOLOV3 深度解析:目标检测的高效利器
  • vue3与springboot交互-前后分离【验证element-ui输入的内容】
  • w~自动驾驶~合集3