花指令

本文作者:sodme
本文出处:http://blog.csdn.net/sodme
声明:本文能够不经作者允许随意转载、复制、引用。但不论什么对本文的引用,均须注明本文的作者、出处以及本行声明信息。

可能非常多人都听说过花指令,但限于平时的开发所限,可能较少接触到。日前,跟同事讨论了一些有关花指令的问题,现将自己的体会总结一下。

这篇文章将讨论以下问题:

一、什么是花指令?它的原理是什么?
二、在什么地方使用花指令?怎样使用花指令?
三、怎样识别花指令?怎样去除花指令?
四、一些典型的花指令实例

什么是花指令?当然不是"flower code",呵呵,实际上,把它依照“乱指令”来理解可能更贴切一些,它的真正英文名应该叫"thunkcode"吧(不确定,呵呵)。我们知道,汇编语言事实上就是机器指令的符号化,从某种程度上看,它仅仅是更easy理解一点的机器指令而已。每一条汇编语句,在汇编时,都会依据cpu特定的指令符号表将汇编指令翻译成二进制代码。而日常应用中,我们通过VC的IDE或其他如OD等反汇编、反编译软件也能够将一个二进制程序反汇编成汇编代码。机器的一般格式为:指令+数据。而反汇编的大致过程是:首先会确定指令開始的首地址,然后依据这个指令字推断是哪个汇编语句,然后再将后面的数据反汇编出来。由此,我们能够看到,在这一步的反汇编过程中存在漏洞:如果有人有益将错误的机器指令放在了错误的位置,那反汇编时,就有可能连同后面的数据一起错误地反汇编出来,这样,我们看到的就可能是一个错误的反汇编代码。这就是“花指令”,简而言之,花指令是利用了反汇编时单纯依据机器指令字来决定反汇编结果的漏洞。

先举个样例(记为A代码段):
   jz    label
   jnz  label
   db thunkcode
label:

以上是一个相当简单的花指令块,当中thunkcode是由应用者自己随便写的机器指令字,当然,你写的这个机器指令字不能是单字节指令(比方nop, clr,等),否则,你的花指字就相当于白加了。那么,你要怎样来使用这段代码呢?

如果我们待加密的代码块例如以下(记为B代码段):
   mov ax, 8
   xor ax, 77
   ...

我们如果这B代码段是我们的加密算法所在的代码段,如今我们想要对B代码段进行保护,能够直接将A花指令块加到mov指令之前,形如:
   jz    label
   jnz  label
   db thunkcode
label:
   mov ax, 8
   xor ax, 77
   ...

当中,对于thunkcode,在实际使用时,能够使用不论什么一个多字节指令的机器指令字来取代,这样就会欺骗反汇编软件将它连同后面的mov指令的前边某一部分反汇编成一个多字节指令。这样,我们的目的也就达到了。

由上能够看到,使用了花指令的地方,一般都会出现这样的现象:一个跳转指令,跳转到了某条语句的中间位置,而不是这条语句的開始位置。每当出现这样的情况时,我们就能够断定,这里出现了花指令。

显然地,破解它的办法,就是在那个跳转到的目的地址之前将中间的代码所有nop掉。

当然,为了加强难度,我们能够将若干个花指令结合起来使用。比方:
   jz    label
   jnz  label
   db thunkcode
label:
   jz    label2
   jnz  label2
   db thunkcode
lable2
   mov ax, 8
   xor ax, 77
   ...

也当然,针对这样的情况的破解仅仅要一层层解开它就可以:我们能够先破解到以label为首字节的指令出现为止,然后再依据新的结果,破解到以label2为首字节的指令出现为止,尽管这样麻烦点,但还是不难的。

可是,如果把以下的这段代码再同其他花指令结合起来使用,可能就更复杂了:
   call    label_1 
   db        thunkcode 
   jmp        label_2 
   db        thunkcode
label_1:   
   pop        eax 
   jmp        label_3 
   db        thunkcode,thunkcode,thunkcode
label_3:   
   inc        eax 
   jmp      label_4 
   db        thunkcode,thunkcode,thunkcode
label_4:   
   jmp        eax 
   db        thunkcode
label_2:   
   ....

这里另一段:
   call label_1
   db  thunkcode,thunkcode
   jmp  label_4
label_1: 
   pop  eax
   jmp  label_2
   db  thunkcode,thunkcode
label_2: 
   add  eax,2
   jmp  label_3
   db  thunkcode
label_3: 
   push eax
   ret
   db  thunkcode
label_4: ....
 
为了加强难度,尽可能地用call和push实现间接跳转,当然,矛矛盾盾,仅仅是时间长点而已,世上没有绝对安全的系统。
<以上代码来源于看雪的"软件加密技术内幕"一书>

时间: 2024-10-19 03:39:04

花指令的相关文章

手工脱壳之 PESpin加密壳【SHE链硬件反调试】【IAT重定向】【混淆+花指令】

