Blast's Security Lab
4 Jul 2010
文件: loaderadv701.exe
语言: Microsoft Visual C++ 6.0 (Possible)
类型: TR/Downloader
MD5 : 25BF7669E1AD55C6ABC4F14FD9300B3D
加壳: Unknown Encryptor
大小: 16,896 字节
时间: 2010-7-4 11:23:33
本文来自www.sacour.cn 转载注明来源 / 包含高手绕道声明
loaderadv701经久不衰,从09年貌似就看它坚挺到现在而且依然常常看见它在活动,这个程序相对于它最初的版本有什么变化呢,今天来看一下:
一进去,程序就调用一个名为SHValidateUNC的函数(shell32.dll),不是常见的函数啊,我是不知道这玩意干什么用的,查一下MSDN:
http://msdn.microsoft.com/en-us/bb762259(VS.85).aspx
BOOL SHValidateUNC( __in HWND hwndOwner, __inout LPWSTR pszFile, __in UINT fConnect);
Validates a Universal Naming Convention (UNC) path by calling WNetAddConnection3. The function makes it possible for the user to type a remote network access (RNA) UNC application or document name from the Run dialog box on the Start menu.
通过调用WNetAddConnection3来验证一个通用命名约定(UNC)路径。此函数使得用户可以从“运行”对话框(Run dialog box)或开始菜单中输入一个符合通用命名约定的远程网络调用(RNA)程序名或文件名。
大概是跟局域网有关的东西吧,不过看它传入的三个参数,其中LPWSTR pszFile指向一串空字符,这是什么意思?先继续往下走,发现在调用后,这个函数的返回值是0(bool:FALSE,未找到路径,因为传入的是空路径),程序随后调用GetLastError,返回值3,ERROR_PATH_NOT_FOUND = 3 (0x3) ,The system cannot find the path specified.(系统无法找到指定路径)。
(0-499系统错误代码可以参考:http://msdn.microsoft.com/en-us/library/ms681382(v=VS.85).aspx)
而GetLastError后两行代码是:
004010D7 |. 83E8 03 sub eax, 3
004010DA |. /75 7A jnz short 00401156 ; destination's an api call to ExitProcess(0)
原来是故意这么搞的,他料到返回值是3,所以之后又把eax减三再jnz,如果之前返回值是3,程序继续;如果不是三那程序肯定是被修改过,也没有继续的必要了,退出。
继续跟着跑,程序进入之前申请到的内存空间,并且使用一种极其恶心的方式把数据写入内存……
00A31AC1 C685 0BFFFFFF 6>mov byte ptr [ebp-F5], 6F
00A31AC8 C685 0CFFFFFF 7>mov byte ptr [ebp-F4], 75
00A31ACF C685 0DFFFFFF 7>mov byte ptr [ebp-F3], 72
00A31AD6 C685 0EFFFFFF 6>mov byte ptr [ebp-F2], 63
00A31ADD C685 0FFFFFFF 6>mov byte ptr [ebp-F1], 65
00A31AE4 C685 10FFFFFF 0>mov byte ptr [ebp-F0], 0
00A31AEB C645 F0 46 mov byte ptr [ebp-10], 46
00A31AEF C645 F1 69 mov byte ptr [ebp-F], 69
00A31AF3 C645 F2 6E mov byte ptr [ebp-E], 6E
00A31AF7 C645 F3 64 mov byte ptr [ebp-D], 64
00A31AFB C645 F4 52 mov byte ptr [ebp-C], 52
00A31AFF C645 F5 65 mov byte ptr [ebp-B], 65
00A31B03 C645 F6 73 mov byte ptr [ebp-A], 73
00A31B07 C645 F7 6F mov byte ptr [ebp-9], 6F
00A31B0B C645 F8 75 mov byte ptr [ebp-8], 75
00A31B0F C645 F9 72 mov byte ptr [ebp-7], 72
00A31B13 C645 FA 63 mov byte ptr [ebp-6], 63
00A31B17 C645 FB 65 mov byte ptr [ebp-5], 65
00A31B1B C645 FC 41 mov byte ptr [ebp-4], 41
00A31B1F C645 FD 00 mov byte ptr [ebp-3], 0
00A31B23 C685 FCFDFFFF 4>mov byte ptr [ebp-204], 47
00A31B2A C685 FDFDFFFF 6>mov byte ptr [ebp-203], 65
00A31B31 C685 FEFDFFFF 7>mov byte ptr [ebp-202], 74
00A31B38 C685 FFFDFFFF 5>mov byte ptr [ebp-201], 50
以上是其中一部分……之后用lea操作来把写入的这些(其实上面这些都是一些函数名)字符放到寄存器里面
LEA—Load Effective Address
Intel Architecture Software Developer's Manual (pp. 3-259,3-260)LEA r16/r32, m;计算第二个操作数(源操作数)有效的地址并且把它存储到第一个操作数中
然后程序再用搜索MZ、PE字符的方式来确定kernel32.dll的基址从而进一步通过在kernel32.dll的输出表里面翻函数名,然后一个个比对函数名的方法来获取函数地址,(不过这方面我还是不太大理解倒是,高手轻拍)(正规点的说法请参考大牛们的帖子:http://bbs.pediy.com/archive/index.php?t-52630.html)
总之是程序获取了GetModuleHandleA、LocalAlloc、LocalFree等函数地址。(以上这些相对早期的loaderadv.exe是有变化的,下面的变化就不大了,可以把前面这部分当作是它加的壳,因为后面有个大跳转来到了4014D0,如果算壳的话,14d0这儿是OEP。)
进入oep之后,程序使用GetVolumeInformationA来获取"c:\"的信息,然后使用GetTempPathA获取临时目录地址,并随后将两个网址入栈,以便后续组合连接用:
00401512 68 0C134000 push 0040130C ; ASCII "hxxp://agrofee.com/yulgbvqk/"
00401520 68 E8124000 push 004012E8 ; ASCII "hxxp://bgroundplatt.com/yulgbvqk/"
之后程序进入检验阶段,程序调用GetSystemDefaultLangID,如果是419(俄语)则删除自己并退出,可以看出来这个毒是俄国产的了。
0x0419 Russian (ru) 0x19 LANG_RUSSIAN Russia (RU) 0x01 SUBLANG_RUSSIAN_RUSSIA
http://msdn.microsoft.com/en-us/library/dd318693(v=VS.85).aspx
之后程序就开始用wsprintf来组合网址和存储路径(在%temp%\目录里面,之前获取得到的那个)了,然后调用线程来下载。
线程的动作如下:
首先,线程先调用urlmon.ObtainUserAgentString获取用户的UserAgent字串(UserAgent,http://baike.baidu.com/view/1029229.htm?fr=ala0_1_1 ; http://en.wikipedia.org/wiki/User_agent),然后用lstrcatA在UserAgent字串后面捆上一个"ver54" (这就是为什么你在浏览器中下载不了它服务器上文件的缘故了,因为你的useragent末尾不含ver54这几个字),连接完之后程序调用WININET.InternetOpenA并随后下载文件,下载到本地后使用CreateProcessA来执行并退出线程。
由于程序后半部分全部在调用线程下载文件,在此不赘述了。
下载的文件有(2个服务器可以自由更换,一个样的):
hxxp://agrofee.com/yulgbvqk/kksaupwr.php?adv=adv701
hxxp://agrofee.com/yulgbvqk/ffmhcw.php?adv=adv701
hxxp://agrofee.com/yulgbvqk/ggbrzx.php?adv=adv701
hxxp://agrofee.com/yulgbvqk/uiptnmgovj.php?adv=adv701
hxxp://agrofee.com/yulgbvqk/gxbjd.php?adv=adv701
hxxp://agrofee.com/yulgbvqk/gkbjdlwqlt.php?adv=adv701
hxxp://agrofee.com/yulgbvqk/wzdytaicxe.php?adv=adv701
hxxp://agrofee.com/yulgbvqk/jwrlgbvd.php?adv=adv701
hxxp://agrofee.com/yulgbvqk/jjaiqxsq.php?adv=adv701
hxxp://agrofee.com/yulgbvqk/iickf.php?adv=adv701
hxxp://agrofee.com/yulgbvqk/kksahc.php?adv=adv701
hxxp://agrofee.com/yulgbvqk/vzdlfahpxe.php?adv=adv701&code1=%s&code2=%s&id=%d&p=%s
(注意UserAgent需要加上ver54字样才可以下载。最后一个为感染报告,可以无视。)
清理:
把你的系统切换成俄语就行了……或者使用杀毒软件全盘扫描。
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。