利用花指令防止程序被反汇编
(完整word版)2016信息安全概论考查试题

湖南科技大学2016 - 2017 学年信息安全概论考试试题一、名词解释(15分,每个3分)信息隐藏:也称数据隐藏,信息伪装。
主要研究如何将某一机密信息隐藏于另一公开信息的载体中,然后会通过公开载体的信息传输来传递机密信息。
宏病毒:使用宏语言编写的一种脚本病毒程序,可以在一些数据处理系统中运行,存在于字处理文档、数据表格、数据库和演示文档等数据文件中,利用宏语言的功能将自己复制并繁殖到其他数据文档里。
入侵检测:通过收集和分析网络行为、安全日志、审计数据、其它网络上可以获得的信息以及计算机系统中若干关键点的信息,检查网络或系统中是否存在违反安全策略的行为和被攻击的迹象。
作为一种积极主动地安全防护技术,提供了对内部攻击、外部攻击和误操作的实时保护,在网络系统受到危害之前拦截和响应入侵。
是防火墙之后的第二道安全闸门,在不影响网络性能的情况下能对网络进行监测。
花指令:是指利用反汇编时单纯根据机器指令字来决定反汇编结果的漏洞,在不影响程序正确性的前提下,添加的一些干扰反汇编和设置陷阱的代码指令,对程序代码做变形处理。
缓冲区溢出攻击:指程序运行过程中放入缓冲区的数据过多时,会产生缓冲区溢出。
黑客如成功利用缓冲溢出漏洞,可以获得对远程计算机的控制,以本地系统权限执行任意危害性指令。
二、判断题(对的打√,错的打×,每题1分,共10分)1. 基于账户名/口令认证是最常用的最常用的认证方式(√)2. 当用户收到了一封可疑的电子邮件,要求用户提供银行账户及密码,这属于钓鱼攻击(√)3. RSA算法的安全性归结于离散对数问题(×)4. 量子不可克隆定理、不确定性原理,构成了量子密码的安全性理论基础(√)5. 访问控制的安全策略是指在某个安全区域内用语所有与安全相关活动的一套控制规则(√)6. 反弹连接是木马规避防火墙的技术,适合动态IP入侵(×)7. 驱动程序只能在核心态下运行(×)8. 混沌系统生成的混沌序列具有周期性和伪随机性的特征(×)9. 最小特权思想是指系统不应给用户超过执行任务所需特权以外的特权(√)10. 冲击波蠕虫病毒采用UPX压缩技术,利用RPC漏洞进行快速传播(√)三、选择题(30分,每题2分)(1) 按照密钥类型,加密算法可以分为(D )。
矛与盾的较量(1)——花指令

下面我们来做第三个实验,把源程序改成:
;***************************************************************
;花指令实验3
;作者:罗聪
;日期:2002-8-21
;***************************************************************
所以我们要讨论如何给自己的程序加密。这次就先说说最简单的花指令。
在解释这个“花指令”之前,不妨先做几个小小的实验。
我们先来写一个程序,命名为hua.asm,内容如下:
;***************************************************************
.code
main:
jz Do_It ;注意这里和第一个实验中的源程序的区别
jnz Do_It ;注意这里和第一个实验中的源程序的区别
db 0E8h ;注意这里和第二个实验中的源程序的区别
Do_It:
invoke MessageBox, NULL, addr szText, addr szCaption, MB_OK
* Possible StringData Ref from Data Obj ->"花指令演示 by LC 2002-8-21"
|
:00401006 681F304000 push 0040301F
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
易语言软件加密技术

