`
todd_liu
  • 浏览: 66094 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

矛与盾的较量(1)——花指令【转自老罗】

阅读更多

有矛就有盾。
所以我们要讨论加密技术。

我们知道,所有的编译型语 言,例如VC、BCB、Delphi和Win32ASM……最终都会把源代码编译成机器能识别的0和1——因此也能够反过来把这些0和1反编译成汇编代 码。反编译有什么用呢?试想想,你辛辛苦苦写了一个perfect的软件出来,正准备把它卖上100万份,忽然!在市面上出现了很多仿制你的东 西……hoho,不知道你会怎么想呢?反正我是会欲哭无泪的。还有另外一种情况,你的软件是用注册码的形式来授权的,每份license要卖30个美刀。 呵呵,正当你在考虑着一年后是去加利福尼亚还是夏威夷度假的时候,你的软件被Crack了——也就是说,你一分钱都不会得到……(啊!我想跳楼啦!!)

所以我们要讨论如何给自己的程序加密。这次就先说说最简单的花指令。

在解释这个“花指令”之前,不妨先做几个小小的实验。

我们先来写一个程序,命名为hua.asm,内容如下:

;***************************************************************
;花指令实验1
;作者:罗聪
;日期:2002-8-21
;***************************************************************
.386
.model flat, stdcall
option casemap:none

include "masm32"include"windows.inc
include "masm32"include"kernel32.inc
include "masm32"include"user32.inc
includelib "masm32"lib"kernel32.lib
includelib "masm32"lib"user32.lib

.data
szText        db    "嘿嘿,这是一个花指令程序……", 0
szCaption    db    "花指令演示 by LC 2002-8-21", 0

.code
main:
    jmp Do_It
Do_It:
    invoke MessageBox, NULL, addr szText, addr szCaption, MB_OK
    invoke ExitProcess, 0
end main


然后用W32Dasm v10来反编译它,得到的结果如下:(由于篇幅所限,这里只列出关键部分)


+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++
//********************** Start of Code in Object .text **************
Program Entry Point = 00401000 (hua.exe File Offset:00001600)



//******************** Program Entry Point ********
:00401000 EB00                    jmp 00401002

* Referenced by a (U)nconditional or ?onditional Jump at Address:
|:00401000(U)
|
:00401002 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"花指令演示 by LC 2002-8-21"
                                  |
:00401004 681F304000              push 0040301F

* Possible StringData Ref from Data Obj ->"嘿嘿,这是一个花指令程序……"
                                  |
:00401009 6800304000              push 00403000
:0040100E 6A00                    push 00000000

* Reference To: USER32.MessageBoxA, Ord:01BBh
                                  |
:00401010 E80D000000              Call 00401022
:00401015 6A00                    push 00000000

* Reference To: KERNEL32.ExitProcess, Ord:0075h
                                  |
:00401017 E800000000              Call 0040101C


哇,好夸张啊!你可能会说。反编译出来的代码几乎是跟源代码一一对应的,这样一来?我们的程序还有什么秘密可言呢?完全可以从反编译的结果中理解程序的功能。

而且我们还可以在W32Dasm的“String Data References”中得到:
"嘿嘿,这个是一个花指令程序……"
"花指令演示 by LC 2002-8-21"


把刚才的源程序稍做修改,来做第二个实验:


;***************************************************************
;花指令实验2
;作者:罗聪
;日期:2002-8-21
;***************************************************************
.386
.model flat, stdcall
option casemap:none

include "masm32"include"windows.inc
include "masm32"include"kernel32.inc
include "masm32"include"user32.inc
includelib "masm32"lib"kernel32.lib
includelib "masm32"lib"user32.lib

.data
szText        db    "嘿嘿,这是一个花指令程序……", 0
szCaption    db    "花指令演示 by LC 2002-8-21", 0

.code
main:
    jz Do_It    ;注意这里和第一个实验中的源程序的区别
    jnz Do_It    ;注意这里和第一个实验中的源程序的区别
Do_It:
    invoke MessageBox, NULL, addr szText, addr szCaption, MB_OK
end main


用W32Dasm反编译一下:

+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++
//********************** Start of Code in Object .text **************
Program Entry Point = 00401000 (hua.exe File Offset:00001600)



//******************** Program Entry Point ********
:00401000 7402                    je 00401004
:00401002 7500                    jne 00401004

* Referenced by a (U)nconditional or ?onditional Jump at Addresses:
|:00401000?, :00401002?
|
:00401004 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"花指令演示 by LC 2002-8-21"
                                  |
:00401006 681F304000              push 0040301F

* Possible StringData Ref from Data Obj ->"嘿嘿,这是一个花指令程序……"
                                  |
:0040100B 6800304000              push 00403000
:00401010 6A00                    push 00000000

* Reference To: USER32.MessageBoxA, Ord:01BBh
                                  |
:00401012 E801000000              Call 00401018


可以看出,这时的W32Dasm反编译出来的汇编指令还是正确的。但是W32Dasm其实已经逐渐落入我们设下的“陷阱”了。

下面我们来做第三个实验,把源程序改成:

;***************************************************************
;花指令实验3
;作者:罗聪
;日期:2002-8-21
;***************************************************************
.386
.model flat, stdcall
option casemap:none

include "masm32"include"windows.inc
include "masm32"include"kernel32.inc
include "masm32"include"user32.inc
includelib "masm32"lib"kernel32.lib
includelib "masm32"lib"user32.lib

.data
szText        db    "嘿嘿,这是一个花指令程序……", 0
szCaption    db    "花指令演示 by LC 2002-8-21", 0

.code
main:
    jz Do_It    ;注意这里和第一个实验中的源程序的区别
    jnz Do_It    ;注意这里和第一个实验中的源程序的区别
    db 0E8h        ;注意这里和第二个实验中的源程序的区别
Do_It:
    invoke MessageBox, NULL, addr szText, addr szCaption, MB_OK
    invoke ExitProcess, 0
end main


我们来看看W32Dasm中反编译出来的东西:

+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++
//********************** Start of Code in Object .text **************
Program Entry Point = 00401000 (hua.exe File Offset:00001600)



//******************** Program Entry Point ********
:00401000 7403                    je 00401005
:00401002 7501                    jne 00401005
:00401004 E86A00681D              call 1DA81073
:00401009 304000                  xor byte ptr [eax+00], al

* Possible StringData Ref from Data Obj ->"嘿嘿,这是一个花指令程序……"
                                  |
:0040100C 6800304000              push 00403000
:00401011 6A00                    push 00000000

* Reference To: USER32.MessageBoxA, Ord:01BBh
                                  |
:00401013 E80E000000              Call 00401026
:00401018 6A00                    push 00000000

* Reference To: KERNEL32.ExitProcess, Ord:0075h
                                  |
:0040101A E801000000              Call 00401020


呵呵,很明显了,这时的 00401004 到 00401009 行出错了,而且这时查看“String Data References”,也只剩下了:
"嘿嘿,这是一个花指令程序……"


让我们进一步隐藏信息,做第四个实验:

;***************************************************************
;花指令实验4
;作者:罗聪
;日期:2002-8-21
;***************************************************************
.386
.model flat, stdcall
option casemap:none

include "masm32"include"windows.inc
include "masm32"include"kernel32.inc
include "masm32"include"user32.inc
includelib "masm32"lib"kernel32.lib
includelib "masm32"lib"user32.lib

.data
szText        db    "嘿嘿,这是一个花指令程序……", 0
szCaption    db    "花指令演示 by LC 2002-8-21", 0

.code
main:
    jz Do_It    ;注意这里和第一个实验中的源程序的区别
    jnz Do_It    ;注意这里和第一个实验中的源程序的区别
    db 0E8h        ;注意这里和第二个实验中的源程序的区别
Do_It:
    lea eax, szText        ;注意这里和第三个实验中的源程序的区别
    lea ebx, szCaption    ;注意这里和第三个实验中的源程序的区别
    invoke MessageBox, NULL, eax, ebx, MB_OK    ;注意这里和第三个实验中的源程序的区别
    invoke ExitProcess, 0
end main


编译,再用W32Dasm反编译,得到的是:

+++++++++++++++++++ ASSEMBLY CODE LISTING ++++++++++++++++++
//********************** Start of Code in Object .text **************
Program Entry Point = 00401000 (hua.exe File Offset:00001600)



//******************** Program Entry Point ********
:00401000 7403                    je 00401005
:00401002 7501                    jne 00401005
:00401004 E88D050030              call 30401596
:00401009 40                      inc eax
:0040100A 008D1D1D3040            add byte ptr [ebp+40301D1D], cl
:00401010 006A00                  add byte ptr [edx+00], ch
:00401013 53                      push ebx
:00401014 50                      push eax
:00401015 6A00                    push 00000000

* Reference To: USER32.MessageBoxA, Ord:01BBh
                                  |
:00401017 E80E000000              Call 0040102A
:0040101C 6A00                    push 00000000

* Reference To: KERNEL32.ExitProcess, Ord:0075h
                                  |
:0040101E E801000000              Call 00401024


呵呵,这次不但面目全非了,而且“String Data References”按钮已经变成了灰色。什么蛛丝马迹都没有了。

各位看官看到这里明白了吗?其实花指令就是人为地构造一些“陷阱”和一些无用的字节。例如第二个实验中的:

jz Do_It
jnz Do_It

其实这个跟 jmp Do_It 还不是一样吗?(呵呵,如果在大学的期末考试里这样写,一定会被判不及格……)

是的,其实程序原有的功能和逻辑还是一样的,我们只不过是换了一种表现形式而已。然而,反编译工具是没有人脑那么智能的,它们往往就会把这些指令理解错,从而错误地确定了指令的起始位置。

要实现这种绝对跳转的功能,还可以用很多的方法,例如:

Push Do_It
ret


花指令是很容易理解的,不过大家要注意适时而用,不要滥用啊,能起到迷惑破解者和隐藏信息的作用就行了,不然将来要维护代码时,我怕被迷惑的反而是你自己哦,呵呵……
分享到:
评论

相关推荐

    矛与盾的PK九款流行杀毒软件评测报告WEB安全电脑资料.doc

    病毒与杀毒软件之间的关系就如同"矛"与"盾",彼此间的较量推动着杀毒技术的发展。随着互联网的普及,病毒的传播方式变得更为复杂,主要特征包括: 1. **传播网络化**:电子邮件、文件下载、网页浏览成为病毒传播的...

    很实用的花指令学习机

    "免杀"(Anti-Virus Evasion)是黑客和安全专家之间的一种技术较量,免杀技术旨在让恶意代码在不被反病毒软件发现的情况下运行,而花指令正是其中一种关键手段。 【标签】"花指令学习"明确了这个软件的主要功能,即...

    医疗决策:医学、情感与利益的较量——基于一起医疗决策的实证调查.pdf

    例如,社会认可的与患者最亲近的人通常在决策中扮演核心角色,他们的意见和决定往往具有决定性作用。而患者家人可能基于情感因素,倾向于选择对患者生活质量影响较小的方案;医生则会基于医学专业知识和临床经验,...

    谁才是重量级CPU的真正王者——P4E与Athlon64之间的终极较量.pdf

    Prescott核心在设计上增加了流水线长度,L1 Cache扩大到16KB,L2 Cache达到1MB,并且引入了SSE3指令集,增强了超线程技术。然而,Trace Cache追踪的指令数量并没有增加,依旧保持在16条。Prescott的这些改进旨在提升...

    “芯”花怒放——近期CPU市场综述与展望.pdf

    《“芯”花怒放——近期CPU市场综述与展望》 CPU,即中央处理器,是计算机的心脏,它的技术创新和进步对整个IT产业的发展起着至关重要的作用。近年来,CPU市场竞争格局发生了显著变化,主要体现在两大巨头英特尔和...

    真实与虚幻——CPU真实主频与PR主频.pdf

    这有助于AMD在市场竞争中避免直接与Intel在频率上的直接较量,并引导消费者更加关注处理器的实际性能而非单纯追求高主频。 VIA的C3处理器也采用了类似的PR值标识,继承了Cyrix的传统。这一做法表明,CPU性能的评价...

    跑道上的较量作文.doc

    【标题】:“跑道上的较量”——一篇关于毅力与超越自我的作文 【描述】:这篇文档是一篇学生作文,描述了作者参加越野长跑比赛的经历,通过跑道上的竞争,展现了作者面对困难时的决心与毅力,以及对自我挑战的深刻...

    【软件加密_技术内幕】

    [Trial version] 矛与盾的较量(1)——花指令.htm [Trial version] 5.8 代码与数据结合技术 [Trial version] 与破解过招,保护你的共享软件.htm [Trial version] 5.9 软件保护的若干忠告 [Trial version] WIN...

    数据库——超市管理系统

    【数据库——超市管理系统】是一个基于IT技术的商业应用案例,主要目标是提升小型超市的运营效率和决策能力。系统设计包括ER(实体关系)设计图和物理设计图,旨在为超市提供一套完整的信息化解决方案。 系统开发的...

    西藏地方近代史——课后习题答案.docx

    3. 这场战争反映了西方先进工业文明与东方落后农耕文明的碰撞,是两种不同社会制度和意识形态的较量,揭示了弱肉强食的国际现实。 森巴战争的意义在于: 1. 胜利不仅密切配合了第二次鸦片战争中东南沿海人民的反帝...

    赢——解决企业与品牌的营销难题DOC.doc

    在《赢——解决企业与品牌的营销难题》中,作者强调了营销策略在企业发展中的核心地位。文章指出,不存在疲软的市场,只有不正确的营销方式。中国市场庞大,消费者需求多样化,企业若能精准把握消费者需求并制定有效...

    《老人与海》读后感——简单与复杂.doc

    这不仅是一场人与鱼的对决,更是一场人与命运的较量,体现了人类面对困难时的不屈精神。 海明威通过老人的形象,探讨了简单与复杂的关系。老人的内心世界是单纯的,他对海洋的热爱,对孩子的关怀,对生命的尊重,...

    营销——高手过招.ppt

    【营销策略与技巧】 营销是一门深奥的艺术,高手之间的较量更是充满了智慧和策略。这份“营销——高手过招.ppt”为我们揭示了营销领域的精髓,涵盖了从个人业绩提升到团队管理,再到具体营销技巧的全方位知识。 ...

    新一代CPU的搭档——最新芯片组解析.pdf

    本文主要解析了新一代CPU的搭档——最新的芯片组,重点关注了Intel的Prescott处理器和AMD的Athlon 64处理器。Prescott作为Intel的下一代利器,虽然具备多项先进的技术,如改进的分支预测技术,提升了处理效率,但它...

    《亲历投行——中国投行的若干传言与真相》ppt读书笔记.rar

    《亲历投行——中国投行的若干传言与真相》是一本深度揭示中国投资银行业内幕的书籍,作者通过自己的亲身经历,为读者揭开了这个行业神秘的面纱。这份PPT读书笔记,无疑是深入理解中国投行生态的重要参考资料,对于...

    五子棋——人机对决(C#版)

    在这款游戏中,用户可以选择与电脑进行一场智力的较量,体验五子棋的魅力。下面将详细介绍这款程序的实现原理以及涉及到的相关知识点。 1. **C#编程语言基础** C#是一种面向对象的编程语言,由微软公司开发,广泛...

    重返自己的战场——浅谈LINUX下的后门技术.pdf

    《重返自己的战场——浅谈LINUX下的后门技术》 在信息安全领域,后门技术是一种高级的技巧,它涉及到攻防两端的智慧较量。本文主要探讨的是在Linux操作系统中的后门技术,这对于系统开发和安全维护人员具有重要的...

    机遇与挑战——2007AMD处理器发展趋势前瞻.pdf

    经过多年的努力,其K8系列处理器终于获得了市场的认可,特别是在OEM市场上与英特尔展开了正面的较量。AMD推出的90nm处理器具备了较大容量的二级缓存(1MB×2),这成为其市场成功的关键因素之一。然而,在性能和功耗...

    CPU市场竞争惨烈——Cyrix急流勇退.pdf

    在IT行业中,CPU(中央处理器)是计算机硬件系统的核心组件,负责执行计算机程序中的指令,控制硬件系统的运行。本文将围绕“CPU市场竞争惨烈——Cyrix急流勇退”这一主题,深入探讨CPU市场的发展历程,特别是Cyrix...

    品牌传播战略——低成本创建强势品牌.pptx

    【品牌传播战略——低成本创建强势品牌】 一、强势品牌的价值 1. 强势品牌是企业在市场竞争中的壁垒,能够抵御外来“侵略”,保护企业的生存空间。加入WTO后,品牌成为区分民族产业的重要标志。 2. 现代市场中,...

Global site tag (gtag.js) - Google Analytics