花指令_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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决FileSystemWatcher事件多次触发的方法

    解决FileSystemWatcher事件多次触发的方法

    2021年8月6日
    56
  • MySQL修改端口号(修改mysql的端口号会有问题吗)

    关于mysql的端口号先登录mysql:fegy@fegy-X542UN:~$mysql-uroot-pEnterpassword:WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis4Serverversion:5.7.26-0ubuntu0.18.0…

    2022年4月12日
    97
  • Navicat Premium 15激活码【2021.10最新】

    (Navicat Premium 15激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~09LV…

    2022年3月28日
    65
  • java .foreach数组遍历_foreach遍历ArrayList和数组

    java .foreach数组遍历_foreach遍历ArrayList和数组遍历ArrayList的方式有迭代器,foreach循环,get(i)等方式。其中迭代器和get方法都有具体的代码可以看到。foreach循环是怎么实现的呢?下面通过反编译class的方式来看看JAVA是如何处理foreach遍历ArrayList、数组的。先说结论:foreach遍历list底层还是使用的迭代器;foreach遍历数组还是传统的i=0到i=length-1遍历,只是写法上封装成f…

    2022年7月22日
    24
  • 单模光纤和多模光纤的波长_用立式光学计测量轴径结论

    单模光纤和多模光纤的波长_用立式光学计测量轴径结论熔接必备住友82C菲尼特熔接教程首先是介绍下多模光纤和单模光纤区别:1、多模光纤是光纤通信最原始的技术,这一技术是人类首次实现通过光纤来进行通信的一项革命性的突破。2、随着光纤通信技术的发展,特别是激光器技术的发展以及人们对长距离、大信息量通信的迫切需求,人们又寻找到了更好的光纤通信技术—-单模光纤通信。3、光纤通信技术发展到今天,多模光纤通信固有的很多局限性愈发显得突出:①多…

    2022年8月30日
    6
  • 前端js面试题(基础)「建议收藏」

    前端js面试题(基础)「建议收藏」1、js中使用typeof能得到哪些类型?——undefined、string、number、boolean、object、function2、===和==分别在何时使用?//==的使用情况为以下2种(其他情况下推荐使用===)if(obj.a==null){ //相当于obj.a===null||obj.a===undefined}functionfn(a,b){ i…

    2022年8月26日
    6

发表回复

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

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