deletex 发表于 2007-2-22 16:01:37

常用花指令大全

在http://www.sec120.com/news/intL/2007-1-29/2456.html看到这篇文章

在论坛里搜索了一下,好像没这东东,就转过来了


1.伪装vc++5.0代码:

PUSH EBP
MOV EBP,ESP
PUSH -1
push 111111 -\___
PUSH 111111 -/ 在这段代码中类似这样的操作数可以乱填
MOV EAX,DWORD PTR FS:
PUSH EAX
MOV DWORD PTR FS:,ESP
ADD ESP,-6C
PUSH EBX
PUSH ESI
PUSH EDI
nop
jmp 原入口地址



************************************************************************
2.胡乱跳转代码:
push ebp
mov ebp,esp
inc ecx
push edx
ADD ESP,-6C
nop
pop edx
dec ecx
pop ebp
ADD ESP,6C
inc ecx
loop somewhere /跳转到上面那段代码地址去!

somewhere:
nop /"胡乱"跳转的开始...
jmp 下一个jmp的地址 /在附近随意跳
jmp ... /...
jmp 原入口地址 /跳到原始oep

************************************************************************
3.伪装c++代码:
push eax
mov ebp,esp
push -1
push 111111
push 111111
mov eax,fs:
push eax
mov fs:,esp
pop eax
mov fs:,eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
nop
nop
jmp 原入口地址

************************************************************************
4.伪装Microsoft Visual C++ 6.0代码:

PUSH -1
PUSH 0
PUSH 0
MOV EAX,DWORD PTR FS:
PUSH EAX
MOV DWORD PTR FS:,ESP
SUB ESP,1
PUSH EBX
PUSH ESI
PUSH EDI
POP EAX
POP EAX
nop
POP EAX
nop
ADD ESP,1
POP EAX
MOV DWORD PTR FS:,EAX
POP EAX
POP EAX
nop
POP EAX
nop
POP EAX
MOV EBP,EAX
JMP 原入口地址

************************************************************************
5.伪装防杀精灵一号防杀代码:
push ebp
mov ebp,esp
push -1
push 666666
push 888888
mov eax,dword ptr fs:
nop
mov dword ptr fs:,esp
nop
mov dword ptr fs:,eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
jmp 原入口地址

************************************************************************
6.伪装防杀精灵二号防杀代码:
push ebp
mov ebp,esp
push -1
push 0
push 0
mov eax,dword ptr fs:
push eax
mov dword ptr fs:,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:,eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
jmp 原入口地址

************************************************************************
7.伪装木马彩衣(无限复活袍)代码:
PUSH EBP
MOV EBP,ESP
PUSH -1
push 415448 -\___
PUSH 4021A8 -/ 在这段代码中类似这样的操作数可以乱填
MOV EAX,DWORD PTR FS:
PUSH EAX
MOV DWORD PTR FS:,ESP
ADD ESP,-6C
PUSH EBX
PUSH ESI
PUSH EDI
ADD BYTE PTR DS:,AL /这条指令可以不要!
jo 原入口地址
jno 原入口地址
call 下一地址

************************************************************************
8.伪装木马彩衣(虾米披风)代码:
push ebp
nop
nop
mov ebp,esp
inc ecx
nop
push edx
nop
nop
pop edx
nop
pop ebp
inc ecx
loop somewhere /跳转到下面那段代码地址去!

someshere:
nop /"胡乱"跳转的开始...
jmp 下一个jmp的地址 /在附近随意跳
jmp ... /...
jmp 原入口的地址 /跳到原始oep

************************************************************************
9.伪装花花添加器(神话)代码:-----------根据C++改
nop
nop
nop
mov ebp,esp
push -1
push 111111
push 222222
mov eax,dword ptr fs:
push eax
mov dword ptr fs:,esp
pop eax
mov dword ptr fs:,eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
mov eax,原入口地址
push eax
retn