一.工具及壳介绍 使用工具:Ollydbg,PEID,ImportREC,LoadPE,IDA,Universal Import Fixer,OllySubScript 此篇是加密壳的第二篇,更详细的步骤和思考,请查看第一篇:手工脱壳之 未知加密壳 [IAT加密+混淆+花指令] PESpin壳: 二.脱壳之寻找OEP 1.硬件断点失效 尝试ESP定律,但硬件断点未断下. (原因其实是壳做了反调试,后面部分介绍) 2.采用API断点+单步跟踪 API下断: 壳导入了LoadLibrary 和 Ge

自动脱加密壳(导入表hash 花指令)

这里是跟着上一篇1.加密一定要自己申请空间 那就在申请空间那下 api 断点 单步退出函数就看了返回值给 eax 记下它返回时的地址 这里是 0x0047a37f1.也一定会获取真正的 api 那就跟到获取地址那 记下它的地址 0x001614dc由于地址会变 就记下相对地址同时是记它的下一条 所以偏移为 14E02.它一定会填充 IAT 那就跟到那 一样是下一条指令地址的偏移 所以为 0897运行截图 VAR vOldOEP VAR vAllocAddr VAR vWriteIATAddr V

VC加花指令

void flower_code() { __asm { jz label; jnz label; //相当于汇编中的db __emit 0e8h; label: mov ax, 8; xor ax, 7; } } 汇编显示如下: 实际的汇编代码:

黑客入门初识

学习黑客知识前,首先要了解黑客常见的术语与命令,当然,进程.端口.IP地址等基础知识也是很必要的. 什么是黑客? 有些人习惯性认为黑客是电脑的侵入者,而且很多时候代表的是一个贬义的名词,其实黑客指代的是拥有熟练电脑技术的人,并无明显的褒义贬义之分,其中,在黑客的领域里,有一类黑客叫白帽黑客,这类人是有能力破坏电脑安全但是不具有恶意目的的黑客,他们一般有着清楚的道德规范,并常常试图同企业合作去改善被发现的安全弱点.对应的还有黑帽黑客/黑帽怪和灰帽黑客. 黑客:源自于英文hacker,是对水平高超的

文字版免杀教程

1.基础的汇编语言 2.修改工具(不指那些傻瓜式软件).如: OllyDbg . PEditor. C32ASM . MYCCL复合特征码定位器.UE .OC. 资源编辑器等.还有一些查壳 脱壳软件(如:PEID RL脱壳机等) . 以下是常用的几种免杀方法及工具: 一.要使一个木马免杀 首先要准备一个不加壳的木马,这点非常重要,否则 免杀操作就不能进行下去. 然后我们要木马的内存免杀,从上面分析可以看出,目前的内存查杀,只有瑞星最强,其它杀毒软件内存查杀现在还不起作用所以我们只针对瑞星的内存查

20169217 2016-2017-2 《网络攻防实践》免杀技术学习总结

1.基础问题回答 (1)杀软是如何检测出恶意代码的? 恶意代码与其检测是一个猫捉老鼠的游戏,单从检测的角度来说.反恶意代码的脚步总是落后于恶意代码的发展,是被动的.目前基于主机的恶意代码检测方法主要有反恶意代码软件.完整性校验法以及手动检测,基于网络的检测方法主要有基于神经网络".基于模糊识别"等方法,本文主要讨论基于主机的检测.  恶意代码分析方法  静态分析方法 是指在不执行二进制程序的条件下进行分析,如反汇编分析,源代码分析,二进制统计分析,反编译等,属于逆向工程分析方法. (1

那些年我们一起追逐过的安全工具

前言 每一段岁月,都会留下属于时代的记忆——那些年,我们所追逐与热衷的安全工具,亦是如此. 在那个信息不对称的年代,安全工具主要是在小圈子内传播.当年天真的我们(脚本小子),以为网络就是江湖,一套完美的工具就是你的兵器——路见不平一声吼,碰到注入亮阿D. 注:由于年代久远,当年的工具大多已停止更新,如今网上所能搜到的又可能携带后门,所以本文中就不提供下载地址了 阿D注入工具 简介 第一个介绍的肯定是阿D注入工具.那个时候大家都不大会用SQLMAP,或者根本没听说过.当时对SQL注入检测工具最出名

反编译Android APK及防止APK程序被反编译

原文出处 反编译Android APK及防止APK程序被反编译 怎么逆向工程对Android Apk 进行反编译 google Android开发是开源的,开发过程中有些时候会遇到一些功能,自己不知道该怎么做,然而别的软件里面已经有了,这个时候可以采用反编译的方式,解开其他的程序,来了解一些它 的做法,同时啊,还可以借鉴别人的软件结构,资源文件:作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用的APK进行反编译查看.此方式主要目的是为了促进开发者学习,借鉴好的代

Android APK加固技术方案调研

@author ASCE1885的 Github 简书 微博 CSDN 最近项目中需要实现自己的APK加固方案,因此就有了这一篇调研报告. 软件安全领域的攻防向来是道高一尺魔高一丈,攻防双方都处于不断的演变和进化过程中,因此软件加固技术需要长期持续的研究与投入. 目前成熟的第三方解决方案 1. 娜迦 针对Android平台下的APP被逆向分析,破解,植入木马病毒后,用户敏感信息泄露或者被钓鱼网站劫持,NAGA Android保护采用防止静态分析与防止动态调试全面防护的思路,在未保护程序运行的不同