看到看雪老大置顶的本月话题,把以前写的一个东西贴出来,希望能对大家有帮助
可以用于病毒,也可以用于壳
;.386
;.model flat, stdcall ;32 bit memory model
;option casemap :none ;case sensitive
.code
lbl_PolyStart: ;异常指令表
SEHOpCode:
SEHInt1 db 0CDh,01h ;int 1
SEHDiv0 db 33h,0C9h,0F7h,0F1h ;xor ecx,ecx div ecx
;单字节指令可变动表(2)
OneByteOpCode db 40h,48h ;inc regxx,dec regxx
;单字节指令固定表(4)
OneByte db 0F8h,0FCh,0F5h,0F9h ;clc,cld,cmc,stc
;双字节指令可变动表(9)
TwoByteOpCode dw 08BC0h ;mov regxx,regxx
dw 033C0h ;xor regxx,regxx
dw 003C0h ;add regxx,regxx
dw 02BC0h ;sub regxx,regxx
dw 021C0h ;and regxx,regxx
dw 085C0h ;test regxx,regxx
dw 03BC0h ;cmp regxx,regxx
dw 009C0h ;or regxx,regxx
dw 011C0h ;adc regxx
;双字节固定表(2)
TwoByte dw 0D40Ah,0D50Ah ;aam,aad ;六字节指令变动表(8)
SixByteOpCode dw 0C7C0h,081F0h,081E0h,081C8h ;mov regxx,xxx xor regxx,xxx and regxx,xxx or regxx,xxx
dw 0F7C0h,081F8h,081C0h,081E8h ;test regxx,xxx cmp regxx,xxx add regxx,xxx sub regxx,xxx
;花指令表(9)
RandOpCode db 70h,7Ah,72h,76h,7Eh,78h,7Ch,0EBh,0E8h
;jo,jno jp,jnp jb,jnb ja,jna jng,jg js,jns jl,jnl,jmp,call
;随机表(5)
RandomTable dd offset OneByteOpCode,offset OneByte
dd offset TwoByteOpCode,offset TwoByte
dd offset SixByteOpCode
Reg_StartAddress dd 0
Reg_Length dd 0
OP_MOV equ 0B8h
OP_XOR equ 313400h
Randx dd 0 pushall macro
push eax
push ecx
push edx
push ebx
push esi
endm
popall macro
pop esi
pop ebx
pop edx
pop ecx
pop eax
endm ;计算CRC32,Esi为首地址,Edi为长度
;Eax返回CRC32值
CRC32 proc uses esi edi Buf:dword,nLength:dword
push ecx ;procedure for calculating CRC32s
push edx ;at run-time
push ebx
mov esi,Buf
mov edi,nLength
xor ecx,ecx
dec ecx
mov edx,ecx
NextByteCRC:
xor eax,eax
xor ebx,ebx
lodsb
xor al,cl
mov cl,ch
mov ch,dl
mov dl,dh
mov dh,8
NextBitCRC:
shr bx,1
rcr ax,1
jnc NoCRC
xor ax,08320h
xor bx,0EDB8h
NoCRC: dec dh
jnz NextBitCRC
xor ecx,eax
xor edx,ebx
dec edi
jne NextByteCRC
not edx
not ecx
pop ebx
mov eax,edx
rol eax,16
mov ax,cx
pop edx
pop ecx
ret
CRC32 endp
;Eax返回0---dwNumber-1之间的随机数
RandSeed dd 0
Randomize proc
pushad
call PolyStart
PolyStart:
pop esi
sub esi,offset PolyStart ;重定位
db 0fh,31h
add eax,edx
mov dword ptr RandSeed[esi],eax
popad
ret
Randomize endp
Random proc uses edx ecx dwNumber:dword
call PolyStart
PolyStart:
pop esi
sub esi,offset PolyStart ;重定位
mov eax,RandSeed[esi]
mov ecx,41C64E6Dh
mul ecx
add eax,3039h
mov RandSeed[esi],eax
xor edx,edx
div dwNumber
xchg eax,edx
ret
Random endp
RandomReg proc dwNumber:dword
call PolyStart
PolyStart:
pop esi
sub esi,offset PolyStart ;重定位
Rep8:
push dwNumber
call Random
cmp eax,4 ;保护Esp寄存器
jz Rep8
cmp eax,5 ;保护ebp寄存器 (ebp在程序为存取变量)
jz Rep8
cmp eax,Reg_StartAddress[esi]
jz Rep8
cmp eax,Reg_Length[esi]
jz Rep8
ret
RandomReg endp ;1字节可变垃圾指令处理
;Ecx为要产生的垃圾指令的条数
Sub_OneByteOpCode proc
pushall
push 2
call Random ;随机选取指令inc,dec...
lea ebx,OneByteOpCode[esi+eax] ;取得1字节可变垃圾指令的相应地址
movzx edx,byte ptr [ebx] ;取得1字节可变垃圾指令
push edx
Rep9:
push 8
call RandomReg ;随机选取寄存器eax,ecx,edx...
cmp eax,Reg_Length[esi]
jz Rep9
cmp eax,Reg_StartAddress[esi]
jz Rep9
pop edx ;保护代码起始地址和代码长度已经选取的寄存器
add dl,al
mov byte ptr [edi],dl
inc edi
popall
ret
Sub_OneByteOpCode endp
;1字节固定垃圾指令处理
Sub_OneByte proc
pushall
push 4
call Random ;随机选取指令aaa,aas,clc...
lea ebx,OneByte[esi+eax] ;取得1字节固定垃圾指令的相应地址
movzx edx,byte ptr [ebx] ;取得1字节固定垃圾指令
mov byte ptr [edi],dl
inc edi
popall
ret
Sub_OneByte endp ;2字节可变垃圾指令处理
Sub_TwoByteOpCode proc
pushall
push 9
call Random
lea ebx,TwoByteOpCode[esi+eax*2]
movzx edx,word ptr [ebx]
push edx ;uses push
Rep10:
push 8
call RandomReg
cmp eax,Reg_Length[esi]
jz Rep10
cmp eax,Reg_StartAddress[esi]
jz Rep10 ;保护代码起始地址和代码长度已经选取的寄存器
mov ebx,eax
Rep11:
push 8
call RandomReg
cmp eax,Reg_Length[esi]
jz Rep11
cmp eax,Reg_StartAddress[esi]
jz Rep11 ;保护代码起始地址和代码长度已经选取的寄存器
mov cl,8 ;uses ecx
mul cl
pop edx
add dl,al
add dl,bl
mov byte ptr [edi],dh
inc edi
mov byte ptr [edi],dl
inc edi
popall
ret
Sub_TwoByteOpCode endp
;2字节固定垃圾指令处理
Sub_TwoByte proc
pushall
push 2
call Random
lea ebx,TwoByte[esi+eax*2]
mov dx,word ptr [ebx]
mov byte ptr[edi],dh
inc edi
mov byte ptr [edi],dl
inc edi
popall
ret
Sub_TwoByte endp
;6字节垃圾指令处理
Sub_SixByteOpCode proc
pushall
push 8
call Random
lea ebx,SixByteOpCode[esi+eax*2]
mov dx,word ptr [ebx]
push edx
Rep12:
push 8
call RandomReg
cmp eax,Reg_Length[esi]
jz Rep12
cmp eax,Reg_StartAddress[esi]
jz Rep12 ;保护代码起始地址和代码长度已经选取的寄存器
pop edx
add dl,al
mov byte ptr [edi],dh
inc edi
mov byte ptr [edi],dl
inc edi
push 600000h
call Random
mov dword ptr [edi],eax
add edi,4
popall
ret
Sub_SixByteOpCode endp ;产生异常块
GenSEHBlock proc ret
GenSEHBlock endp ;产生随机的垃圾指令
GenerateRandOpCode proc
pushall
push 10
call Random ;在每条有效指令之间随机的产生0-9条垃圾指令
inc eax
mov ecx,eax ;uses ecx
Rep13:
push ecx
push 5
call Random ;总共有5种类型的垃圾指令,随机取一种
mov ebx,eax
mov edx,RandomTable[esi+ebx*4]
lea edx,[edx+esi] ;得到垃圾指令表的地址
cmp ebx,0
jz lbl_OneByteOpCode ;转1字节可变垃圾指令处理
cmp ebx,1
jz lbl_OneByte ;转1字节固定垃圾指令处理
cmp ebx,2
jz lbl_TwoByteOpCode ;转2字节可变垃圾指令处理
cmp ebx,3
jz lbl_TwoByte ;转2字节固定垃圾指令处理
jmp lbl_SixByteOpCode ;转6字节垃圾指令处理
lbl_OneByteOpCode:
call Sub_OneByteOpCode
jmp lbl_Next1
lbl_OneByte:
call Sub_OneByte
jmp lbl_Next1
lbl_TwoByteOpCode:
call Sub_TwoByteOpCode
jmp lbl_Next1
lbl_TwoByte:
call Sub_TwoByte
jmp lbl_Next1
lbl_SixByteOpCode:
call Sub_SixByteOpCode
lbl_Next1:
pop ecx
dec ecx
jnz Rep13 ;继续产生垃圾指令
popall
ret
GenerateRandOpCode endp ;填充dwLength2长的随机数据到edi->的缓冲区
FillRandomCode proc dwLength2:dword
pushall
mov ecx,dwLength2 ;uses ecx
Rep14:
push 0FFh
call Random
mov byte ptr [edi],al
inc edi
loop Rep14
popall
ret
FillRandomCode endp ;产生随机的花指令
GFI proc
pushall
push 9
call Random
cmp eax,7
jz lbl_Jmp
cmp eax,8
jz lbl_Call
lea ebx,RandOpCode[esi+eax]
movzx edx,byte ptr [ebx]
mov byte ptr [edi],dl
inc edi
push 5
call Random
add eax,3 ;3-7之间
mov byte ptr [edi],al
inc edi
inc dl
mov byte ptr [edi],dl
inc edi
dec eax
dec eax
mov byte ptr [edi],al
inc edi
push eax
call FillRandomCode
jmp lbl_Exit1
lbl_Jmp:
lea ebx,RandOpCode[esi+eax]
movzx edx,byte ptr [ebx]
mov byte ptr [edi],dl ;E9h->[edi]
inc edi
push 4
call Random
inc eax
inc eax
mov byte ptr [edi],al
inc edi
mov byte ptr [edi],0E8h
inc edi
dec eax
push eax
call FillRandomCode
jmp lbl_Exit1
lbl_Call:
lea ebx,RandOpCode[esi+eax]
movzx edx,byte ptr [ebx]
mov byte ptr [edi],dl ;E8h->[edi]
inc edi
push 4
call Random
inc eax
inc eax
mov dword ptr [edi],eax
add edi,4
mov byte ptr [edi],0E9h
dec eax
push eax
call FillRandomCode
inc edi
push 8
call RandomReg
mov edx,58h ;pop regxx
add edx,eax
mov byte ptr [edi],dl
inc edi
lbl_Exit1:
popall
ret
GFI endp ;随机产生第1部分代码
G1Code proc dwLength1:dword,reg:dword
pushall
mov ebx,dwLength1
push 5
call Random
cmp eax,1
jz lbl_PushPopG1
cmp eax,2
jz lbl_MovXorG1
cmp eax,3
jz lbl_MovNotG1
cmp eax,4
jz lbl_MovRolG1
lbl_MovAddG1:
push 0FFFFFFFFh
call Random
sub ebx,eax
mov edx,0C0C7h ;mov regxx,xxx
mov ecx,reg
add dh,cl
mov word ptr [edi],dx
inc edi
inc edi
mov dword ptr [edi],ebx ;ebx为mov regxx,xxx 里的xxx
add edi,4
call GenerateRandOpCode ;产生垃圾指令
call GFI ;产生花指令
mov edx,0C081h ;add regxx,xxx
mov ecx,reg
add dh,cl
mov word ptr [edi],dx
inc edi
inc edi
mov dword ptr [edi],eax ;eax为add regxx,xxx里的xxx
add edi,4
jmp lbl_Exit2
lbl_PushPopG1:
mov byte ptr [edi],68h ;push xxx
inc edi
mov dword ptr [edi],ebx ;ebx为push xxx里的xxx
add edi,4
call GenerateRandOpCode ;产生垃圾指令
call GFI ;产生花指令
mov edx,58h ;pop regxx
add edx,reg
mov byte ptr [edi],dl
inc edi
jmp lbl_Exit2
lbl_MovXorG1:
push 0FFFFFFFFh
call Random
xor ebx,eax
mov edx,0C0C7h ;mov regxx,xxx
mov ecx,reg
add dh,cl
mov word ptr [edi],dx
inc edi
inc edi
mov dword ptr [edi],ebx ;ebx为mov regxx,xxx 里的xxx
add edi,4
call GenerateRandOpCode ;产生垃圾指令
call GFI ;产生花指令
mov edx,0F081h ;xor regxx,xxx
mov ecx,reg
add dh,cl
mov word ptr [edi],dx
inc edi
inc edi
mov dword ptr [edi],eax ;eax为add regxx,xxx里的xxx
add edi,4
jmp lbl_Exit2
lbl_MovNotG1:
not ebx
mov edx,0C0C7h ;mov regxx,xxx
mov ecx,reg
add dh,cl
mov word ptr [edi],dx
inc edi
inc edi
mov dword ptr [edi],ebx ;ebx为mov regxx,xxx 里的xxx
add edi,4
call GenerateRandOpCode ;产生垃圾指令
call GFI ;产生花指令
mov edx,0D0F7h ;not regxx
mov ecx,reg
add dh,cl
mov word ptr [edi],dx
inc edi
inc edi
jmp lbl_Exit2
lbl_MovRolG1:
push 020h
call Random
mov cl,al
push eax
ror ebx,cl
mov edx,0C0C7h ;mov regxx,xxx
mov eax,reg
add dh,al
mov word ptr [edi],dx
inc edi
inc edi
mov dword ptr [edi],ebx ;ebx为mov regxx,xxx 里的xxx
add edi,4
call GenerateRandOpCode ;产生垃圾指令
call GFI ;产生花指令
mov edx,0C0C1h ;rol regxx,xxx
mov eax,reg
add dh,al
mov word ptr [edi],dx
inc edi
inc edi
pop eax
mov byte ptr [edi],al ;eax为add regxx,xxx里的xxx
inc edi
lbl_Exit2:
popall
ret
G1Code endp ;随机产生第2部分代码
G2Code proc reg:dword
pushall
push 5
call Random
cmp eax,1
jz lbl_PushPopG2
cmp eax,2
jz lbl_MovXorG2
cmp eax,3
jz lbl_MovNotG2
cmp eax,4
jz lbl_MovRolG2
lbl_MovAddG2:
mov G2Selected[esi],0 ;保存第2部分的产生方式
mov edx,0C0C7h ;mov regxx,xxx
mov ebx,reg
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
mov AddressOfCode1[esi],edi ;保存Mov regxx,xxx指令的地址
mov dword ptr [edi],0 ;0为mov regxx,xxx 里的xxx
add edi,4
call GenerateRandOpCode ;产生垃圾指令
call GFI ;产生花指令
mov edx,0C081h ;add regxx,xxx
mov ebx,reg
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
mov AddressOfCode2[esi],edi ;保存add regxx,xxx指令的地址
mov dword ptr [edi],0 ;eax为add regxx,xxx里的xxx
add edi,4
jmp lbl_Exit3
lbl_PushPopG2:
mov G2Selected[esi],1 ;保存第2部分的产生方式 mov byte ptr [edi],68h ;push xxx
inc edi
mov AddressOfCode1[esi],edi ;保存Push xxx指令的地址
mov dword ptr [edi],0 ;为push xxx里的xxx
add edi,4
call GenerateRandOpCode ;产生垃圾指令
call GFI ;产生花指令
mov edx,58h ;pop regxx
add edx,reg
mov byte ptr [edi],dl
inc edi
jmp lbl_Exit3
lbl_MovXorG2:
mov G2Selected[esi],2 ;保存第2部分的产生方式
mov edx,0C0C7h ;mov regxx,xxx
mov ebx,reg
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
mov AddressOfCode1[esi],edi ;保存Mov regxx,xxx指令的地址
mov dword ptr [edi],0 ;0为mov regxx,xxx 里的xxx
add edi,4
call GenerateRandOpCode ;产生垃圾指令
call GFI ;产生花指令
mov edx,0F081h ;xor regxx,xxx
mov ebx,reg
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
mov AddressOfCode2[esi],edi ;保存xor regxx,xxx指令的地址
mov dword ptr [edi],0 ;eax为xor regxx,xxx里的xxx
add edi,4
jmp lbl_Exit3
lbl_MovNotG2:
mov G2Selected[esi],3 ;保存第2部分的产生方式
not ebx
mov edx,0C0C7h ;mov regxx,xxx
mov ebx,reg
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
mov AddressOfCode1[esi],edi
mov dword ptr [edi],0 ;0为mov regxx,xxx 里的xxx
add edi,4
call GenerateRandOpCode ;产生垃圾指令
call GFI ;产生花指令
mov edx,0D0F7h ;not regxx
mov ebx,reg
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
jmp lbl_Exit3
lbl_MovRolG2:
mov G2Selected[esi],4 ;保存第2部分的产生方式
mov edx,0C0C7h ;mov regxx,xxx
mov ebx,reg
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
mov AddressOfCode1[esi],edi ;保存Mov regxx,xxx指令的地址
mov dword ptr [edi],0 ;0为mov regxx,xxx 里的xxx
add edi,4
call GenerateRandOpCode ;产生垃圾指令
call GFI ;产生花指令
mov edx,0C0C1h ;rol regxx,xxx
mov ebx,reg
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
mov AddressOfCode2[esi],edi ;保存Rol regxx,xxx指令的地址
mov byte ptr [edi],0 ;eax为Rol regxx,cl里的regxx
inc edi
lbl_Exit3:
popall
ret
G2Code endp ;随机产生第3部分代码
G3Code proc regOfAddr:dword,key:dword
pushall
push 8 ; 1 2 3 4 5 6 7
call Random ;决定采用的加密方式 -->add sub inc dec not rol ror... 等等
cmp eax,1
jz lbl_AddG3
cmp eax,2
jz lbl_SubG3
cmp eax,3
jz lbl_IncG3
cmp eax,4
jz lbl_DecG3
cmp eax,5
jz lbl_NotG3
; cmp eax,6
; jz lbl_Rol
; cmp eax,7
; jz lbl_Ror
lbl_XorG3:
mov EncryptSelected[esi],0 ;保存加密方式
mov edx,3080h ;Xor byte ptr [regxx],xxx
mov ebx,regOfAddr
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
mov edx,key
mov byte ptr [edi],dl
inc edi
jmp lbl_Exit4
lbl_AddG3:
mov EncryptSelected[esi],1 ;保存加密方式
mov edx,2880h ;Sub byte ptr [regxx],xxx
mov ebx,regOfAddr
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
mov edx,key
mov byte ptr [edi],dl
inc edi jmp lbl_Exit4
lbl_SubG3:
mov EncryptSelected[esi],2 ;保存加密方式
mov edx,0080h ;Add byte ptr [regxx],xxx
mov ebx,regOfAddr
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
mov edx,key
mov byte ptr [edi],dl
inc edi
jmp lbl_Exit4
lbl_IncG3:
mov EncryptSelected[esi],3 ;保存加密方式
mov edx,008FEh ;Dec byte ptr [regxx]
mov ebx,regOfAddr
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
jmp lbl_Exit4
lbl_DecG3:
mov EncryptSelected[esi],4 ;保存加密方式
mov edx,000FEh ;Inc byte ptr [regxx]
mov ebx,regOfAddr
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
jmp lbl_Exit4
lbl_NotG3:
mov EncryptSelected[esi],5 ;保存加密方式
mov edx,010F6h ;Not byte ptr [regxx]
mov ebx,regOfAddr
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
jmp lbl_Exit4
lbl_RolG3:
mov EncryptSelected[esi],6 ;保存加密方式
mov eax,key
xor edx,edx
mov ecx,20h
div ecx
mov cl,dl
mov edx,51h ;push ecx
mov byte ptr [edi],dl
inc edi
push ecx
call GFI
pop ecx
mov edx,0C1C6h ;mov cl,xxx
mov word ptr [edi],dx
inc edi
inc edi
mov byte ptr [edi],cl
inc edi
call GFI
mov edx,008D3h ;ror dword ptr [edi],cl
mov ebx,regOfAddr
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
jmp lbl_Exit4
lbl_RorG3:
mov EncryptSelected[esi],7 ;保存加密方式
mov eax,key
xor edx,edx
mov ecx,20h
div ecx
mov cl,dl
mov edx,51h ;push ecx
mov byte ptr [edi],dl
inc edi
push ecx
call GFI
pop ecx
mov edx,0C1C6h ;mov cl,xxx
mov word ptr [edi],dx
inc edi
inc edi
mov byte ptr [edi],cl
inc edi
call GFI
mov edx,000D3h ;rol dword ptr[regxx],cl
mov ebx,regOfAddr
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
lbl_Exit4:
popall
ret
G3Code endp
pGetModuleCode dd 0
;随机产生第4部分代码
G4Code proc regOfLen:dword,regOfAddr:dword,key:dword,EntryPoint:dword
pushall
rep100:
push 2
call Random
cmp eax,0
jz lbl_DecJge
cmp regOfAddr,1
jz rep100
;push reg00 保护首地址寄存器
;mov ecx,reg11 长度寄存器
;Rep:
;Xor dword ptr [reg00],key
;inc reg00
;Loop Rep
;pop reg00
lbl_Loop:
mov edx,50h ;push regxx
add edx,regOfAddr
mov byte ptr [edi],dl
inc edi
call GenerateRandOpCode ;产生垃圾指令
call GFI ;产生花指令
mov edx,0C88Bh ;mov ecx,regxx
mov ebx,regOfLen
add dh,bl
mov word ptr [edi],dx
inc edi
inc edi
call GFI
push edi
pop edx
push edx ;保存Loop xxx 的循环地址
call GFI
mov byte ptr [edi],51h ;push ecx
inc edi
call GenerateRandOpCode ;产生垃圾指令
call GFI ;产生花指令
push key
push regOfAddr
call G3Code
call GFI ;产生花指令
mov edx,40h ;inc regxx
add edx,regOfAddr
mov byte ptr [edi],dl
inc edi
call GenerateRandOpCode
mov byte ptr [edi],59h ;pop ecx
inc edi
call GFI ;产生花指令
mov edx,0E2h ;Loop xxx
mov byte ptr [edi],dl
;inc edi
inc edi
mov byte ptr [edi],0
inc edi
pop edx
sub edx,edi
mov byte ptr [edi-1],dl
mov edx,58h ;pop regxx
add edx,regOfAddr
mov byte ptr [edi],dl
inc edi
call GFI
; invoke VirtualAlloc,NULL,1000h,MEM_COMMIT,PAGE_EXECUTE_READWRITE
; or eax,eax
; jz lbl_Exit5
; mov pGetModuleCode,eax
call GenerateRandOpCode
call GFI
; push En_ImageBase
; push NewRva
; push edi
; call GenerateGetModule
; mov byte ptr [edi],68h ;Push EntryPoint
; inc edi
; mov edx,EntryPoint
; mov dword ptr [edi],edx
; add edi,4
; call GenerateRandOpCode
; call GFI
; mov byte ptr [edi],0C3h ;Ret
; inc edi
jmp lbl_Exit5
lbl_DecJge:
mov edx,50h ;push regxx
add edx,regOfAddr
mov byte ptr [edi],dl
inc edi
call GenerateRandOpCode ;产生垃圾指令
call GFI ;产生花指令
call GFI ;产生花指令
push edi
pop edx
push edx ;保存Jge xxx 的循环地址
call GFI ;产生花指令
push key
push regOfAddr
call G3Code ;产生解密代码,如Xor,sub,not...等等
call GFI ;产生花指令
mov edx,40h ;inc regxx
add edx,regOfAddr
mov byte ptr [edi],dl
inc edi
call GFI ;产生花指令
mov edx,48h ;Dec regxx
add edx,regOfLen
mov byte ptr [edi],dl
inc edi
call GFI
mov edx,07fh ;Jge xxx
mov byte ptr [edi],dl
inc edi
mov byte ptr [edi],0
inc edi
pop edx ;恢复Jge xxx的xxx
sub edx,edi
mov byte ptr [edi-1],dl
call GenerateRandOpCode
call GFI
; push En_ImageBase
; push NewRva
; push edi
; call GenerateGetModule
call GenerateRandOpCode
call GFI
mov edx,58h ;pop regxx
add edx,regOfAddr
mov byte ptr [edi],dl
inc edi
call GenerateRandOpCode
call GFI
; mov byte ptr [edi],0FFh
; inc edi
; mov edx,0E0h
; add edx,regOfAddr
; mov byte ptr [edi],dl ;Jmp regxx
; inc edi
; call GenerateRandOpCode
; call GFI
; mov byte ptr [edi],68h ;Push EntryPoint
; inc edi
; mov edx,EntryPoint
; mov dword ptr [edi],edx
; add edi,4
; call GenerateRandOpCode
; call GFI
; mov byte ptr [edi],0C3h ;Ret
; inc edi
lbl_Exit5:
popall
ret
G4Code endp ;整个程序的核心(变形引擎)
; 假设解密代码如下:(可分为4部分)
; mov reg00,SizeOfCode 1
; mov reg11,EntryPointOfCode 2
;Rep:
; xor dowrd ptr[reg00+reg11],key 3
; dec reg00 4
; jnz Rep
;为了增强变形引擎的强度可以把上面的代码分解(或叫变换)
;如下:
; 第1部分代码可以有下面5种选择
; mov reg00,SizeOfCode ---> mov reg00,xxx add reg00,xxx 0 (其中reg00为随机选取的寄存器)
; push xxx pop reg00 1
; mov reg00,xxx xor reg00,xxx 2
; mov reg00,xxx not reg00 3
; mov reg00,xxx rol reg00,xx 4
;
; 第2部分同样有5种选择
; mov reg11,EntryPointOfCode也可作同样处理 ; 第3部分有8种选择
; 0
;同理 xor dword ptr [reg00+reg11],key 也可变换如下:
; 1 2 3 4 5 6 7
; -->add sub inc dec not rol ror... 等等
;
; 第4部分有2种选择
; 0 1
; dec reg00 ---> Loop xxx
; jnz xxx
;param Buf 存放变形以后代码的缓冲区
;param StartAddress 欲加密代码的首地址
;param dwLength 欲加密代码的长度
;
EncryptSelected dd 0 ;保存被选择的加密方式
G2Selected dd 0 ;保存第2部分产生的方式
AddressOfCode1 dd 0 ;相应的地址
AddressOfCode2 dd 0
key dd 0
PolyEngine proc Buf:dword,StartAddress:dword,dwLength:dword,VA:dword,EntryPoint:dword
call PolyStart
PolyStart:
pop esi
sub esi,offset PolyStart ;重定位
call Randomize ;初始化随机种子
push 8
call RandomReg
mov dword ptr Reg_Length[esi],eax ;决定代码长度使用的寄存器
Rep0:
push 8
call RandomReg
cmp eax,Reg_Length[esi]
jz Rep0
mov dword ptr Reg_StartAddress[esi],eax ;决定代码起始地址使用的寄存器
mov edi,Buf
push esi
call GenerateRandOpCode ;产生0-9条随机的垃圾指令
pop esi
call GFI ;产生花指令
push esi
push Reg_Length[esi]
push dwLength
call G1Code
pop esi ;产生第1部分代码
call GenerateRandOpCode ;产生0-9条随机的垃圾指令
call GFI ;产生花指令
push esi
push Reg_StartAddress[esi]
call G2Code
pop esi
push esi
push 0FFh
call Random ;取得一个随机的Key
pop esi
mov key[esi],eax
push esi
push EntryPoint ;原程序入口点
push key[esi]
push Reg_StartAddress[esi]
push Reg_Length[esi]
call G4Code
pop esi
mov eax,G2Selected[esi]
push edi ;把Edi保护起来
push ecx
; mov reg00,SizeOfCode ---> mov reg00,xxx add reg00,xxx 0 (其中reg00为随机选取的寄存器)
; push xxx pop reg00 1
; mov reg00,xxx xor reg00,xxx 2
; mov reg00,xxx not reg00 3
; mov reg00,xxx rol reg00,xx 4
;
.if VA != 0
mov edi,VA
.endif
.if eax == 0
push 0FFFFFFFFh
call Random
sub edi,eax
mov ebx,AddressOfCode1[esi]
mov [ebx],edi
mov ebx,AddressOfCode2[esi]
mov [ebx],eax
.elseif eax ==1
mov ebx,AddressOfCode1[esi]
mov [ebx],edi
.elseif eax == 2
push 0FFFFFFFFh
call Random
xor edi,eax
mov ebx,AddressOfCode1[esi]
mov [ebx],edi
mov ebx,AddressOfCode2[esi]
mov [ebx],eax
.elseif eax == 3
not edi
mov ebx,AddressOfCode1[esi]
mov [ebx],edi
.else
push 020h
call Random
mov cl,al
ror edi,cl
mov ebx,AddressOfCode1[esi]
mov [ebx],edi
mov ebx,AddressOfCode2[esi]
mov byte ptr [ebx],cl
.endif
pop ecx
pop edi
;同理 xor dword ptr [reg00+reg11],key 也可变换如下:
; 1 2 3 4 5 6 7
; -->add sub inc dec not rol ror... 等等
mov eax,EncryptSelected[esi]
mov ecx,dwLength ;需加密代码的长度
.if VA == 0
pushad
mov esi,StartAddress
cld
rep movsb
popad
.else
mov edi,StartAddress ;需加密代码的起始地址
.endif
mov edx,key[esi]
.if eax == 0 ;xor
Rep1:
xor byte ptr [edi],dl
inc edi
loop Rep1
.elseif eax == 1 ;add
Rep2:
add byte ptr [edi],dl
inc edi
loop Rep2
.elseif eax == 2 ;sub
Rep3:
sub byte ptr [edi],dl
inc edi
loop Rep3
.elseif eax == 3 ;inc
Rep4:
inc byte ptr [edi]
inc edi
loop Rep4
.elseif eax == 4 ;dec
Rep5:
dec byte ptr [edi]
inc edi
loop Rep5
.elseif eax == 5 ;not
Rep6:
mov bl,byte ptr [edi]
not bl
mov byte ptr [edi],bl
inc edi
loop Rep6
; .elseif eax == 6 ;rol
Rep7:
; rol dword ptr [edi],edx
; inc edi
; loop Rep7
; .else ;ror
Rep20:
; ror dword ptr [edi],edx
; inc edi
; loop Rep20
.endif
mov eax,edi
;popad
ret
PolyEngine endp
RealSize equ $ - offset lbl_PolyStart
SizeOfCode equ ((($ - offset lbl_PolyStart)*10)/1000h+1)*1000h
;end
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)