************************************************************************
10.伪装花花添加器(无极)代码:
nop
mov ebp, esp
push -1
push 0A2C2A
push 0D9038
mov eax, fs:
push eax
mov fs:, esp
pop eax
mov fs:, eax
pop eax
pop eax
pop eax
pop eax
mov ebp, eax
mov eax, 原入口地址
jmp eax

************************************************************************
11.伪装花花添加器(金刚)代码:--------根据VC++5.0改
nop
nop
mov ebp, esp
push -1
push 415448
push 4021A8
mov eax, fs:
push eax
mov fs:, esp
add esp, -6C
push ebx
push esi
push edi
add , al
mov eax,原入口地址
jmp eax

************************************************************************
12.伪装花花添加器(杀破浪)代码:
nop
mov ebp, esp
push -1
push 0
push 0
mov eax, fs:
push eax
mov fs:, esp
sub esp, 68
push ebx
push esi
push edi
pop eax
pop eax
pop eax
add esp, 68
pop eax
mov fs:, eax
pop eax
pop eax
pop eax
pop eax
mov ebp, eax
mov eax, 原入口地址
jmp eax

************************************************************************
12.伪装花花添加器(痴情大圣)代码:
nop
..........省略N行nop
nop
push ebp
mov ebp, esp
add esp, -0C
add esp, 0C
mov eax, 原入口地址
push eax
retn

************************************************************************
13.伪装花花添加器(如果*爱)代码:
nop
........省略N行nop
nop
push ebp
mov ebp, esp
inc ecx
push edx
nop
pop edx
dec ecx
pop ebp
inc ecx
mov eax, 原入口地址
jmp eax

************************************************************************
14.伪装PEtite 2.2 -> Ian Luck代码:
mov eax,0040E000
push 004153F3
push dword ptr fs:
mov dword ptr fs:,esp
pushfw
pushad
push eax
xor ebx,ebx
pop eax
popad
popfw
pop dword ptr fs:
pop eax
jmp 原入口地址 '执行到程序的原有OEP

************************************************************************
15.无效PE文件代码:
push ebp
mov ebp,esp
inc ecx
push edx
nop
pop edx
dec ecx
pop ebp
inc ecx
MOV DWORD PTR FS:,EAX \
POP EAX |
POP EAX \
MOV DWORD PTR FS:,EAX |(注意了。。花指令)
POP EAX /
POP EAX |
MOV DWORD PTR FS:,EAX /
loop 原入口地址

************************************************************************
16.伪装防杀精灵终极防杀代码:
push ebp
mov ebp,esp
add esp,-0C
add esp,0C
push eax
jmp 原入口地址
************************************************************************
17.伪装木马彩衣(金色鱼锦衣)花代码
push ebp
mov ebp,esp
add esp,-0C
add esp,0C
mov eax,原入口地址
push eax
retn

************************************************************************
18.
在mov ebp,eax
后面加上
PUSH EAX
POP EAX

************************************************************************
19.伪装UPX花指令代码:

pushad
mov esi,m.0044D000
lea edi,dword ptr ds:
push edi
or ebp,FFFFFFFF
jmp short m.00477F2A

************************************************************************
20.
push ebp
mov ebp,esp
inc ecx
push edx
pop edx
dec ecx
pop ebp
inc ecx
jmp 原入口

21、
push ebp
nop
nop
mov ebp,esp
inc ecx
nop
push edx
nop
nop
pop edx
nop
pop ebp
inc ecx
loop A1地址
nop
nop

A1:push ebp
mov ebp,esp
jo 原入口
jno 原入口

************************************************************************
【深层】伪装 WCRT Library (Visual C++) DLL Method 1 -> Jibz
黑吧代码 + 汇编代码:
使用黑吧粘贴以下代码:

55 8B EC 83 7D 0C 01 75 41 A1 C0 30 00 10 85 C0 74 0A FF D0 85 C0 75 04 6A FE EB 17 68 0C 30 00 10 68 08 30 00 10 E8 89 00 00 00 85 C0 59 59 74 08 6A FD FF 15 08 20 00 10 68 04 30 00 10 68 00 30 00 10 E8 52 00 00 00 59 59

