长兴张天任资产:那个会编程的大哥给写几个花指令!

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/05 12:05:30
我要自己写的花指令.网上所有找的那些别望这里发!
要是网上找的话,我自己会找!用不找这里来求救了
哪个编程高手帮忙给写一些花指令,这些应该对你们都是小菜了!
有人会的加我QQ9185826

上边那人发的那么多根本没用
我加你QQ了!我帮你写!

y369322478提到的代码可以使用MASM来编译,编译后在W32DASM中调试。

什么是花指令?

花指令实验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 T USER32.MessageBoxA, Ord:01BBh
|
:00401010 E80D000000 Call 00401022
:00401015 6A00 push 00000000

* Reference T 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 T 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 T USER32.MessageBoxA, Ord:01BBh
|
:00401013 E80E000000 Call 00401026
:00401018 6A00 push 00000000

* Reference T 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 T USER32.MessageBoxA, Ord:01BBh
|
:00401017 E80E000000 Call 0040102A
:0040101C 6A00 push 00000000

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

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

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

jz Do_It
jnz Do_It

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

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

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

Push Do_It
ret

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

能演示一下不?