花指令是一堆汇编指令组成,对于程序来说,是一堆废话,加不加花指令都
不影响程序的正常运行.编写的花指令要终始保持堆栈的平衡.
花指令:(junk code)意思是程序中有一些指令,由设计者特别构思,希望使反汇编的时候出错,让破解者无法清楚正确地反汇编程序的内容,迷失方向。经典的是一些跳转指令,目标位置是另一条指令的中间,这样在反汇编的时候便会出现混乱。花指令有可能利用各种jmp, call, ret, 一些堆栈技巧,位置运算,等等
去除花指令,跟去除混淆不一样,花指令只是一些迷惑的语句,混淆可能包含的更多一些。
所以还是有必要去实现一个代码分析器。
找不到Microsoft Visual C++ 6.0 SPxMethod 1
1。伪装 vc++5.0
PUSH EBP
MOV EBP,ESP
PUSH -1
push415448-___
PUSH4921A8-/在这段代码中类似这样的操作数可以乱填
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
ADD ESP,-6C
PUSH EBX
PUSH ESI
PUSH EDI
ADD BYTE PTRDS:[EAX],AL/这条指令可以不要!
jmp 跳转到程序原来的入口点
(2)无效PE文件
往回跳转0040639B00db 00
xxxxxx:
nop
POPEAX---
POPEAX|--这部分是花指令!
POPEAX|
JMPyyyyyy/(跳回旧入口点:)
新入口点 --->
push ebp
mov ebp,esp
inc ecx
push edx
nop
pop edx
dec ecx
pop ebp
inc ecx
MOV DWORD PTRFS:[0],EAX
POPEAX|
POPEAX
MOV DWORD PTRFS:[0],EAX|(注意了。。花指令)
POPEAX/
POPEAX|
MOV DWORD PTRFS:[0],EAX/
loop xxxxxx.....(转到地址)
(3)伪装Microsoft Visual C++
融合把A的代码换成B的
push ebp
mov ebp,esp
push -1
push 111111
push 222222
mov eax,fs:[0]
push eax
mov fs:[0],esp
pop eax
mov fs:[0],eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
jmp 老入口
(4) Microsoft Visual C++ 6.0
PUSH -1
PUSH 0
PUSH 0
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
SUB ESP,68
PUSH EBX
PUSH ESI
PUSH EDI
POP EAX
POP EAX
POP EAX
ADD ESP,68
POP EAX
MOV DWORD PTR FS:[0],EAX
POP EAX
POP EAX
POP EAX
POP EAX
MOV EBP,EAX
JMP 原入口
(5)
在mov ebp,eax
后面加上
PUSH EAX
POP EAX
(6)
防杀精灵终极防杀代码
push ebp
mov ebp,esp
add esp,-0C
add esp,0C
push eax
jmp入口
(7)木马彩衣(金色鱼锦衣)花代码
push ebp
mov ebp,esp
add esp,-0C
add esp,0C
mov eax,原入口
push eax
retn
(8)木马彩衣(虾米披风)花代码
push ebp
nop
nop
mov ebp,esp
inc ecx
nop
push edx
nop
nop
pop edx
nop
pop ebp
inc ecx
loopd /跳转到下面那段代码地址去!
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
nop/"胡乱"跳转的开始...
jmp 下一个jmp的地址/在附近随意跳
jmp.../...
jmp 原入口的地址/跳到原始oep
(9)VC++5.0代码(木马彩衣无限复活袍)
PUSH EBP
MOV EBP,ESP
PUSH -1
push415448-___
PUSH4021A8-/在这段代码中类似这样的操作数可以乱填
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
ADD ESP,-6C
PUSH EBX
PUSH ESI
PUSH EDI
ADD BYTE PTRDS:[EAX],AL/这条指令可以不要!
jo00401000/原入口
jno00401000/原入口
db0e8h/花代码
。。。。。。。。。 。。。。花指令。。。。。。。。。。。。。。。。。。。
一.花指令概念:
花指令是一堆汇编指令组成,对于程序来说,是一堆废话,加不加花指令都
不影响程序的正常运行.编写的花指令要终始保持堆栈的平衡.
二.写花指令的原则:
写花指令的基本原则就是要保持堆栈的平衡.
写花指令细细品味下面一段比喻:
我们把一段花指令比喻成一道数学运算题,把汇编指令(push pop等)比喻成加减
乘除,把寄存器或数据(eax,ebx,1等)比喻成
数字(1,2,3等),那么要保持花指令堆栈的平衡,等于保持这道数学题的结果是0 .
三.解释一些指令含意
push ebp ----把基址指针寄存器压入堆栈
pop ebp----把基址指针寄存器弹出堆栈
push eax ----把数据寄存器压入堆栈
pop eax----把数据寄存器弹出堆栈
nop-----不执行
add esp,1-----指针寄存器加1
sub esp,-1-----指针寄存器加1
add esp,-1--------指针寄存器减1
sub esp,1-----指针寄存器减1
inc ecx-----计数器加1
dec ecx-----计数器减1
sub esp,1 ----指针寄存器-1
sub esp,-1----指针寄存器加1
jmp 入口地址----跳到程序入口地址
push 入口地址---把入口地址压入堆栈
retn------ 反回到入口地址,效果与jmp 入口地址一样.
mov eax,入口地址------把入口地址转送到数据寄存器中.
jmpeax----- 跳到程序入口地址
jb 入口地址
jnb 入口地址------效果和jmp 入口地址一样,直接跳到程序入口地址.
四.免杀花指令编写手册:
注:以后编写花指令,都可以参考本手册,灵活组合,快速写出自己的花指令.
*******************************************************************
我加上的可利用的命令:
xor eax,eax寄存器EAX清0
CALL 空白命令的地址无效call