粘贴完毕后,再添加2行汇编语句:

jmp 原入口地址 '执行到程序的原有OEP

retn 0C
************************************************************************


发布几个不常见的花指令

B1 01 mov cl,1
2C 90 sub al,90
95 xchg eax,ebp
4D dec ebp
65:42 inc edx
40 inc eax
20C4 and ah,al
8350 06 6E adc dword ptr ds:,6E
226A E4 and ch,byte ptr ds:
E8 B15FBC5B call 入口点


55 push ebp
8BEC mov ebp,esp
51 push ecx
53 push ebx
8BD8 mov ebx,eax
8BC3 mov eax,ebx
04 9F add al,9F
2C 1A sub al,1A
73 03 jnb 入口点

JMP SHORT test.00414FB5 (EB 01)
NOP
JMP SHORT test.00414FB8 (EB 01)
NOP
JMP SHORT test.00414FBB (EB 01)
NOP
JMP test. (EB 01)

90=c4

PUSH EBP
MOVE EBP,ESP
inc ecx
push eax
pop eax
push edx
pop edx
dec ecx
sub eax,-2
ADD ESP,68
DEC eax
DEC eax
SUB ESP,68
JPE 入口
JPO 入口





补充:

PUSH EBP
MOV EBP,ESP
ADD ESP,-0C
MOV EAX,入口点
PUSH EAX
RETN

PUSH EBP
MOV EBP,ESP
ADD ESP,-0C
ADD ESP,0C
MOV EAX,入口点
PUSH EAX
RETN


push ebp
nop
nop
nop
mov ebp,esp
inc ecx
nop
push edx
nop
nop
pop edx
nop
nop
pop ebp
inc ecx
loopd /跳转到原入口地址去!


cmp eax,ebx
je L
jne L
L:
push 原来入口
pop eax
jmp eax



mov cl,1
sub al,90
xchg eax,ebp
dec ebp
inc edx
inc eax
and ah,al
adc dword ptr ds:,6E
and ch,byte ptr ds:
call 入口点


push ebp
mov ebp,esp
push ecx
push ebx
mov ebx,eax
mov eax,ebx
add al,9F
sub al,1A
jnb 入口点


push 新入口点
pop edx
add ecx,1
sub ecx,-1
call 原入口点
call 原入口点
jnz 原入口点


push esp
push push的本身地址  这里是地址是 1314c37C
pop edx
add edx,-1
sub edx,1
call 原入口点
call 原入口点
jmp 原入口点



PUSH EBP
MOV DWORD PTR FS:,EAX
POP EAX
POP EAX
MOV DWORD PTR FS:,EAX
POP EAX
POP EAX
MOV DWORD PTR FS:,EAX
MOV EBP,ESP
ADD ESP,-0C
ADD ESP,0C
MOV EAX,入口点
PUSH EAX
MOV EBP,EAX
PUSH EAX
POP EAX
RETN

55 64 A3 00 00 00 00 58 58 64 A3 00 00 00 00 58 58 64 A3 00 00 00 00 8B EC 83 C4 F4 83 C4 0C B8
2C 52 40 00 50 8B E8 50 58 C3
二次加花
push ebp
mov ebp,esp
jmp


UPX 文件头前=NOP
-----------------------------------------------------------------
somewhere:
nop /"胡乱"跳转的开始...
jmp 下一个jmp的地址 /在附近随意跳 这里可以直接跳到程序的OEP
jmp ... /...
jmp 原入口的地址 /跳到原始oep
---
push ebp
mov ebp,esp
push -1
push 111111
push 222222
mov eax,dword ptr fs:
push eax
mov dword ptr fs:,esp
add esp,-6C
push ebx
push esi
push edi
push ebp
mov ebp,esp
inc ecx
push edx
nop
pop edx
dec ecx
pop ebp
inc ecx
loop 往上跳

nop
jmp 入口点


新入口点加1 vmprotect转存 北斗2.3加壳
-----------------------------------------------------------------
eb 01 3次
nop
jmp 入口


3 nop

