花指令_cmp指令

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

本文作者: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实现间接跳转,当然,矛矛盾盾,仅仅是时间长点而已,世上没有绝对安全的系统。

<以上代码来源于看雪的”软件加密技术内幕”一书>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167435.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 河北省理科2001——2010年一分一档表[通俗易懂]

    河北省理科2001——2010年一分一档表[通俗易懂]VirtualBox.bat:C:cd”\ProgramFiles\Oracle\VirtualBox”VBoxManagestartvm”CentOS-6.5″–typeheadless

    2022年7月13日
    43
  • 常见的RuntimeException

    常见的RuntimeException常见的RuntimeException                    RuntimeException是开发中最容易遇到的,下面列举一下常见的RuntimeException:1、NullPointerException:见的最多了,其实很简单,一般都是在null对象上调用方法了。   Strings=null;   bo…

    2022年7月25日
    14
  • java jbpm工作流_jbpm工作流

    java jbpm工作流_jbpm工作流一、JBPM(javabusinessprocessmanager)1、工作流管理流程O—>定义工作流(使用流程设计器生成,png和xml文件,分别面向用户和系统)—>执行工作流(核心对象:流程引擎ProcessEngine)—>连接数据库(jbpm18张表,jbpm4_deploymen,jbpm4_deployprop,jbpm4_execution,jbp…

    2022年9月10日
    2
  • java stack deque_java如何实现栈

    java stack deque_java如何实现栈Java中的栈Stack、Deque、ArrayDeque、LinkedList的区别Stack类那么为什么我们不选择Stack呐?(两个主要原因)那么我们应该使用ArrayDeque还是LinkedList呐?总结Stack类Java中Stack类底层是数组实现的线程安全的栈。先进后出,常用操作是push/pop/peek而Deque是更加适用的双端队列接口,其通过ArrayDeque/LinkedList初始化实现Deque<Integer>stack=newArrayDeq

    2022年9月20日
    4
  • 浅入浅出LuaJIT[通俗易懂]

    浅入浅出LuaJIT[通俗易懂]JIT什么是JITJIT=JustInTime即时编译,是动态编译的一种形式,是一种优化虚拟机运行的技术。程序运行通常有两种方式,一种是静态编译,一种是动态解释,即时编译混合了这二者。Java和.Net/mono中都使用了这种技术。然而IOS中禁止使用(不是针对JIT,而是所有的动态编译都不支持)!为什么要使用JIT解释执行:效率低。代码暴露。静态编译:不够灵活,无法热更新。

    2022年10月6日
    1
  • GFS – The Google File System

    GFS – The Google File SystemTheGoogleFileSystemhttp://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.125.789&amp;rep=rep1&amp;type=pdfhttp://www.dbthink.com/?p=501,中文翻译 Google牛人云集的地方,但在设计系统时,却非常务实,没有采用什么复杂和时髦…

    2022年6月1日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号