注:本文章是从网上转摘过来的,虽是拿易语言举例,但也适用所有的语言,包括按键脚本,关键是学习思路。
本文为全中文编写,不需要有PE文件格式知识,不需要掌握汇编或C语言的编程技巧,一些加密算法直接由易语言提供,特殊的加密算法大家可以翻译C语言代码、汇编代码或VB 代码。
本文中将“Cracker”一词翻译为“奸人”,意为“奸邪小人”之义。
本人对破解者一向深恶痛绝,有人说中国的软件发展中破解者有一份功劳,可我说这话不对,看看因盗版而产生的微软对操作系统及软件业的垄断,国软件业在盗版的夹缝中生存……,如此下去,软件作者没有收益,将不再会有优秀的软件推出。
防止盗版,匹夫有责,我想通过本书的推出可以加强易语言用户的加密能力,将盗版杀死在大家共同的手中。
随着采用易语言编制程序的人们越来越多,写一个软件易被奸人破解的情况也越来越多了,有个别用户甚至于怀疑易语言是否有安全性。
从技术性上来说,我只能说加密技术与编程语言无关,一个编程语言的安全性一般指所生成的机器码是否稳定、可靠,而不是防破解方面,如果想要很好地防止破解,那么掌握一门加密技术是非常必要的。
本书考虑到使用易语言的用户大部分对PE文件结构不太熟悉,因此没有采用很底层的方法去教学,而是采用与易语言直接表达的方式试图说明如何加密。
本书基本上是按以下的顺序进行讲解的:破解技术反破解技术1 反破解技术2 反破解技术3防改文件文件名验证 LOGO图片验证窗口标题验证防改文件大小暴破加壳后数据签名验证加壳后CRC验证文件大小验证防调试花指令反调试模块反调试支持库存注册机不进行判断,用循环代替字符串打乱器及时清存算法注册机 RSA算法数值计算支持库其他多处验证点随机验证命名刻意隐蔽本书是集体创作作品,并集成了多位作者的公开著述,在此一并表示感。
其中部分文字容根据易语言的特性作了修正。
文中不署这些作者的,以防止奸人对他们的软件的刻意破解。
本章整理:麻辣教师目录《易语言软件加密技术》 1一.易语言程序加密的目的 51.保持软件的完整性 52、保护软件开发者的权益 5二.易语言程序加密的原则 51.加密前要考虑周到且严密 52.需要加密的容要制定一个计划 63.加密时制作好文档,以备以后的修改 6 4.发布前问一下是否可以正式发布软件了 6 三.防止程序容被更改 71.防止软件名称被更改 72.防止窗口标题被更改 73.防止LOGO图片被更改 8四.防止存注册机 81.不要使用简单判断 92.采用MD5对比 93.多注册码拷贝 9五.防止文件被暴破 101.常用加壳软件介绍 102.加壳后文件大小验证 143.加壳后数据签名验证 144.加壳后CRC验证 15六.防调试方法 161.易语言的花指令 162.反调试模块的使用 173.反调试支持库的使用 174.通过检查父进程得知是否被调试了 18 5.使用多线程 19七.注册机制 191.简单注册原理 192.RSA算法注册 203.数值计算支持库 27八.给奸人一些教训 271.给破解者的教训 272.给破解版使用者的教训 303.行为不要过火 30九.网络验证法 301.实现的原理 302.存在的几个问题 31十.加密狗加密 311.加密狗的选用 322.加密狗加壳法 333.加密狗写存储器法 33十一.加密算法策略(暗桩) 341.易数据库密码怎么泻露了 342.利用吴氏加密算法 373.海岛挖宝 384.随机验证 395.不同权限验证 406.忽悠型的GHOFFICE过滤词语验证代码 41 7.伪验证技术 438.定时验证、延时验证、客户数据集累验证 449.验证与专业知识相结合技术 4410.伪装,用易语言写自有支持库 4411.绝妙的暗桩设置 4512.发布不完整版本 4513.程序、数据结合加密技术 4514.自定义算法 4615.加密框图 46附录1加密已形成密码学 48附录2《如何用简单方法防止破解》 49附录3代码与数据结合技术 50(正文)一.易语言程序加密的目的在此有必要说明一下为何要为自己的程序进行加密,初步认为有以下两点:1.保持软件的完整性这里包括了文件名不被更改,文件信息不被更改,文件尺寸不被更改。
花指令原理 -回复