C4


PUSH EBP
MOV EBP,ESP
PUSH -1
PUSH 416698 0
PUSH 413D3C 0
MOV EAX,DWORD PTR FS:
PUSH EAX
MOV DWORD PTR FS:,ESP
SUB ESP,68
PUSH EBX
PUSH ESI
PUSH EDI
XOR EBX,EBX
PUSH 2
ADD ESP,0C
POP EBX
ADD ESP,68
POP DWORD PTR FS:
ADD ESP,0C
POP EBP
JMP 入口


PUSH EBP
MOV EBP,ESP
PUSH -1
PUSH 414895 0
PUSH 403678 0
MOV EAX,DWORD PTR FS:
PUSH EAX
MOV DWORD PTR FS:,ESP
ADD ESP,-6C
PUSH EBX
PUSH ESI
PUSH EDI
ADD BYTE PTR DS:,AL
JO SHORT 入口
JNO SHORT 入口
CALL 0045687D


B1 01 mov cl,1
2C 90 sub al,90
95 xchg eax,ebp
4D dec ebp
65:42 inc edx
40 inc eax
20C4 and ah,al
8350 06 6E adc dword ptr ds:,6E
226A E4 and ch,byte ptr ds:
E8 B15FBC5B call 入口点


55 push ebp
8BEC mov ebp,esp
51 push ecx
53 push ebx
8BD8 mov ebx,eax
8BC3 mov eax,ebx
04 9F add al,9F
2C 1A sub al,1A
73 03 jnb 入口点


ADD BYTE PTR DS:,AL


push ebp
mov ebp,esp
inc ecx
push edx
nop
pop edx
dec ecx
pop ebp
inc ecx
call 原入口点
call 原入口点
retn


NOP
PUSH EDX
MOV EDX,ESP
POP EDX
ADD EDI,90
NOP
JMP ‘下一个地址,即 ADD EDI,-90’
ADD EDI,-90
NOP
PUSHAD
NOP
POPAD
NOP
LOOPD ‘PUSHAD的上一个地址,即NOP’
NOP
jmp 入口
NOP
(对吧?)


push ebp
pop ebp
mov cl, 1
sub al, 90
xchg eax, ebp
dec ebp
inc edx
inc eax
and ah, al
adc dword ptr , 6E
and ch,
nop
nop
nop
nop
call 004A1E48


nop
nop
nop
nop
push ebp
nop
nop
pop ebp
inc ecx
nop
mov dword ptr fs:,esp
nop
push edx
nop
pop edx
inc ecx
nop
add esp,-0C
nop
add esp,0C
nop
mov dword ptr fs:,esp
sub esp, 68
push ebx
push esi
push edi
pop eax
pop eax
pop eax
add esp, 68
mov eax, 原入口
push eax
retn


新花指令收集
00881000 > 50 PUSH EAX
00881001 58 POP EAX
00881002 90 NOP
00881003 8BEC MOV EBP,ESP
00881005 6A FF PUSH -1
00881007 68 11111100 PUSH 111111
0088100C 68 22222200 PUSH 222222
00881011 64:A1 00000000 MOV EAX,DWORD PTR FS:
00881017 50 PUSH EAX
00881018 64:8925 0000000>MOV DWORD PTR FS:,ESP
0088101F 58 POP EAX
00881020 64:A3 00000000 MOV DWORD PTR FS:,EAX
00881026 58 POP EAX
00881027 58 POP EAX
00881028 58 POP EAX
00881029 58 POP EAX
0088102A 8BE8 MOV EBP,EAX
0088102C B8 34A64000 MOV EAX,40A634
00881031 50 PUSH EAX
00881032 C3 RETN
00881033 90 NOP

50 58 90 8B EC 6A FF 68 11 11 11 00 68 22 22 22 00 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 58 64 A3 00 00 00 00 58 58 58 58 8B E8 B8 34 A6 40 00 50 C3 90


