恶意代码分析实战Lab0501

时间:2024-06-02 12:22:28

问题1:DllMain的地址

恶意代码分析实战Lab0501

地址是1000D02E


问题2:使用Imports窗口浏览到gethostbyname,导入函数定位到什么地址

恶意代码分析实战Lab0501

地址是100163CC


问题3:有多少函数调用了gethostbyname

恶意代码分析实战Lab0501

恶意代码分析实战Lab0501


问题4:在位于0x10001757处对于gethostbyname的调用,触发的是哪个DNS请求

如上图所示,1757的调用时图上的第六个,所以我们来分析1656这个函数即可

恶意代码分析实战Lab0501

恶意代码分析实战Lab0501

在函数中找到gethostbyname的调用,前后观察其重要的常量字符串


问题5、6:IDA识别了1656函数的多少个局部变量和参数

这个问题其实没有太大意义,知道怎么操作就好。

当前版本的IDA,识别的是一个参数lpThreadParameter,以及62个参数


问题7定位\cmd.exe /c.

Shift + F12,查看Strings

恶意代码分析实战Lab0501


问题8在\cmd.exe /c的附近发生了什么

恶意代码分析实战Lab0501

发现到了GetSystemDirectory的API函数调用


问题9:观察dword_1008E5C4的交叉引用

查看全局变量的交叉引用如图

恶意代码分析实战Lab0501

根据引用来看,恶意代码是使用eax,edi,ebx这些寄存器来赋值该全局变量

恶意代码分析实战Lab0501

eax是多少?在1665的test eax,eax时,当eax为0时,jnz不成立,会顺序往下走。即当eax = 0时,全局变量1008E5C4为0,会顺序执行下面的Sleep和WSAStartup函数

恶意代码分析实战Lab0501

xor edi,edi即赋值edi为0.

当edi为0时,cmp之后有个jz,所以是当全局变量不为0时,执行GetCurrentThreadId与GetThreadDesktop等函数


恶意代码分析实战Lab0501

这里就看不出啥区别了,待会儿看完writeup来补思路


问题10:观察0x1000FF58处的多处memcmp.robotwork如果成功匹配(返回值为0),会发生什么

这里看到多个memcmp,且是多种字符串的匹配,很像恶意代码控制台的选择menu

恶意代码分析实战Lab0501

比如说登陆之后的提示符,cd、exit等执行,很像恶意代码控制台的选择menu

恶意代码分析实战Lab0501

利用Strings功能,找到robotwork

恶意代码分析实战Lab0501

说明一个字符串的成功匹配,会调用到一个一一对应的函数,robotwork对应的是100052A2

恶意代码分析实战Lab0501

可见,其功能是完成注册表的新建

恶意代码分析实战Lab0501

问题11:PSLIST导出函数

可见,其功能是完成注册表的新建

恶意代码分析实战Lab0501

分析其中调用的几个函数

36C3:调用API函数GetVersionEx,在一个OSVERSIONINFO结构中载入与平台和操作系统有关的版本信息

664C:

恶意代码分析实战Lab0501

在进程列表中搜索所有进程,其中Process32First是获取当前系统中运行的第一个进程,while中的Process32Next是获取下一个进程,形成的链表结构确保能够不重复不遗漏的遍历所有进程。从匹配进程名称来看,应该是恶意代码对于某种类型的系统进程实现了某种监听或者注入

6518:

恶意代码分析实战Lab0501

和上面的664C框架结构类似

猜想:该导出函数实现的是对进程中的含有特殊字符串进程的监听或者是注入


问题12:分析函数10004E79

恶意代码分析实战Lab0501

不知道为啥不能调用出函数的交叉引用图来。4E79调用了GetSystemDefaultLangID。查看的是系统的默认语言环境。然后是被1656调用

恶意代码分析实战Lab0501

戳进去看一眼,果然就是之前分析的,多个特征字符串匹配,多个函数调用的地方。重命名为LanguageCheck即可(简洁易读)


问题13:DllMain直接调用了多少个Windows API?

第一眼看到的是strnicmp,CreateThread,strncpy这几个

深度为2的需要进去子函数分析


问题14:0x10001358的Sleep时长

恶意代码分析实战Lab0501

这里睡眠的时间是v17的数值,单位是秒。30 + 13 = 43秒


问题15,16:1701处socket调用的参数

恶意代码分析实战Lab0501

这里就是标准socket的使用。IDA已经有注释了,protocol,type,af

还是那句话,不加壳不加花的代码是很明显很好分析的,因为作者在写代码的时候是有逻辑的,找到那条主线结合正常的猜想,大致功能基本不会差太多的

根据网上的资料,protocol有如下常见的值:IPPROTO_TCP(6)。当内核向此raw socket交付数据包的时候,是包括整个IP头的,并且已经是重组好的IP包。protocol是IPPROTO_RAW(255),这时候,这个socket只能用来发送IP包,而不能接收任何的数据。protocol为0(IPPROTO_IP)的raw socket。用于接收任何的IP数据包。

type如下:SOCK_STREAM = 1 (stream connection socket),SOCK_DGRAM = 2, SOCK_RAW = 3,SOCK_RDM = 4,SOCK_SEQPACKET = 5,SOCK_DCCP = 6,SOCK_PACKET = 10

family如下:AF_INET = 2

函数调用形式为socket(int family,int type,int protocol)


问题17:搜索in指令的使用。程序是如何进行VMware检测的?

AF_INET = 2

aa

在strings中搜索VM

恶意代码分析实战Lab0501

恶意代码分析实战Lab0501

4EE0这个函数,在本地找寻机器的各种端口连接信息,其中aInstallLogDDet中,在检测VM


问题18、19、20:在0x1001D988处运行IDA-py,并且修改显

示格式

在汇编处跳转到地址0x1001D988

恶意代码分析实战Lab0501

应该是发现了一个新的区段,或许是代码,或许是其他函数的数据区段。从前面的一堆0来看,这里是一个独立新大陆。在这里运行IDApy

恶意代码分析实战Lab0501

恶意代码分析实战Lab0501

注意提示,一定要在1001D988处


问题21:py代码如何工作的

恶意代码分析实战Lab0501

简单的xor加密解密