解密花指令

全文参考了一个大师傅的blog:https://blog.csdn.net/zhangmiaoping23/article/details/38400393

介绍

花指令是对抗反汇编的有效手段之一,正常代码添加了花指令之后,可以破坏静态反汇编的过程,使反汇编的结果出现错误。错误的反汇编结果会造成破解者的分析工作大量增加,进而使之不能理解程序的结构和算法,也就很难破解程序,从而达到病毒或软件保护的目的。

实例分析

#include <iostream>
int main()
{
__asm
{
xor eax,eax
test eax,eax
je Label1
_emit 0e8h
Label1:
} std::cout << "Test Junk Code" << std::endl;
system("pause");
}
  • 将上面的代码编译,然后拖入ida进行分析



    你会发现这个跳转的数据有些奇怪,和代码段的地址差别有点大,而且无法进行反汇编

  • 查看OD分析

也就是说实际程序运转时,会直接跳到0x00407360处,但由于IDA是静态分析。在反汇编时,是通过指令符识别并进行反汇编的,所以在碰到E8时,会把后面当作操作数,以至于最后反汇编有误。

这也说明了静态分析的缺点

花指令的类型

  • 可执行式花指令

    顾名思义,可执行式花指令指的是能够正常运行的但又不改变原始程序逻辑性的一组无用指令。这类花指令有如下特点:①可以正常运行;②不改变任何寄存器的值;③反汇编器可以正确反汇编该指令。

    例如这样几组花指令就属于该类别:PUSHEAX&POPEAX;NOP:INCEAX&DECEAX等等。这种类别的花指令组合形式很多,常常用在病毒代码的变形引擎中,病毒在传播时通过变形引擎随机产生一组该类别花指令并插入到病毒正常代码中,可以改变病毒的特征码,从而起到变形的作用。

  • 不可执行式花指令(垃圾指令)

    本文主要就是讲这个方面,是指被插入到原始代码中但又不改变原始程序逻辑性的一组无用字节。这类花指令有如下特点:①不可以正常运行;②不改变任何寄存器的值;③反汇编器可能会错误反汇编这些字节。

    根据反汇编的工作原理,只有当花指令同正常指令的开始几个字节被反汇编器识别成一条指令时,才能有效破坏反汇编的结果。因此,插入的花指令应当是一些不完整的指令,被插入的不完整指令可以是随机选择的。正因为不可执行花指令有这些特点,该类花指令才能应用到软件保护中。

    Cullen等人指出为了能够有效“迷惑"静态反汇编工具,同时保证代码的正确运行,花指令必须满足两个基本特征,即:

    1)垃圾数据必须是某个合法指令的一部分:

    2)程序运行时,花指令必须位于实际不可执行的代码路径。

可执行和不可执行是相对于插入的花指令而言,而非整个程序是可执行或不可执行

不可执行花指令的成功来自反汇编算法的缺陷

当前静态分析中采用的反汇编算法主要可以分为2类:线性扫描算法与行进递归算法。

[3.1]线性扫描反汇编算法

线性扫描算法就是直接将所有的二进制,从头开始进行反汇编,而不作任何判段

[3.2]行进递归反拒绾算法

相比线性扫描算法,行进递归算法通过程序的控制流来确定反汇编的下一条指令,遇到非控制转移指令时顺序进行反汇编,而遇到控制转移指令时则从转移地址处开始进行反汇编。行进递归算法的缺点在于准确确定间接转移目的地址的难度较大。

Thinking

花指令本就属于代码混淆技术的一种,所以它的核心无非就是在保证程序正常运行的情况下,对指令进行修改。例如最简单的无效指令,上面的利用线性扫描反汇编技术的老实,来造成反编译失败的。还有比较花的就是jz,jnz到同一地址,什么蕴含式,设计、利用代码执行的某种必然结果,完成混淆视听的目的。但混淆始终只是疲敌之术。