00881000 > 93 XCHG EAX,EBX ; getkey.<模块入口点>
00881001 8BEC MOV EBP,ESP
00881003 6A FF PUSH -1
00881005 68 2A2C0A00 PUSH 0A2C2A
0088100A 68 38900D00 PUSH 0D9038
0088100F 64:A1 00000000 MOV EAX,DWORD PTR FS:
00881015 50 PUSH EAX
00881016 64:8925 0000000>MOV DWORD PTR FS:,ESP
0088101D 58 POP EAX
0088101E 64:A3 00000000 MOV DWORD PTR FS:,EAX
00881024 58 POP EAX
00881025 58 POP EAX
00881026 58 POP EAX
00881027 58 POP EAX
00881028 8BE8 MOV EBP,EAX
0088102A B8 34A64000 MOV EAX,40A634
0088102F FFE0 JMP EAX
00881031 90 NOP

93 8B EC 6A FF 68 2A 2C 0A 00 68 38 90 0D 00 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 58 64 A3 00 00 00 00 58 58 58 58 8B E8 B8 34 A6 40 00 FF E0 90


00881000 > 50 PUSH EAX
00881001 58 POP EAX
00881002 8BEC MOV EBP,ESP
00881004 6A FF PUSH -1
00881006 68 48544100 PUSH 415448
0088100B 68 A8214000 PUSH 4021A8
00881010 64:A1 00000000 MOV EAX,DWORD PTR FS:
00881016 50 PUSH EAX
00881017 64:8925 0000000>MOV DWORD PTR FS:,ESP
0088101E 83C4 94 ADD ESP,-6C
00881021 53 PUSH EBX
00881022 56 PUSH ESI
00881023 57 PUSH EDI
00881024 0000 ADD BYTE PTR DS:,AL
00881026 B8 34A64000 MOV EAX,40A634
0088102B FFE0 JMP EAX
0088102D 90 NOP

50 58 8B EC 6A FF 68 48 54 41 00 68 A8 21 40 00 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 C4 94 53 56 57 00 00 B8 34 A6 40 00 FF E0 90



00881000 > 93 XCHG EAX,EBX ; getkey.<模块入口点>
00881001 8BEC MOV EBP,ESP
00881003 6A FF PUSH -1
00881005 68 00000000 PUSH 0
0088100A 68 00000000 PUSH 0
0088100F 64:A1 00000000 MOV EAX,DWORD PTR FS:
00881015 50 PUSH EAX
00881016 64:8925 0000000>MOV DWORD PTR FS:,ESP
0088101D 83EC 68 SUB ESP,68
00881020 53 PUSH EBX
00881021 56 PUSH ESI
00881022 57 PUSH EDI
00881023 58 POP EAX
00881024 58 POP EAX
00881025 58 POP EAX
00881026 83C4 68 ADD ESP,68
00881029 58 POP EAX
0088102A 67:64:A3 0000 MOV DWORD PTR FS:,EAX
0088102F 58 POP EAX
00881030 58 POP EAX
00881031 58 POP EAX
00881032 58 POP EAX
00881033 8BE8 MOV EBP,EAX
00881035 B8 34A64000 MOV EAX,40A634
0088103A FFE0 JMP EAX
0088103C 90 NOP

93 8B EC 6A FF 68 00 00 00 00 68 00 00 00 00 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 68 53 56 57 58 58 58 83 C4 68 58 67 64 A3 00 00 58 58 58 58 8B E8 B8 34 A6 40 00 FF E0 90


00881000 > 90 NOP
00881001 93 XCHG EAX,EBX
00881002 90 NOP
00881003 93 XCHG EAX,EBX
00881004 90 NOP
00881005 90 NOP
00881006 90 NOP
00881007 50 PUSH EAX
00881008 90 NOP
00881009 58 POP EAX
0088100A 90 NOP
0088100B 90 NOP
0088100C 90 NOP
0088100D 90 NOP
0088100E 90 NOP
0088100F 90 NOP
00881010 55 PUSH EBP
00881011 8BEC MOV EBP,ESP
00881013 83C4 F4 ADD ESP,-0C
00881016 83C4 0C ADD ESP,0C
00881019 B8 34A64000 MOV EAX,40A634
0088101E 50 PUSH EAX
0088101F C3 RETN