花指令原理-回复花指令原理是今天计算机科学领域中的一个热门话题。
它涉及到计算机指令的执行过程以及与之相关的概念。
在本文中,我们将详细讨论花指令的原理,并解释其在计算机体系结构中的作用。
首先,让我们先了解一下计算机指令的概念。
计算机指令是计算机内部用于执行特定任务的基本命令。
它们由二进制代码表示,由计算机处理器识别和执行。
计算机指令可以包括算术运算、逻辑运算、存取内存等操作。
花指令则是一种特殊的指令,它的存在可以为其他指令提供有用的附加功能。
花指令的原理可以简单地解释为在计算机执行指令的过程中,将某些指令的执行与其他指令的执行相结合,以提高计算机系统的性能。
花指令可以通过减少总执行时间、提高指令并行性或减少指令冲突来实现这一目的。
指令并行性是花指令原理的一个重要概念。
它涉及到多个指令同时执行的能力。
在传统的计算机体系结构中,指令是按顺序执行的,即一条指令执行完毕后才能执行下一条指令。
这种顺序执行的模式有时会导致计算机的性能瓶颈。
花指令原理通过将多条指令的执行重叠在一起,从而提高计算机系统的效率。
为了实现指令并行性,计算机体系结构通常会采用流水线处理技术。
流水线是一种将指令的执行过程划分为多个阶段的技术。
每个阶段都专门处理指令的某个部分,使得多个指令可以同时在不同的阶段进行处理。
通过这种方式,计算机可以同时执行多个指令,从而提高整体的执行速度。
然而,指令并行性也会面临一些挑战,例如指令间的依赖关系和数据冒险。
指令依赖发生在一个指令需要在另一个指令执行完成后才能执行的情况下。
数据冒险则发生在一个指令需要访问另一个指令还未完成的数据时。
这些问题都可能导致指令的执行顺序被打乱,从而降低整体性能。
花指令原理通过插入一些无效或者冗余的指令来解决指令并行性面临的问题。
这些花指令在计算的角度上没有实际意义,但它们可以用来填充指令流水线中的空闲周期,以保证指令的连续执行。
这样一来,指令间的依赖关系和数据冒险问题就可以得到解决。
花指令(精)

花指令的概念与认识花指令 1、什么是花指令什么是花指令?实际上,把它按照“乱指令”来理解可能更贴切一些,我们知道,汇编语言其实就是机器指令的符号化,从某种程度上看,它只是更容易理解一点的机器指令而已。
每一条汇编语句,在汇编时,都会根据cpu特定的指令符号表将汇编指令翻译成二进制代码。
而日常应用中,我们通过VC的IDE或其它如OD等反汇编、反编译软件也可以将一个二进制程序反汇编成汇编代码。
机器的一般格式为:指令+数据。
而反汇编的大致过程是:首先会确定指令开始的首地址,然后根据这个指令字判断是哪个汇编语句,然后再将后面的数据反汇编出来。
由此,我们可以看到,在这一步的反汇编过程中存在漏洞:如果有人故意将错误的机器指令放在了错误的位置,那反汇编时,就有可能连同后面的数据一起错误地反汇编出来,这样,我们看到的就可能是一个错误的反汇编代码。
这就是“花指令”,简而言之,花指令是利用了反汇编时单纯根据机器指令字来决定反汇编结果的漏洞。
2、花指令与免杀的关系加花就是,在程序汇编中,加了一些无用的废话,用来扰乱杀软对特征码的扫描对比,来达到免杀的目的。
是一种逃避方式,主要用于表面免杀。
加花指令的确没有改变特征码的位置,但是他改变了程序执行顺序,有的也能改变文件结构。
使杀毒软件扫描的时候跳到花指令处,即判断没有病毒。
通常情况下,在文件免杀的时候,加花指令是最简单、有效的方法,而且一般能通杀很多杀毒软件,所以一般文件免杀通用此法,前提是你的花指令不是常用的,最好能自己做出你个人的花指令,才会很有效。
3.花指令执行顺序花指令一般添加到程序的头部。
执行顺序:花指令入口-->执行花指令-->程序原入口-->执行原程序花指令的好坏直接决定程序是否可以躲避杀毒软件的查杀,花指令和壳的本质差不多,都是为了保护程序而做,所以我们做免杀的时候,可以多结合壳和花指令各自的优点对程序进行处理,达到更好的免杀效果。
大概步骤总结: 第一步:从编写手册中成对的提取几对第二步:打乱它们之间的顺序,也可不打乱第三步:中间插入几个nop或jmp,也可不插入第四步:最后添加跳转到入口地址指令第五步:把编写好的花指令添加到程序中后,测试是否可以正常运行,然后再用杀毒软件查杀 3、花指令的样本 PUSH EBP MOV EBP,ESP DEC EBP INC EBP ADD ECX,1 SUB ECX,-1 MOV EAX,DWORDPTR FS:[0] PUSH EAX MOV DWORD PTR FS:[0],ESP POP EAX MOV DWORD PTR FS:[0],EAX MOV CL,1 PUSH EAX SUB AL,90 POP EAX ADD ESP,-0C ADD ESP,0C PUSH EAX JNO 原始入口 ________________ push ebp mov ebp ,esp //常见的入口代码 add esp ,68 //以下的指令都是对称的(成对的) sub esp ,68 inc ecx dec ecx push edi pop edi push eax pop eax push edi pop edi inc ecx dec ecx nop jz 跳回入口点 //跳到程序的入口,执行原程序 jnz 跳回入口点 ____________ push ebp mov ebp, esp push eax push eax nop pop eax pop aex sub eax, 1 inc eax, 1 push 入口地址 retn。
C语言中的安全性代码防篡改与反编译保护

