恶意代码分析lab-3,lab-5

lab3-1

peid打开,发现程序是加壳的,其实好像前面的章节不要求脱壳,而且这是动态分析章,所以就先不脱了

image-20220417205127511

ida分析,可疑的字符串如下

image-20220417205351590

使用processmonitor,添加过滤器,把字符串中的vmx32to64.exe这个名称和lab03-01.exe添加进去

image-20220417205901834

使用ApateDns检测dns行为

image-20220417210845951

regshot拍摄注册表快照

image-20220417211422396

不过我这里程序没有启动成功。。。。

image-20220417212056777

但是能看到一些操作,因为没运行成功也没看到最后有没有那个exe。。。

image-20220417212346286

lab3-2 dll

题目中要求让其自行安装,观察其导出表有类似名字为install的函数,据说是需要使用rundll32 ,加载

image-20220417213338471

lab 5 -1

1.ida打开处即是dllmain

image-20220424235620166

2.使用Imports窗口并浏览到gethostbyname, 导入函数定位到什么地址?

在import窗口可以进行CTRL+F搜索

image-20220425000515069

3.有多少函数调用了gethostbyname?

对这个函数右键,选择Jump to xref operand,可以看到这个表,r代表读取函数,p代表引用

image-20220425000647035 image-20220425000746391

4.将精力集中在位于0x10001757处的对gethostbyname的调用,你能找出那个DNS请求将被触发吗?

G键,可以直接跳转到对应地址

image-20220425001820012

这里先push了eax,然后调用函数,这里的off_10019040是字符串指针(指向这个字符串起始地址),然后加上13(dh),就刚好到p的位置

image-20220425002427941

image-20220425002937272

5.IDA Pro识别了在0x10001656处的子过程中的多少个局部变量?

G键跳转此地址,可以看到有差不多23个局部变量

image-20220425003137134

6.IDA Pro识别了在0x10001656处的子过程中的多少个参数?

同上,可以看到有一个lpThreadParameter参数

7.使用Strings窗口,来在反汇编中定位字符串\cmd.exe /c。 它位于哪?

shift+f12 用字符串窗口 CTRL+ F查看

image-20220425003348521 image-20220425003458480

8.在引用\cmd.exe /c的代码所在的区域发生了什么?

转到调用\cmd.exe /的函数,上面会打印这段话,猜测可能是远程执行shell的函数

image-20220425004248821

9.在同样的区域,在0x100101C8处,看起来好像dword_1008E5C4是一个全局变量,它帮助决定走哪条路径。那恶意代码是如何设置dword_1008E5C4的呢?(提示:使用dword_1008E5C4的交叉引用。)

image-20220425004426252

w表示写入,点进去第一处看到,eax的值写入到了这个位置,在这之前调用了sub_10003695函数

image-20220426012130096

跟进去函数可以看到,返回之前有

cmp [ebp+VersionInformation.dwPlatformId], 2

setz al

这两个操作

image-20220426012032565

image-20220426012606122

根据https://blog.csdn.net/m0_37442062/article/details/116423682的解释

dwPlatformId与2进行比较确定设置AL寄存器。2代表VER_PLATFORM_WIN32_NT,如果这里相等,则AL寄存器将被置位。
setz:当ZF标志被设定时,AL寄存器设1
所以sub_10003694的返回值是1,最后的dword_1008E5C4的值就被赋成了1,所以这个全局变量在程序运行的时候一直保持的是1

10.在位于0x1000FF58处的子过程中的几百行指令中,一系列使用memecmp来比较字符串的比较。如果对robotwork的字符串比较是成功的(当memcmp返回0),会发生什么?

比较成功后会调用sub_100052A2函数

image-20220426013143164

按汇编来说就是把调用memcmp,之后add esp 0ch,栈顶+12,等于释放12个字节的空间,然后test eax eax,如果返回为0,则不跳转jnz的地址

image-20220426014612897

11.PSLIST导出函数做了什么?

在导出函数窗口里找到该函数

image-20220426231954637

首先调用了sub_100036c3函数

image-20220426232057235

获取了系统版本,如果VersionInformation.dwPlatformId == 2 && VersionInformation.dwMajorVersion >= 5则返回ture

image-20220426232528820

12.使用图模式来绘制出对sub_10004E79的交叉引用图。当进入这个函数时,那个API函数可能被调用?仅仅基于这些API函数,你会如何重命名这个函数?

在view-a里g跳转到这个函数,然后右键xref graph from

image-20220426234008189

然后就可以看到这个函数的调用图

image-20220426234133634

这里可以看到GetSystemDefaultLangID函数,貌似是获取系统的默认语言,然后还有send,malloc,free,感觉像是发送系统默认语言信息的函数

13.DLLMain直接调用了多少个Windows API? 多少个在深度为2时被调用?

如果没找到视图的选项可以右键工具栏打开

image-20220426234703456

选最右边这个,深度选择1,然后创建

image-20220426234828507 image-20220426235133333

深度2同理,调用的函数太多了我就不放了

14.在0x10001358处,有一个对Sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?

g跳转到这个地址,可以看到参数是v16*1000,v16又是v16 = atoi(off_10019020[0] + 13);得来的

image-20220426235357429

进去off_10019020,可以看到这个字符串加13的位置就是30,所以v16就是30,sleep的参数就是30*1000毫秒image-20220426235521309

15.在0x10001701处是一个对socket的调用。它的3个参数是什么?

g键跳转到这个地址发现这3个参数,据说是符号常量

image-20220426235712866

然后对着这个常量右键-选择使用标准符号常量,可自己更改其显示的符号常量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
socket参数详解
int socket(int domain, int type, int protocol);

domain可以取以下参数
AF_INET:Address Family,指定TCP/IP协议家族
PF_INET:Protocol Family
在windows中 AF_INET和PF_INET完全一样
在某些Linux中两者会有差距(但一般也相同),理论上建立socket时是指定协议,应该用PF_XXX,设置地址时用AF_XXX,不过在两者相等的情况下混用也没啥。
AF_UNIX:用于同一台计算机的进程间通信
AF_INET6:ipv6网络协议


type:套接字类型
SOCK_STREAM:流套接字,对应TCP协议
SOCK_DGRAM:数据报套接字,对应UDP协议
SOCK_RAW:原始套接字,提供原始网络协议存取
SOCK_PACKET:直接从网络驱动获取数据,即从数据链路层开始处理(过时了)
如果想获取数据链路层,可用socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))

protocol:协议类型
传输层:IPPROTO_TCP、IPPROTO_UDP、IPPROTO_ICMP
网络层:htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL)

image-20220427000529385

image-20220427000624001

16.就是上面使用符号常量的过程

17.搜索in指令(opcode 0xED)的使用。这个指令和一个魔术字符串VMXh用来进行VMware检测。这在这个恶意代码中被使用了吗?使用对执行in指令函数的交叉引用,能发现进一步检测VMware的证据吗?

搜索里选择字节搜索,然后把这个勾上

image-20220427001010389

找到in这个指令

image-20220427001107593

跳转过去就可以看到这个字符串

image-20220427001156478


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!,本博客仅用于交流学习,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 文章作者拥有对此站文章的修改和解释权。如欲转载此站文章,需取得作者同意,且必须保证此文章的完整性,包括版权声明等全部内容。未经文章作者允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。若造成严重后果,本人将依法追究法律责任。 阅读本站文章则默认遵守此规则。