【Reverse】初遇花指令的更多相关文章

  1. 木马防杀 花指令 OllyDbg

    打开木马 入口地址 添加花指令 全0的地方,可以插入花指令 保存为可执行文件 随便选择几行,右击 保存文件

  2. VUE 学习笔记 一 指令

    1.声明式渲染 v-bind 特性被称为指令.指令带有前缀 v-,以表示它们是 Vue 提供的特殊特性 <div id='app'> <span v-bind:title=" ...

  3. [BUUCTF]REVERSE——[HDCTF2019]Maze

    [HDCTF2019]Maze 附件 步骤: 例行检查,32位程序,upx壳 upx脱壳儿后扔进32位ida,首先检索程序里的字符串 有类似迷宫的字符串,下面也有有关flag的提示字符串,但是没法进行 ...

  4. 【VNCTF2022】Reverse wp

    babymaze 反编译源码 pyc文件,uncompy6撸不出来,看字节码 import marshal, dis fp = open(r"BabyMaze.pyc", 'rb' ...

  5. 【wp】HWS计划2021硬件安全冬令营线上选拔赛

    逆向手在夹缝中艰难求生系列. 这篇真的存粹是做题笔记了,对内核驱动啥的不太懂,pwn也不会,能做出来的题都是硬逆出来的( childre最后死活没整出来,后来看大佬的wp才知道对子进程有修改(.)呜呜 ...

  6. 【wp】2021MAR-DASCTF_逆向

    昨天打完的MAR DASCTF,来复个盘~ 不过就re做了3/4然后有事提前开溜了hhh,拿了drinkSomeTea和replace的三血心满意足(蜜汁三血执念. 感觉这回的出题人好喜欢TEA啊(正 ...

  7. virut详细分析

    Virut分析 0x00.综合描述 virut样本的执行过程大体可以分为六步:第一步,解密数据代码,并调用解密后的代码:第二步,通过互斥体判断系统环境,解密病毒代码并执行:第三步,创建内存映射文件,执 ...

  8. Android安全开发之浅谈密钥硬编码

    Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...

  9. 只需三步--轻松反编译Android Apk文件

    安卓程序是通过java语言进行编写的,可以很容易进行反编译.很多apk文件被反编译后再二次打包,就成了自己的产品,很是流氓.下面我们来看看如何进行apk的反编译,以及常用的防反编译手段. 一.反编译A ...

随机推荐

  1. 关于iview、element-ui重置表单并清除校验的方法

    平时在使用iview或者vue重置表单是时,我会习惯使用 this.$refs[formData].resetFields(); 但是直接这样写上去方法是不起作用的, 内容必须要在每个form-ite ...

  2. Redis安装、配置和卸载

    1.安装 mkdir /usr/local/redis 添加目录 wget [http://download.redis.io/releases/redis-4.0.1](http://downloa ...

  3. char* 和 char[] 的区别

    一.代码 有关下面代码,p和q的区别是什么: int main(int argc, char *argv[]) { char* p = "Hello World"; char q[ ...

  4. js 鼠标和键盘事件

    js 鼠标和键盘事件 鼠标事件 聚焦事件 离焦事件 鼠标单击和双击 鼠标的其他事件 鼠标事件对象 键盘事件 鼠标事件 聚焦事件 <input type="text" id=& ...

  5. python与C结构体之间二进制数据转换

    python与C结构体之间数据转换 前言 在实际应用中,可能会遇到直接和C进行二进制字节流协议通信,这时要把数据解包成python数据,如果可能,最好与C定义的结构体完全对应上. python中有2种 ...

  6. mysql: 看不见的空符号 char(9) char(10) char(13)

    在统计年度销售额时,总觉得哪里不对劲.于是找了找,对了对,试了trim,消除前后的空格,也没反应. 在崩溃的边缘,终于发现了错的原因. 原来我在录入的时候,粘贴多了其他空白符号,看不见,摸不着,啊~ ...

  7. Spring的轻量级实现

    作者: Grey 原文地址:Spring的轻量级实现 本文是参考公众号:码农翻身 的从零开始造Spring 教程的学习笔记 源码 github 开发方法 使用TDD的开发方法,TDD的开发流程是: 写 ...

  8. 在linux 环境下 安装php

    最近打算学写一个php 脚本~ 到了虚拟机环境上发现~没有环境. 只有老老实实去装一个php环境咯. 第一步 去官网下一个包 记得一定要下载tgz格式的 第二步~当然是传上虚拟机上咯~任意目录都可以. ...

  9. HTTP1.1 Keep-Alive到底算不算长连接?

    在基础架构部沉浸了半年,有一些认知刷新想和童靴们交代一下, 不一定全面,仅代表此时的认知, 也欢迎筒靴们提出看法. 本文聊一聊口嗨用语:"长连接.短连接", 文章会按照下面的思维导 ...

  10. [cf878D]Magic Breeding

    对于每一行,用一个2^12个01来表示,其中这一行就是其中所有为1的点所代表的行(i二进制中包含的行)的max的min,然后就可以支持取max和min了,查询只需要枚举答案即可 1 #include& ...