90 93 90 93 90 90 90 50 90 58 90 90 90 90 90 90 55 8B EC 83 C4 F4 83 C4 0C B8 34 A6 40 00 50 C3


00881000 > 90 NOP
00881001 90 NOP
00881002 50 PUSH EAX
00881003 90 NOP
00881004 58 POP EAX
00881005 90 NOP
00881006 90 NOP
00881007 93 XCHG EAX,EBX
00881008 90 NOP
00881009 90 NOP
0088100A 93 XCHG EAX,EBX
0088100B 90 NOP
0088100C 90 NOP
0088100D 90 NOP
0088100E 90 NOP
0088100F 90 NOP
00881010 55 PUSH EBP
00881011 8BEC MOV EBP,ESP
00881013 41 INC ECX
00881014 52 PUSH EDX
00881015 90 NOP
00881016 5A POP EDX
00881017 49 DEC ECX
00881018 5D POP EBP
00881019 41 INC ECX
0088101A B8 34A64000 MOV EAX,40A634
0088101F FFE0 JMP EAX
00881021 90 NOP
00881022 90 NOP


90 90 50 90 58 90 90 93 90 90 93 90 90 90 90 90 55 8B EC 41 52 90 5A 49 5D 41 B8 34 A6 40 00 FF E0 90 90


somewhere:
nop /"胡乱"跳转的开始...
jmp 下一个jmp的地址 /在附近随意跳 这里可以直接跳到程序的OEP
jmp ... /...
jmp 原入口的地址 /跳到原始oep
---
push ebp
mov ebp,esp
push -1
push 111111
push 222222
mov eax,dword ptr fs:
push eax
mov dword ptr fs:,esp
add esp,-6C
push ebx
push esi
push edi
push ebp
mov ebp,esp
inc ecx
push edx
nop
pop edx
dec ecx
pop ebp
inc ecx
loop 往上跳


转储加北斗
PUSHAD
ADD EAX,EAX
ADD EAX,EAX
PUSH ECX
PUSH ECX
PUSH EDX
PUSH EAX
PUSH ECX
PUSH EBX
PUSH ECX
PUSH EDX
PUSH EDX
AND EAX,EAX
POP EBX
POP EAX
POP EDX
ADD EAX,EAX
POP ECX
POP EAX
POP EDX
POP EBX
POP EAX
POP EDX
POPAD
CALL 004C4000
RETN

00 00 00 00 00 00 60 03 C0 03 C0 90 03 C0 90 51 51 52 50 51 53 51 52 52 21 C0 5B 58 5A 03 C0 59
58 5A 5B 58 5A 61 E8 4F F7 FF FF C3 00 00 00 00 00 00 00 00 00 00 00 00
************************************************************************

[ 本帖最后由 deletex 于 2007-4-1 18:07 编辑 ]

xiajuncool 发表于 2007-2-22 16:15:04

花指令有自动去除软件的索~

deletex 发表于 2007-2-22 20:16:41

原帖由 windale 于 2007-2-27 00:59 发表 https://www.chinapyg.com/images/common/back.gif
什么叫做花指令?


本文作者:sodme
本文出处:http://blog.csdn.net/sodme
声明:本文可以不经作者同意任意转载、复制、引用。但任何对本文的引用,均须注明本文的作者、出处以及本行声明信息。

可能很多人都听说过花指令,但限于平时的开发所限,可能较少接触到。日前,跟同事讨论了一些有关花指令的问题,现将自己的体会总结一下。

这篇文章将讨论以下问题:

一、什么是花指令?它的原理是什么?
二、在什么地方使用花指令?如何使用花指令?
三、如何识别花指令?如何去除花指令?
四、一些典型的花指令实例

