- 浏览: 66094 次
- 性别:
- 来自: 江苏
文章分类
最新评论
-
donghustone:
楼主好强大!!
resin2.1.17 官方下载地址 -
MultiArrow:
这么说的话好像就只有CentOS没有一个比较强的企业在使用。。 ...
诸多linux,但选一个做服务器
有矛就有盾。
所以我们要讨论加密技术。
我们知道,所有的编译型语
言,例如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
花指令是很容易理解的,不过大家要注意适时而用,不要滥用啊,能起到迷惑破解者和隐藏信息的作用就行了,不然将来要维护代码时,我怕被迷惑的反而是你自己哦,呵呵……
发表评论
-
数据包 分析
2010-07-01 01:39 0自己喜欢的!------ 明天 ... -
Java防止非法和重复表单提交
2010-04-23 11:22 1174真是一切都逃不过session,看了DZ的formhash;s ... -
矛与盾的较量(2)——CRC原理篇
2010-05-20 01:45 794下载本节例子程序 (4.29 ... -
矛与盾的较量(3)——CRC实践篇
2010-05-20 01:47 670下载本节例子程序 (13.4 ... -
矛与盾的较量(4)——奇妙的Base64编码
2010-05-20 01:48 920下载本节例子程序 (6.93 ... -
如何检测SQL注入和CSS攻击漏洞
2010-06-09 14:50 1659http://www.symantec.com/connec ...
相关推荐
病毒与杀毒软件之间的关系就如同"矛"与"盾",彼此间的较量推动着杀毒技术的发展。随着互联网的普及,病毒的传播方式变得更为复杂,主要特征包括: 1. **传播网络化**:电子邮件、文件下载、网页浏览成为病毒传播的...
"免杀"(Anti-Virus Evasion)是黑客和安全专家之间的一种技术较量,免杀技术旨在让恶意代码在不被反病毒软件发现的情况下运行,而花指令正是其中一种关键手段。 【标签】"花指令学习"明确了这个软件的主要功能,即...
例如,社会认可的与患者最亲近的人通常在决策中扮演核心角色,他们的意见和决定往往具有决定性作用。而患者家人可能基于情感因素,倾向于选择对患者生活质量影响较小的方案;医生则会基于医学专业知识和临床经验,...
Prescott核心在设计上增加了流水线长度,L1 Cache扩大到16KB,L2 Cache达到1MB,并且引入了SSE3指令集,增强了超线程技术。然而,Trace Cache追踪的指令数量并没有增加,依旧保持在16条。Prescott的这些改进旨在提升...
《“芯”花怒放——近期CPU市场综述与展望》 CPU,即中央处理器,是计算机的心脏,它的技术创新和进步对整个IT产业的发展起着至关重要的作用。近年来,CPU市场竞争格局发生了显著变化,主要体现在两大巨头英特尔和...
这有助于AMD在市场竞争中避免直接与Intel在频率上的直接较量,并引导消费者更加关注处理器的实际性能而非单纯追求高主频。 VIA的C3处理器也采用了类似的PR值标识,继承了Cyrix的传统。这一做法表明,CPU性能的评价...
【标题】:“跑道上的较量”——一篇关于毅力与超越自我的作文 【描述】:这篇文档是一篇学生作文,描述了作者参加越野长跑比赛的经历,通过跑道上的竞争,展现了作者面对困难时的决心与毅力,以及对自我挑战的深刻...
[Trial version] 矛与盾的较量(1)——花指令.htm [Trial version] 5.8 代码与数据结合技术 [Trial version] 与破解过招,保护你的共享软件.htm [Trial version] 5.9 软件保护的若干忠告 [Trial version] WIN...
【数据库——超市管理系统】是一个基于IT技术的商业应用案例,主要目标是提升小型超市的运营效率和决策能力。系统设计包括ER(实体关系)设计图和物理设计图,旨在为超市提供一套完整的信息化解决方案。 系统开发的...
3. 这场战争反映了西方先进工业文明与东方落后农耕文明的碰撞,是两种不同社会制度和意识形态的较量,揭示了弱肉强食的国际现实。 森巴战争的意义在于: 1. 胜利不仅密切配合了第二次鸦片战争中东南沿海人民的反帝...
在《赢——解决企业与品牌的营销难题》中,作者强调了营销策略在企业发展中的核心地位。文章指出,不存在疲软的市场,只有不正确的营销方式。中国市场庞大,消费者需求多样化,企业若能精准把握消费者需求并制定有效...
这不仅是一场人与鱼的对决,更是一场人与命运的较量,体现了人类面对困难时的不屈精神。 海明威通过老人的形象,探讨了简单与复杂的关系。老人的内心世界是单纯的,他对海洋的热爱,对孩子的关怀,对生命的尊重,...
【营销策略与技巧】 营销是一门深奥的艺术,高手之间的较量更是充满了智慧和策略。这份“营销——高手过招.ppt”为我们揭示了营销领域的精髓,涵盖了从个人业绩提升到团队管理,再到具体营销技巧的全方位知识。 ...
本文主要解析了新一代CPU的搭档——最新的芯片组,重点关注了Intel的Prescott处理器和AMD的Athlon 64处理器。Prescott作为Intel的下一代利器,虽然具备多项先进的技术,如改进的分支预测技术,提升了处理效率,但它...
《亲历投行——中国投行的若干传言与真相》是一本深度揭示中国投资银行业内幕的书籍,作者通过自己的亲身经历,为读者揭开了这个行业神秘的面纱。这份PPT读书笔记,无疑是深入理解中国投行生态的重要参考资料,对于...
在这款游戏中,用户可以选择与电脑进行一场智力的较量,体验五子棋的魅力。下面将详细介绍这款程序的实现原理以及涉及到的相关知识点。 1. **C#编程语言基础** C#是一种面向对象的编程语言,由微软公司开发,广泛...
《重返自己的战场——浅谈LINUX下的后门技术》 在信息安全领域,后门技术是一种高级的技巧,它涉及到攻防两端的智慧较量。本文主要探讨的是在Linux操作系统中的后门技术,这对于系统开发和安全维护人员具有重要的...
经过多年的努力,其K8系列处理器终于获得了市场的认可,特别是在OEM市场上与英特尔展开了正面的较量。AMD推出的90nm处理器具备了较大容量的二级缓存(1MB×2),这成为其市场成功的关键因素之一。然而,在性能和功耗...
在IT行业中,CPU(中央处理器)是计算机硬件系统的核心组件,负责执行计算机程序中的指令,控制硬件系统的运行。本文将围绕“CPU市场竞争惨烈——Cyrix急流勇退”这一主题,深入探讨CPU市场的发展历程,特别是Cyrix...
【品牌传播战略——低成本创建强势品牌】 一、强势品牌的价值 1. 强势品牌是企业在市场竞争中的壁垒,能够抵御外来“侵略”,保护企业的生存空间。加入WTO后,品牌成为区分民族产业的重要标志。 2. 现代市场中,...