C语言中的安全性代码防篡改与反编译保护C语言作为一种广泛应用的编程语言,拥有强大的功能和灵活性。
然而,C语言编写的代码很容易受到恶意篡改和反编译的攻击。
为了保护代码的安全性,开发人员需要采取一些措施来防止代码的篡改和反编译。
本文将介绍C语言中常用的安全性代码防篡改与反编译保护方法。
一、常见的安全性代码防篡改方法1. 常量加密常量加密是一种常见的防止代码被篡改的方法。
在使用常量的地方,可以将常量进行加密处理,使得攻击者无法直接读取和修改常量的值。
常量加密可以通过对常量进行异或运算或者加密算法等方式来实现。
在程序运行时,需要对加密的常量进行解密,然后使用解密后的常量进行计算和操作。
2. 代码混淆代码混淆是一种将代码转换成难以理解和分析的形式的方法。
通过对代码进行重写,删除无用代码,添加冗余代码等操作,可以使代码的结构和逻辑变得复杂。
代码混淆可以增加攻击者对代码的理解和分析难度,从而提高代码的安全性。
常见的代码混淆技术包括函数内联、循环展开、代码重组等。
3. 授权验证授权验证是一种通过验证机制来保护代码安全的方法。
在代码中添加授权验证模块,用来验证代码的合法性和授权信息。
通过对授权信息进行加密处理,可以防止攻击者对授权信息的篡改和伪造。
授权验证可以通过校验码、数字签名等方式来实现,有效防止未授权的使用和修改。
二、反编译保护方法1. 逆向难度提升逆向难度提升是一种增加反编译难度的方法。
通过在代码中使用一些反调试、反跟踪和混淆技术,可以增加攻击者对代码的分析和理解难度,从而提高反编译的难度。
常见的逆向难度提升技术包括函数内联、指令替换、代码流程混淆等。
2. 加密保护加密保护是一种将代码和数据进行加密处理的方法。
通过对代码和数据进行加密,可以有效防止攻击者对代码的分析和修改。
在程序运行时,需要对加密的代码和数据进行解密,然后再进行执行和操作。
常见的加密保护技术包括代码加密、数据加密、混淆等。
3. 指令混淆指令混淆是一种将指令顺序、结构和操作进行重排和混淆的方法。
python爬虫之破解javascript-obfuscator的混淆加密
python爬⾍之破解javascript-obfuscator的混淆加密接上⼀篇有关前端加密达到反爬的⽂章,是不是觉得⽤了javascript-obfuscator 就很安全了,那还真不⼀定啊,还是那句,反爬与反反爬⼀直在⽃争,没有谁能绝对的压制另⼀⽅,只有使⽤者技术的⾼低。
以下就是⼀个⼤神的针对javascript-obfuscator库的破解。
本篇⽂章转载于 :死代码与花指令在开始之前,我们先了解⼀下这种「在代码中插⼊⼤量⽆⽤代码以混淆视听」的混淆⽅式吧。
这种混淆⽅式有两种叫法,或者说是两种做法,它们分别是「死代码」和「花指令」。
> 死代码死代码⼀开始是被⽤来描述⼀些⼈写代码时写出的没有⽤到的代码的,为了编译后的⽂件尽可能地⼩,编译器通常会对死代码进⾏移除处理。
⽽在不知道什么时候开始,死代码被安全⼯作者们⽤来作为⼀种混淆机制,以将代码量变得极为庞⼤,使进⾏逆向⼯程的⼈难以找到主要逻辑。
但死代码有个很明显的特征:它虽然看着代码量很⼤,但实际却完全不会在程序的正常代码中被调⽤。
如果你有兴趣的话,可以对⼀些包含了死代码的代码进⾏聚类分析,你会发现死代码和正常代码之间泾渭分明,正常代码都是互相关联着的,⽽死代码却是孤零零的⼀块或者多块,并且正常代码还完全不会与死代码产⽣关联。
> 花指令花指令是以前被⼤量运⽤在⽊马、病毒的免杀上的⼀种反反汇编⼿段,花指令中的“指令”通常指的是汇编中的 jmp、call 之类的调⽤、跳转指令,⽽攻击者们会将这些指令巧妙地插⼊到恶意代码的执⾏逻辑中,使得静态分析⼯具在分析到这个位置时⽆法正常反汇编。
花指令曾经的⽬的主要有两个,⼀个是使杀毒软件⽆法⾃动分析出恶意代码,达到瞒天过海的效果;⼀个是给安全⼯作者在分析恶意软件时设下层层阻拦,使安全⼯作者需要花费更多的时间才能理清代码逻辑,达到拖延时间的效果。
同样是不知道什么时候开始,花指令也被安全⼯作者们⽤来作为⼀种混淆机制。
花指令
JZ--------等于转移(Jump if Zero)
JNZ-------不等于时转移(Jump if Not Zero)
JB--------小于转移(Jump if Below)
JNB-------大于或等于转移(Jump if Not Below)
nop -------可任意在中间添加
与它等效的:
mov EDI,EDI
add esp,1 -------其中数字可以任意,注意以下面对应
add esp,-1
add esp,1 -------其中数字可以任意,注意以下面对应
sub esp,1
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
跳转
somewhere:
nop /"胡乱"跳转的开始...
jmp 下一个jmp的地址 /在附近随意跳
jmp ... /...
POPAD-----把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
3.算术运算指令:
ADD-------加法.
SUB-------减法.
INC-------加 1
DEC-------减 1
MUL-------无符号乘法
DIV-------无符号除法
4.加区加花
首先通过加区段工具给无壳的服务端加一个区段。区段名子随便填写,比如hacker,大小一般填写在50-200 就好了。然后我们用LORDPE打开首先记下入口点。然后选择区段记下新添加的HACKER区段的入口点。因为我们要写花指令,所以我们在入口点设置为HACKER区段的比入口点稍微大点的地址。然后我们在写花指令。通常找不到零区域的时候就可以加区段。
预防反汇编破解的“隐藏代码”法
24 定 义 正 确 的 密 码 .
用 整 型 常 蛩 p s od存 储 正 确 密 码 ,例 如 2 : as r w 3
c n t itp s w o d = 2 ; o s n a s r 3
堆内存 中的 “ 隐藏代码 ”
25 抄 取 “ 藏 代 码 ” 的 机 器 码 . 隐
图 1
“ 隐藏 代 码 ” 法 的流 程简 图
0 0 4 1 0 相 于 程序 后续 处 理 分 枝 的 入 口地 址 ( 2 x0 0 1 1 见 . ) 8节 ,
2 程 序 实 例
下 面 以 一 个 M coot i a C+ . 台 下 的 简 单 Wi3 irsfV s l +60平 u n2 C no o sl 序 为 实 例 ,逐 步 说 明 “ 藏 代 码 ” 的 实 现 方 法 。 这 e程 隐 个 程 序 的 功 能 是 :提 示 操 作 者 输 入 整 型 密 码 .将 输 入 的 密 码 与
操作者 。
2. 建 立 工 程 1
打 开 Mirsf V s a C+ 6 . 在 “ 件 ” 菜 单 中 选 择 coo i l + . t u 0 义 “ 建” 新 ,在 弹 出 的 向 导 对 话 框 中 选 择 “ 秤 ” 标 签 , 选 择 T “ n 2 C n o p l ai ” Wi3 o sl A pi t n .然后 在 右 L部 的 编 辑 椎 内输 入 ] e c o _ 程 名 称 .本 文 的工 程 名 称 是 “ et mp .点 “ 定 ” Tsu ” J 确 .点 击 “ 成 ” 在 工 程 中新 建 文 件 名 为 “ o re l e p 的 源 文 件 完 。 S u c fe p ” i .
木马免杀之汇编花指令技巧(精)
木马免杀之汇编花指令技巧作者:逆流风(发表于《黑客X档案》07.07,转载注明出处)相信很多朋友都做过木马免杀,早期的免杀都是加壳和改特征码,现在免杀技术已经发展到花指令免杀,改壳之类的,而这些需要一定的汇编知识,但是汇编却不是一块容易啃的骨头,所以我写了这篇菜鸟版的免杀汇编教程,帮助小菜们快速入门,掌握免杀必备的汇编知识,改花指令,改特征码的技巧和编写自己的花指令。
一、免杀必备的汇编知识push 压栈,栈是一种数据结构,记住四个字:先进后出。
压栈就是把数据放如栈中,从栈顶放如,出栈的时候也是从栈顶取出,所以会有先进后出的特点!先进后出我们可以这样理解,例如:一个乒乓球筒,我们放入乒乓球,然后取出乒乓球,取出的都是就后放进的球。
就如我们放入球的顺序是球1、2、3、4,取出的顺序是球4、3、2、1。
pop 出栈,与push相对应。
mov a,b 把b的值送给a,把它看作编程中的赋值语句就是b赋值给a,这时a的值就是b了。
nop 无作用,就是什么也没做。
retn 从堆栈取得返回地址并跳到该地址执行。
下面是一些算术运算指令:ADD 加法sub 减法inc 加1dec 减1最后是跳转指令:jmp 无条件跳je 或jz 若相等则跳jne或jnz 若不相等则跳jb 若小于则跳jl 若小于则跳ja 若大于则跳jg 若大于则跳jle 若小于等于则跳jge 若大于等于则跳这些就是我们需要掌握的,怎么样不多吧,一些指令可能看不明白,看了后面的就会清楚了。
对了,忘了讲寄存器了,寄存器是中央处理器内的其中组成部份。
寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。
我们需要了解的是8个通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP二、特征码和花指令的修改特征码我就不多说了,大家都知道的,现在杀毒软件查杀都用特征码查杀,改了木马的特征码,杀毒软件就查不出我们的木马,这样就达到免杀的效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用花指令防止程序被反汇编什么是花指令?当然不是"flower code",呵呵,实际上,把它按照“乱指令”来理解可能更贴切一些,它的真正英文名应该叫"thunkcode"吧(不确定,呵呵)。
我们知道,汇编语言其实就是机器指令的符号化,从某种程度上看,它只是更容易理解一点的机器指令而已。
每一条汇编语句,在汇编时,都会根据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实现间接跳转,当然,矛矛盾盾,只是时间长点而已,世上没有绝对安全的系统。