写花指令必备的汇编指令总结

来源:互联网 发布:极限脱出 知乎 编辑:程序博客网 时间:2024/05/22 00:37
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--------等于转移

jNE-------不等于时转移


JZ---------等于转移

JNZ--------不等于时转移


JB---------小于转移

JNB--------大于或等于转移


JA---------不小于或不等于时转移

JNA--------小于或等于转移


JG--------大于转移

JNG-------小于或等于转移


JC-------有进位时转移

JNC------无进位时转移


JP------奇偶性为偶数时转移

JNP-----奇偶性为奇数时转移


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 调用子程序

=================
je   若相等则跳
jne 若不相等则跳

jz 若相等则跳

jnz 若不相等则跳

jb 若相等则跳

jnb 若不相等则跳

jmp 无条件跳

=================
jb 若小于则跳
ja 若大于则跳
jg 若大于则跳
jge 若大于等于则跳
jl 若小于则跳
jle 若小于等于则跳
pop 出栈
push 压栈

 

加花方法

加花的方法:
1.去头加花,又分为直接去头.头前加花.头后加花。
2.加区加花.

修改方法

1.去除法
2.替换法
3.添加法
4.跳转法
5.移位法

 

 

特征码修改的几种方法.

这里,我们就介绍几种常见的修改办法。

1. 大小写替换法(可识别的字符.当然 函数表是除外的)

2. 加1减1法

3. 用 00 填充

4. 跳转法 (把特征码用 汇编语言跳到空白区域)

5. 上下代码互换.

6. 改相等含义的代码.

最近我一直在研究免杀,加壳是可以的,但是很麻烦还容易掉.

这里给大家我最近 免杀的经验

加花方法:

1.直接加花

记住入口点---找零区域---NOP填充---记住新入口点---编写花指令跳转回原入口点---保存文件--- lordPE修改新入口点

2.去头加花

首先我们配置一个无壳的服务端,然后用OD载入后记下从入口点地址开始往下选择几处然后复制,再NOP掉,然后找到空白区域,写一些比如跳转的花指令代码后再把NOP掉的写上,再跳转回刚刚NOP掉的入口点下面的代码地址。


3.加多重花

首先我们配置一个无壳的服务端,然后用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+FFFB4000>

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

 

原创粉丝点击