QUESTION 1
What is the address of
DllMain
?
我们用 Ida Pro
加载这个动态链接库,在左侧的函数窗口点击 Ctrl+F
,输入函数名 DLLMain
,即可搜索:
可见其入口地址是 .text:1000D02E
。
QUESTION 2
Use the Imports window to browse to
gethostbyname
. Where is the import located?
同样的方法在 Import windows
中点击 Ctrl + F
,双击进入后:
|
|
可见其地址是 .idata:100163CC
QUESTION 3
How many functions call
gethostbyname
?
可以在 Ida Pro
中使用 xrefs
工具查看调用的函数,在上一题的函数定义位置右键可以选择 list cross refrence to ...
:
可见这个函数调用了 18 次。按名称排序之后可以得到一共有 9 个不同的函数
QUESTION 4
Focusing on the call to
gethostbyname
located at0x10001757
, can you figure out which DNS request will be made?
在 0x10001757
处的调用即上图函数 sub_10001656
在 101
行的调用:
|
|
根据之前函数的定义的观察我们可以发现,gethostname
的参数是一个 const char *
,于是我们知道这个 DNS 函数解析的是 off_10019040
这个位置的字符串:
|
|
该处存储的也是一个地址,它指向 10019040
这个位置:
|
|
可见它要解析的是 pics.praticalmalwareanalys.com
QUESTION 5
How many local variables has IDA Pro recognized for the subroutine at
0x10001656
?
在 Ida Pro
中按 g
,输入地址 0x10001656
即可看到位于这个地址的子过程:
|
|
地址小于栈帧地址的是局部变量,地址大于栈帧的是参数,因此一共有 23 个局部变量。
QUESTION 6
How many parameters has IDA Pro recognized for the subroutine at
0x10001656
?
跟第五题同样分析,有 1 个。
QUESTION 7
Use the Strings window to locate the string
\cmd.exe /c
in the disassembly. Where is it located?
在 Ida Pro
中 shift + F12
打开字符串窗口,按 Ctrl + F
搜索 \cmd.exe /c
这个字符串:
|
|
所以这个字符串位于 xdoors_d:10095B34
这个地址上。
QUESTION 8
What is happening in the area of code that references
\cmd.exe /c
?
我们首先寻找调用这个字符串的位置:
|
|
可见调用的函数是 sub_1000FF58+278
:
|
|
就这几行的代码看,应该是进行了一次 if 判断之后复制了一次字符串的操作。
QUESTION 9
In the same area, at
0x100101C8
, it looks likedword_1008E5C4
is a global variable that helps decide which path to take. How does the malware setdword_1008E5C4
? (Hint: Usedword_1008E5C4
’s cross-references.)
我们根据以下的操作:
- 双击进入这个变量存储的位置;
- 右键查找调用这个变量的位置,发现其中仅有一个
mov
的赋值指令; - 双击进入这个位置,发现
eax
是一个函数的返回值,我们接着查看这个函数的汇编代码;
|
|
大概是在比较系统的版本。
QUESTION 10
A few hundred lines into the subroutine at
0x1000FF58
, a series of comparisons usememcmp
to compare strings. What happens if the string comparison to robotwork is successful (whenmemcmp
returns 0)?
F5
分析伪代码,搜索字符串 robotwork
,可知若其值为 0,则会将查询注册表项 HKET_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 中的aWorktime
和
aWorktimes
,并将其值输出。
QUESTION 11
What does the export
PSLIST
do?
在 export
函数表中查找 PSLIST
,分析其伪代码:
|
|
其中 sub_100036C3
这个函数就是之前分析的判断系统版本号的函数,进一步观察 sub_1000664
的内容大概就是创建了一个给套接字创建了一个 shell
。
QUESTION 12
Use the graph mode to graph the cross-references from
sub_10004E79
. Which API functions could be called by entering this function? Based on the API functions alone, what could you rename this function?
我们在左侧的函数窗口中找到 sub_10004E79
这个函数,然后在 hex view 中右键点击函数名然后查看 xref greph from...
,查看函数的调用图可以得到下面的信息:
可见这个函数调用了 GetSystemDefaultLangID
这个函数,还调用了 sub_100038EE
这个函数,后者应该是一个自定义函数,根据这些信息我们猜测这个函数应该是获取系统语言的一个函数,我们将其命名为 GetSystemLanguage
。
QUESTION 13
How many Windows API functions does
DllMain
call directly? How many at a depth of 2?
在 Ida Pro
中依次点击:view-->graphs-->Users xrefs charts
,选择函数的调用栈深为 1 即为直接调用:
可见直接调用的函数有 7 个。
我们可以用同样的方式将函数调用深度设置为 2,发现函数太多了,根本数不过来。
QUESTION 14
At
0x10001358
, there is a call to Sleep (an API function that takes one parameter containing the number of milliseconds to sleep). Looking backward through the code, how long will the program sleep if this code executes?
在 Ida Pro
中按 g 然后输入地址 .text:10001358
:
|
|
按 F5
查看伪代码:
|
|
然后对于 off_10019020
这个全局数据区的字符串:
|
|
|
|
所以观察程序逻辑我们知道 v14 = 30
,所以 睡眠时间等于 30 * 1000ms = 30s
QUESTION 15
At 0x10001701 is a call to socket. What are the three parameters?
按照同样的方法,我们先跳到 0x10001701
这个地址:
|
|
据此我们已经知道 push
的三个内容,我们可以通过 Google
来查看它们对应的宏。
QUESTION 16
Using the MSDN page for socket and the named symbolic constants functionality in IDA Pro, can you make the parameters more meaningful? What are the parameters after you apply changes?
15 题中的常量被定义在 winsock2.h
中,Google
以下内容 MSDN socket symbol
即可搜到 MSDN 的网址:https://docs.microsoft.com/en-us/windows/desktop/api/winsock2/nf-winsock2-socket。所以三个参数:
af=2 | type=1 | protocol=6 |
---|---|---|
AF_INET (IPv4) | SOCK_STREAM (流) | IPPROTOCOL_TCP (TCP) |
QUESTION 17
Search for usage of the
in
instruction (opcode 0xED). This instruction is used with a magic stringVMXh
to perform VMware detection. Is that in use in this malware? Using the cross-references to the function that executes thein
instruction, is there further evidence of VMware detection?
按 alt+B
之后输入指令 in
的 opcode 0xED
可以在搜索结果中找到一个 in
指令:
|
|
我们查看这个调用位置的伪代码:
|
|
通过 cross refrence
查看这个函数的被调用位置,发现有三处被调用,我们查看其中第一个的伪代码:
|
|
如果这个函数 sub_10006196()
调用了返回为真,则会调用:Found Virtual Machine,Install Cancel.
这个字符串,可见这个函数就是用于检测是否为虚拟机的函数。
QUESTION 18
Jump your cursor to
0x1001D988
. What do you find?
一个存储着看起来很随机的字符串:
|
|
QUESTION 19
If you have the IDA Python plug-in installed (included with the commercial version of IDA Pro), run
Lab05-01.py
, an IDA Pro Python script provided with the malware for this book. (Make sure the cursor is at 0x1001D988.) What happens after you run the script?
在 File-->Script
中选择 Lab05-01.py
这个文件:
|
|
可以看到 0x1001D988
这个地址的内容发生了变化。
QUESTION 20
With the cursor in the same location, how do you turn this data into a single ASCII string?
按下键盘上的 A
。
QUESTION 21
Open the script with a text editor. How does it work?
打开:
|
|
ScreenEA()
函数获取了光标所在的位置,PatchByte()
函数用于写入一个字节。
这个 python 脚本的作用是将光标之后的 0x50
个字节的内容与 0x55
做异或操作,并写入原来的位置。