什么是花指令?当然不是"flower code",呵呵,实际上,把它按照“乱指令”来理解可能更贴切一些,它的真正英文名应该叫"thunkcode"吧(不确定,呵呵)。我们知道,汇编语言其实就是机器指令的符号化,从某种程度上看,它只是更容易理解一点的机器指令而已。每一条汇编语句,在汇编时,都会根据cpu特定的指令符号表将汇编指令翻译成二进制代码。而日常应用中,我们通过VC的IDE或其它如OD等反汇编、反编译软件也可以将一个二进制程序反汇编成汇编代码。机器的一般格式为:指令+数据。而反汇编的大致过程是:首先会确定指令开始的首地址,然后根据这个指令字判断是哪个汇编语句,然后再将后面的数据反汇编出来。由此,我们可以看到,在这一步的反汇编过程中存在漏洞:如果有人故意将错误的机器指令放在了错误的位置,那反汇编时,就有可能连同后面的数据一起错误地反汇编出来,这样,我们看到的就可能是一个错误的反汇编代码。这就是“花指令”,简而言之,花指令是利用了反汇编时单纯根据机器指令字来决定反汇编结果的漏洞。

先举个例子(记为A代码段):
   jz    label
   jnzlabel
   db thunkcode
label:

以上是一个相当简单的花指令块,其中thunkcode是由应用者自己随便写的机器指令字,当然,你写的这个机器指令字不能是单字节指令(比如nop, clr,等),否则,你的花指字就相当于白加了。那么,你要如何来使用这段代码呢?

假设我们待加密的代码块如下(记为B代码段):
   mov ax, 8
   xor ax, 77
   ...

我们假设这B代码段是我们的加密算法所在的代码段,现在我们想要对B代码段进行保护,可以直接将A花指令块加到mov指令之前,形如:
   jz    label
   jnzlabel
   db thunkcode
label:
   mov ax, 8
   xor ax, 77
   ...

其中,对于thunkcode,在实际使用时,可以使用任何一个多字节指令的机器指令字来代替,这样就会欺骗反汇编软件将它连同后面的mov指令的前边某一部分反汇编成一个多字节指令。这样,我们的目的也就达到了。

由上可以看到,使用了花指令的地方,一般都会出现这样的现象:一个跳转指令,跳转到了某条语句的中间位置,而不是这条语句的开始位置。每当出现这种情况时,我们就可以断定,这里出现了花指令。

显然地,破解它的办法,就是在那个跳转到的目的地址之前将中间的代码全部nop掉。

当然,为了加强难度,我们可以将若干个花指令结合起来使用。比如:
   jz    label
   jnzlabel
   db thunkcode
label:
   jz    label2
   jnzlabel2
   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
   dbthunkcode,thunkcode
   jmplabel_4
label_1:
   popeax
   jmplabel_2
   dbthunkcode,thunkcode
label_2:
   addeax,2
   jmplabel_3
   dbthunkcode
label_3:
   push eax
   ret
   dbthunkcode
label_4: ....

为了加强难度,尽可能地用call和push实现间接跳转,当然,矛矛盾盾,只是时间长点而已,世上没有绝对安全的系统。
<以上代码来源于看雪的"软件加密技术内幕"一书>


[ 本帖最后由 deletex 于 2007-3-17 11:42 编辑 ]

情天下雪 发表于 2007-2-22 20:56:35

原帖由 deletex 于 2007-2-22 20:16 发表
怎么都没人顶下......

只好自己来

这里不是乱来的地方,发这东西没用,PYG以破解为主,花指令只是免杀的,下次注意了

11度 发表于 2007-2-22 20:59:05

晕倒,没有一个看的懂的,怎么办????????????

roc_guo 发表于 2007-2-22 21:54:49

没有一个看的懂的!!

tbs1956 发表于 2007-2-23 13:11:19

楼主发的什么啊,看不懂呀.

zhf3293 发表于 2007-2-23 20:43:14

新手来学习学习。

yzxyz68 发表于 2007-2-24 05:38:37

我来学习;)

fizz 发表于 2007-2-25 17:19:41

很容易看懂,其实就是走了一下巧
页: [1] 2 3 4 5
查看完整版本: 常用花指令大全