花指令
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
花指令
用途:抵御静态反汇编。
原理:
数据与代码的区分、指令本身的不等长。
使用无用字节干扰反汇编器对指令起始位置的判断。
方法:
1.寄存器介绍:
(1).数据寄存器: 存放数据EAX、EBX、ECX、EDX
(2).指针寄存器: 主要用途就是在存储器寻址时,提供偏移地址.ESP、EBP、EDI、ESI
ESP(堆栈指针寄存):以“后进先出”方式工作的一个存储区,它必须存在于堆栈段中.
EBP(基址指针寄存器):内存放一个指针,该指针指向系统栈最上面一个栈帧的底部。
ESI(源变址寄存器):内存操作指令中作为“源地址指针”使用。
EDI(目的变址寄存器):内存操作指令中作为“目的地址指针”使用。
2.数据传输指令:
MOV-------传送字或字节
PUSH------把字压入堆栈
POP-------把字弹出堆栈
PUSHA-----把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA------把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD----把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD-----把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
3.算术运算指令:
ADD-------加法.
SUB-------减法.
INC-------加 1
DEC-------减 1
MUL-------无符号乘法
DIV-------无符号除法
4.逻辑运算指令
AND------与运算
OR-------或运算
XOR------异或运算
NOT------取反
5.无条件转移指令
JMP--------无条件转移指令
CALL-------过程调用
RET/RETF---过程返回
6.条件转移指令
JE--------等于转移(Jump if Equal)
JNE-------不等于时转移(Jump if Not Equal)
JZ--------等于转移(Jump if Zero)
JNZ-------不等于时转移(Jump if Not Zero)
JB--------小于转移(Jump if Below)
JNB-------大于或等于转移(Jump if Not Below)
JA--------大于时转移(Jump if Above)
JNA-------小于或等于转移(Jump if Above)
JG--------大于转移(Jump if Greater)
JNG-------小于或等于转移(Jump if Not Greater)
JC--------有进位时转移(Jump if Carry)
JNC-------无进位时转移(Jump if Not Carry)
JP--------奇偶性为偶数时转移(Jump if Parity)
JNP-------奇偶性为奇数时转移(Jump if Not Parity)
7.其它
nop-----在汇编中代表空指令,不执行任何代码.
Mov edi,edi-----效果与nop一样.
注:编写花指令,可参考以下成双指令,可任意自由组合.达到免杀效果.
push ebp
pop ebp
push eax
pop eax
push esp
pop esp
push 0
push 0
push 10 -------其中数字可以任意,注意与下面对应
push -10
nop -------可任意在中间添加
与它等效的:
mov EDI,EDI
add esp,1 -------其中数字可以任意,注意以下面对应
add esp,-1
add esp,1 -------其中数字可以任意,注意以下面对应
sub esp,1
inc ecx
dec ecx
sub eax, -2 --------其中数字可任意,与dec的个数对应
dec eax
dec eax
add eax -2 --------其中数字可任意,与inc的个数对应
inc eax
inc eax
sub eax,5
--------其中数字可以任意,注意以下面对应
add eax,3
add eax,2
jmp 下一个jmp地址
jmp 下一个地址
push ebp
mov ebp,esp ------可做为花指令的开头句
jmp 入口地址 ------跳到程序入口地址
与它效果一样的还有(以下三个):
push 入口地址
retn
jb 入口地址
jnb 入口地址
mov eax,入口地址
jmp eax
手动编写例子
push ebp
mov ebp,esp
sub eax,-2
dec eax
dec eax
sub eax,5
add eax,3
add eax,2
add esp,0B
add esp,-0B
jb 原入口点
jnb 原入口点
花指令的变形技巧.
cmp a,b ;比较a与b
mov a,b ;把b的值送给a
ret 返回主程序
nop ;无作用
call 调用子程序
加花方法
加花的方法:
1.去头加花,又分为直接去头.头前加花.头后加花。
2.加区加花.
修改方法
1.去除法
2.替换法
3.添加法
4.跳转法
5.移位法
特征码修改的几种方法.这里我们就介绍几种常见的修改办法。
1. 大小写替换法.(可识别的字符.当然函数表是除外的)
2. 加1减1法.
3. 用00填充.
4. 跳转法.(把特征码用汇编语言跳到空白区域)
5. 上下代码互换.
6. 改相等含义的代码.
加花方法:
1.直接加花
1)记住入口点
2)找零区域
3)NOP填充
4)记住新入口点
5)编写花指令跳转回原入口点
6)保存文件
7)lordPE修改新入口点
2.去头加花
1)配置一个无壳的服务端
2)用OD载入后记下从入口点地址
3)入口点地址往下选择几处然后复制再NOP掉
4)找到空白区域,写一些比如跳转的花指令代码后再把NOP掉的写上
5)再跳转回刚刚NOP掉的入口点下面的代码地址
3.加多重花
1)配置一个无壳的服务端
2)用OD载入后记下入口点地址然后找到几处空白地址,当然这个大家可以找多处。我这里提供的是给大家一个思路,我就找了2处空白地址。然后我们首先记下第一处空白地址。这个我们记下是新的空白地址,然后第2处空白地址我们记下为跳转2 。最后我们跳到入口点。然后用lordPE修改入口点,至此一个加多重花的服务端就完成了。简单明了就是经过多处零区域的跳转。
4.加区加花
首先通过加区段工具给无壳的服务端加一个区段。区段名子随便填写,比如hacker,大小一般填写在50-200 就好了。然后我们用LORDPE打开首先记下入口点。然后选择区段记下新添加的HACKER区段的入口点。因为我们要写花指令,所以我们在入口点设置为HACKER区段的比入口点稍微大点的地址。然后我们在写花指令。通常找不到零区域的时候就可以加区段。
实际物理地址(OD载入的入口点)= 内存地址(0000F000)+镜象基址(RVA)
5.壳中加花
用加壳工具(如ASPACK壳)给服务端先加一层壳,然后在加花指令。事先记好入口点
7.壳中加区加
花
加壳---加区段---加花指令 综合了以上所有方法。
收集花指令一:
往回跳转0040639B 00 db 00
xxxxxx: nop /
/|/ POP EAX |看了,其实这两部分就是花指令
| POP EAX |
| POP EAX /
| JMP yyyyyy (跳回旧入口点:406046)
| PUSH EBP 004063AA <-新入口点:
| MOV EBP,ESP
| INC ECX
| PUSH EDX
| NOP
| POP EDX
| DEC ECX
| POP EBP
| INC ECX
| MOV DWORD PTR FS:[0],EAX /
| POP EAX |
| POP EAX /
| MOV DWORD PTR FS:[0],EAX |(注意了。。花指令)
| POP EAX /
| POP EAX |
| MOV DWORD PTR FS:[0],EAX /
| loop xxxxxx
>>>>>>>>>>>>>>>>>>>>>>>>>>>.
2。C++的花指令
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 跳转到程序原来入口点
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3。VC++ 5.0
push ebp
mov ebp,esp
push -1
push 515448
push 6021A8
mov eax,dword ptr fs:[0]
push eax
mov dword ptr fs:[0],esp
add esp,-6c
push ebx
push esi
push edi
jmp 跳转到程序原来的入口点
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
跳转
somewhere:
nop /"胡乱"跳转的开始...
jmp 下一个jmp的地址 /在附近随意跳
jmp ... /...
jmp 原入口的地址 /跳到原始oep
--------------------------------------------------
新入口: push ebp
mov ebp,esp
inc ecx
push edx
nop
pop edx
dec ecx
pop ebp
inc ecx
loop somewhere /跳转到上面那段代码地址去!
跳转花指令 加在c++的后面,多跳几次过卡巴是最容易的了,呵呵
算是一个小窍门吧
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1。 VC++ 5.0
PUSH EBP
MOV EBP,ESP
PUSH -1
push 515448
PUSH 6021A8
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
ADD ESP,-6C
PUSH EBX
PUSH ESI
PUSH EDI
jmp 跳转到程序原来的入口点
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2。c ++
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 跳转到程序
原来的入口点
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
3。跳转
somewhere:
nop /"胡乱"跳转的开始...
jmp 下一个jmp的地址 /在附近随意跳
jmp ... /...
jmp 原入口的地址 /跳到原始oep
--------------------------------------------------
新入口: push ebp
mov ebp,esp
inc ecx
push edx
nop
pop edx
dec ecx
pop ebp
inc ecx
loop somewhere /跳转到上面那段代码地址去!
jmp somewhere
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4。Microsoft Visual C++ 6.0
push ebp
mov ebp,esp
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
mov eax,403D7D
push eax
retn
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
push ebp
mov ebp,esp
push -1
push 00411222
push 00411544
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 ptr ds:[eax],al
jo 入口
jno 入口
call 下一地址
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7.
push ebp
nop
nop
mov ebp,esp
inc ecx
nop
push edx
nop
nop
pop edx
nop
pop ebp
inc ecx
loop 任意地址
nop
nop
———————————————
nop
nop
jmp 下一个jmp的地址 /在附近随意跳
nop
jmp 下一个jmp的地址 /在附近随意跳
nop
jmp 下一个jmp的地址 /在附近随意跳
jmp 入口
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
PUSH EBP
MOV EBP,ESP
nop
nop
PUSH -1
nop
nop
push 515448
nop
nop
PUSH 6021A8
nop
nop
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
nop
nop
MOV EAX,DWORD PTR FS:[1]
PUSH EAX
MOV DWORD PTR FS:[1],ESP
nop
nop
MOV EAX,DWORD PTR FS:[2]
PUSH EAX
MOV DWORD PTR FS:[2],ESP
nop
nop
mov eax,fs:[0]
push eax
mov fs:[0],esp
nop
nop
inc ecx
push eax
pop eax
push edx
nop
pop edx
dec ecx
pop ebp
inc ecx
nop
nop
ADD ESP,-6C
PUSH EBX
PUSH ESI
PUSH EDI
jmp 跳转到程序原来的入口点
/////////////////////////////////////////////////////////////////
UPX 花指令
pushad
mov esi,m.0044D000
lea edi,dword ptr ds:[esi+FFFB4000]
push edi
or ebp,FFFFFFFF
jmp short m.00477F2A
00477F00 m> 60 pushad
00477F01 > BE 00D04400 mov esi,m.0044D000
00477F06 . 8DBE 0040FBFF lea edi,dword ptr ds:[esi+FF
FB4000>
00477F16 . 57 push edi
00477F17 . 83CD FF or ebp,FFFFFFFF
00477F1A . EB 0E jmp short m.00477F2A
花指令 收集2
全代码:
代码如下:神话
nop
nop
nop
mov ebp,esp
push -1
push 111111
push 222222
mov eax,dword ptr fs:[0]
push eax
mov dword ptr fs:[0],esp
pop eax
mov dword ptr fs:[0],eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
mov eax,原入口
push eax
retn
代码如下: 无极
nop
mov ebp, esp
push -1
push 0A2C2A
push 0D9038
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
mov eax, 原入口
jmp eax
代码如下: 金刚
nop
nop
mov ebp, esp
push -1
push 415448
push 4021A8
mov eax, fs:[0]
push eax
mov fs:[0], esp
add esp, -6C
push ebx
push esi
push edi
add [eax], al
mov eax,原入口
jmp eax
代码如下: 杀破浪
nop
mov ebp, esp
push -1
push 0
push 0
mov eax, fs:[0]
push eax
mov fs:[0], esp
sub esp, 68
push ebx
push esi
push edi
pop eax
pop eax
pop eax
add esp, 68
pop eax
mov fs:[0], eax
pop eax
pop eax
pop eax
pop eax
mov ebp, eax
mov eax, 原入口
jmp eax
代码如下: 痴情大圣
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
push ebp
mov ebp, esp
add esp, -0C
add esp, 0C
mov eax, 原入口
push eax
retn
代码如下: 如果*爱
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
push ebp
mov ebp, esp
inc ecx
push edx
nop
pop edx
dec ecx
pop ebp
inc ecx
mov eax, 原入口
jmp eax
///////////////////////////////////////////////