Windbg调试.net程序(2)实例分析

一、样本信息

样本名字: Moment.exe
样本大小: 8,400,896 bytes
病毒类型: Trojan.MSIL/Injector
sha1: 17b98df6f5e086a5c1e7b2cda2d000b86c0eeced


二、代码分析

1.可以看到这个一个.net2.0的程序,加obfuscate壳,用ILSpy加载程序,可以发现如下代码:
// Moment.bca
public static byte[] Xdfhkkkkkkmmmmmmmooooooooqqqqq(byte[] fosga, string ximu)
{
	Array.Reverse(fosga);
	checked
	{
		byte b = fosga[fosga.Length - 1];
		byte[] bytes = Encoding.Default.GetBytes(ximu);
		byte[] array = new byte[fosga.Length + 1];
		int num = 0;
		int num2 = fosga.Length - 1;
		for (int i = 0; i <= num2; i++)
		{
			array[i] = (fosga[i] ^ b ^ bytes[num]);
			Array.Reverse(bytes);
			bool flag = num == bytes.Length - 1;
			if (flag)
			{
				num = 0;
			}
			else
			{
				num++;
			}
		}
		return array;
	}
}

2.这看起来像一段解密代码,用windbg加载程序,加载sos.dll(加载方法:http://blog.csdn.net/a530791614/article/details/50555410)
3.下函数断点(我的程序名为17b98df6.exe,.net4.0可以通过!bpmd -list查看断点,2.0还不太清楚...)
0:000> !bpmd 17b98df6.exe Moment.bca.Xdfhkkkkkkmmmmmmmooooooooqqqqq
*********************************************************************
* Symbols can not be loaded because symbol path is not initialized. *
*                                                                   *
* The Symbol Path can be set by:                                    *
*   using the _NT_SYMBOL_PATH environment variable.                 *
*   using the -y argument when starting the debugger. *
*   using .sympath and .sympath+                                    *
*********************************************************************
PDB symbol for mscorwks.dll not loaded
Found 1 methods...
Adding pending breakpoints...
4.g,运行到断点
0:000> g
(2354.2374): CLR notification exception - code e0444143 (first chance)
JITTED Moment!Moment.bca.Xdfhkkkkkkmmmmmmmooooooooqqqqq(Byte[], System.String)
Setting breakpoint: bp 00B28930 [Moment.bca.Xdfhkkkkkkmmmmmmmooooooooqqqqq(Byte[], System.String)]
Breakpoint 0 hit
eax=00946984 ebx=00bfc1f8 ecx=020fed20 edx=02106730 esi=0575eef4 edi=00000000
eip=00b28930 esp=0575ee50 ebp=0575eeb0 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
00b28930 55              push    ebp
5.查看函数代码,找到循环代码,g 00b28a0a,运行到循环起始位置。
0:004> uf .
...
...
00b28a0a 8b45f0          mov     eax,dword ptr [ebp-10h]<-- 循环起始.
00b28a0d 8b55e4          mov     edx,dword ptr [ebp-1Ch]
00b28a10 3b4204          cmp     eax,dword ptr [edx+4]
00b28a13 7205            jb      00b28a1a


00b28a15 e812a6fa5c      call    mscorwks!CorLaunchApplication+0x105db (5dad302c)


00b28a1a 0fb6440208      movzx   eax,byte ptr [edx+eax+8]
00b28a1f 3345fc          xor     eax,dword ptr [ebp-4]
00b28a22 8b55f8          mov     edx,dword ptr [ebp-8]
00b28a25 8b4dd8          mov     ecx,dword ptr [ebp-28h]
00b28a28 3b5104          cmp     edx,dword ptr [ecx+4]
00b28a2b 7205            jb      00b28a32


00b28a2d e8faa5fa5c      call    mscorwks!CorLaunchApplication+0x105db (5dad302c)


00b28a32 0fb6541108      movzx   edx,byte ptr [ecx+edx+8]
00b28a37 33c2            xor     eax,edx
00b28a39 8945e8          mov     dword ptr [ebp-18h],eax
00b28a3c 8b45f0          mov     eax,dword ptr [ebp-10h]
00b28a3f 8b55d4          mov     edx,dword ptr [ebp-2Ch]
00b28a42 3b4204          cmp     eax,dword ptr [edx+4]
00b28a45 7205            jb      00b28a4c


00b28a47 e8e0a5fa5c      call    mscorwks!CorLaunchApplication+0x105db (5dad302c)


00b28a4c 8b4de8          mov     ecx,dword ptr [ebp-18h]
00b28a4f 884c0208        mov     byte ptr [edx+eax+8],cl<-- 保存数据到array数组
00b28a53 8b4dd8          mov     ecx,dword ptr [ebp-28h]


....


00b28a9f 8b45f0          mov     eax,dword ptr [ebp-10h]
00b28aa2 3b45f4          cmp     eax,dword ptr [ebp-0Ch]
00b28aa5 0f8e5fffffff    jle     00b28a0a <-- 循环终止.


00b28aab 8b45d4          mov     eax,dword ptr [ebp-2Ch]
00b28aae 8945dc          mov     dword ptr [ebp-24h],eax
00b28ab1 90              nop
00b28ab2 eb00            jmp     00b28ab4


00b28ab4 8b45dc          mov     eax,dword ptr [ebp-24h]
00b28ab7 8be5            mov     esp,ebp
00b28ab9 5d              pop     ebp
00b28aba c3              ret
6.查看局部变量,发现这个为array数组(0x02106c48),!do 0x02106c48查看对象信息。
0:004> !clrstack -l
OS Thread Id: 0x2374 (4)
ESP       EIP     
0575ee14 00b28a0a Moment.bca.Xdfhkkkkkkmmmmmmmooooooooqqqqq(Byte[], System.String)
    LOCALS:
        0x0575ee28 = 0x00000000
        0x0575ee48 = 0x000000f4
        0x0575ee24 = 0x02106c10
        0x0575ee20 = 0x02106c48
        0x0575ee44 = 0x00000000
        0x0575ee40 = 0x00007a00
        0x0575ee3c = 0x00000000
        0x0575ee38 = 0x00000000


....
7.g 00b28aab(运行循环终止,让程序完成解密),查看array数组内容,发现解密了一个PE文件,大小为0x7a02。
0:004> db 0x02106c48
02106c48  e0 35 fc 5c 02 7a 00 00-4d 5a 90 00 03 00 00 00  .5.\.z..MZ......
02106c58  04 00 00 00 ff ff 00 00-b8 00 00 00 00 00 00 00  ................
02106c68  40 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  @...............
02106c78  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
02106c88  00 00 00 00 80 00 00 00-0e 1f ba 0e 00 b4 09 cd  ................
02106c98  21 b8 01 4c cd 21 54 68-69 73 20 70 72 6f 67 72  !..L.!This progr
02106ca8  61 6d 20 63 61 6e 6e 6f-74 20 62 65 20 72 75 6e  am cannot be run
02106cb8  20 69 6e 20 44 4f 53 20-6d 6f 64 65 2e 0d 0d 0a   in DOS mode....
8.dump内存数据,发现还是个.net程序,再用ILSpy查看,代码行为就比较清楚了(注:dump这个PE不能运行,有可能不完整或还有其他修改,没有继续进行分析)
0:004> .writemem c:\dump.exe 0x02106c48+8 L7a02
Writing 7a02 bytes................


注:本文仅是用windbg调试.net程序的学习记录,并没有对病毒行为具体分析。


附: 常用调试命令。
!bpmd 下函数断点
!bpmd -list 查看断点(2.0不ok)
!CLRStack 查看栈信息(-l 查看局部变量,-p查看参数)
!DumpArray (!da)查看数组信息
!DumpObj (!do)查看对象信息

你可能感兴趣的:(调试相关)