问题
- 1.DllMain的地址是什么?
- 2.使用Imports窗口并浏览到gethostbyname, 导入函数定位到什么地址?
- 3.有多少函数调用了gethostbyname?
- 4.将精力集中在位于0x10001757处的对gethostbyname的调用,你能找出那个DNS请求将被触发吗?
- 5.IDA Pro识别了在0x10001656处的子过程中的多少个局部变量?
- 6.IDA Pro识别了在0x10001656处的子过程中的多少个参数?
- 7.使用Strings窗口,来在反汇编中定位字符串\cmd.exe /c。 它位于哪?
- 8.在引用\cmd.exe /c的代码所在的区域发生了什么?
- 9.在同样的区域,在0x100101C8处,看起来好像dword_1008E5C4是一个全局变量,它帮助决定走哪条路径。那恶意代码是如何设置dword_1008E5C4的呢?(提示:使用dword_1008E5C4的交叉引用。)
- 10.在位于0x1000FF58处的子过程中的几百行指令中,一系列使用memecmp来比较字符串的比较。如果对robotwork的字符串比较是成功的(当memcmp返回0),会发生什么?
- 11.PSLIST导出函数做了什么?
- 12.使用图模式来绘制出对sub_10004E79的交叉引用图。当进入这个函数时,那个API函数可能被调用?仅仅基于这些API函数,你会如何重命名这个函数?
- 13.DLLMain直接调用了多少个Windows API? 多少个在深度为2时被调用?
- 14.在0x10001358处,有一个对Sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?
- 15.在0x10001701处是一个对socket的调用。它的3个参数是什么?
- 16.使用MSDN页面的socket和IDA Pro中的命名符号常量,你能使参数更加有意义吗?在你应用了修改以后,参数是什么?
- 17.搜索in指令(opcode 0xED)的使用。这个指令和一个魔术字符串VMXh用来进行VMware检测。这在这个恶意代码中被使用了吗?使用对执行in指令函数的交叉引用,能发现进一步检测VMware的证据吗?
- 18.将你的光标跳转到0x1001D988处,你发现了什么?
- 参考
1.DllMain的地址是什么?
使用IDA打开后,鼠标所在位置
.text:1000D02E
2.使用Imports窗口并浏览到gethostbyname, 导入函数定位到什么地址?
.idata:100163CC
3.有多少函数调用了gethostbyname?
Jump to xref operand
函数交叉引用,p是引用,r是读取,必须先读取,再引用。引用了9次,被5个函数调用。
4.将精力集中在位于0x10001757处的对gethostbyname的调用,你能找出那个DNS请求将被触发吗?
使用G键定位0x10001757
call函数默认将栈顶的值作为函数的参数传递给函数,这里是eax push进去的,eax对应的off_10019040:
[This is RDO]pics.praticalmalwareanalys
然后点击黄色部分aThisRdoPics
,可以看到完整的字符串
[This is RDO]pics.praticalmalwareanalysis.com
刚才gethostbyname
那段代码
off_1001904
值给了eax
之后(off_10019040
是字符串指针),0Dh
转换成十进制是13,因此最后的结果是指针指向p,所以最后push进栈的值是pics.praticalmalwareanalysis.com
5.IDA Pro识别了在0x10001656处的子过程中的多少个局部变量?
使用G
键跳转地址0x10001656
,
分析sub_10001656
函数,一共有23个局部变量,大部分以var_
为前缀。
6.IDA Pro识别了在0x10001656处的子过程中的多少个参数?
一个参数
在子过程中有arg_0
这个参数 lpThreadParameter
??
7.使用Strings窗口,来在反汇编中定位字符串\cmd.exe /c。 它位于哪?
一直以为我装的这个IDA没有strings(确实是我没找到),结果需要shift+F12
,没有F12
Mac—开启键盘F1 - F12功能键以及F1 - F12功能键的作用
结果还是不知道怎么弄,
找到了,F16都找到了,还是没成功shift+F12
找到后,双击
位置:xdoors_d:10095B34
8.在引用\cmd.exe /c的代码所在的区域发生了什么?
在\cmd.exe /c
下方发现'Encrypt Magic Number For This Remote Shell Session [0x%02x]'
结合recv和send调用,可以猜测是一个shell远程会话函数。
9.在同样的区域,在0x100101C8处,看起来好像dword_1008E5C4是一个全局变量,它帮助决定走哪条路径。那恶意代码是如何设置dword_1008E5C4的呢?(提示:使用dword_1008E5C4的交叉引用。)
只有一处显示被修改,对于该交叉引用,双击进入
eax被赋给dword_1008E5C4,在这之前是调用了一个sub_10003695函数,进入查看
GetVersionExA获取版本信息
cmp [ebp+VersionInformation.dwPlatformId], 2
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),会发生什么?
位于0x1000FF58
处的远程shell
函数从0x1000FF58
包含了一系列memecmp
函数,在0x10010452
处是与robotwork
的memcmp
函数。
首先压入robotwork
字符串指针,紧接着压入eax
,调用memcmp,如果两个数相同,返回0,然后add eap, 0Ch
,0Ch是12d,也是4(字节)*3(个),因为push后面跟的是立即数,所以一个数占4字节,然后offset也是4个字节,所以,一开始的push 9,和后面的两次push,加起来一共是3次,所以这里回收了这3个一共12字节的空间
test eax, eax
,如果eax为0,则ZF置为1,JnZ不跳转
所以当字符串比较成功(当memcmp
返回0)时,JNZ不跳转,程序继续按从上到下的顺序执行,下面要执行的就是sub_100052A2
查询注册表
.text:10005322 push offset aWorktime ; "WorkTime" .text:100053A0 push offset aWorktimes ; "WorkTimes"
并将两个值返回到push [ebp+s]
,传给socket
。
将ebp(esp是栈顶指针,ebp是栈基址)地址增加s (栈中,esp地址减小,栈空间增大,ebp增加,ebp将向栈底偏移)
将ebp向下s的指针地址压栈
11.PSLIST导出函数做了什么?
sub_100036C3
函数,
进入,检查操作系统版本
对应关系
12.使用图模式来绘制出对sub_10004E79的交叉引用图。当进入这个函数时,那个API函数可能被调用?仅仅基于这些API函数,你会如何重命名这个函数?
函数如图:
send
:socket发送
malloc
:分配栈堆
free
:释放堆栈
GetSystemDefaultLangID
获取系统的默认语言
可以将send
函数根据具体功能修改函数名send_languageID
【右键没得重命名,先备个注吧,印象中是可以的】
13.DLLMain直接调用了多少个Windows API? 多少个在深度为2时被调用?
和上题一样,对DLLMain所在地址进行交叉引用图,并在绘制时设置深度为2
深度为1的图
14.在0x10001358处,有一个对Sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?
3E8h
是十进制1000
,atoi
调用结果乘以1000
eax
是off_10019020
赋来的,进入off_10019020
,'[This is CTI]30'
,再偏移0Dh
,指向30
.
程序休眠时间为30X1000=30000
毫秒 30秒
15.在0x10001701处是一个对socket的调用。它的3个参数是什么?
6 2 1和msdn
上socket
调用的符号常量有关
我用的这个ida里未找到
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
对应的参数为
#defineAF_INET2/*internetwork:UDP,TCP,etc.*/
#defineSOCK_STREAM1/*streamsocket*/
#defineIPPROTO_TCP6/*tcp*/
16.使用MSDN页面的socket和IDA Pro中的命名符号常量,你能使参数更加有意义吗?在你应用了修改以后,参数是什么?
17.搜索in指令(opcode 0xED)的使用。这个指令和一个魔术字符串VMXh用来进行VMware检测。这在这个恶意代码中被使用了吗?使用对执行in指令函数的交叉引用,能发现进一步检测VMware的证据吗?
Search > Sequence of Bytes>Find All Occurrences
18.将你的光标跳转到0x1001D988处,你发现了什么?
乱码
2D 31 3A 3A 27 75 3C 26 75 21 3D 3C 26 75 37 34 36 3E 31 3A 3A 27 79 75 26 21 27 3C 3B 32 75 31 30 36 3A 31 30 31 75 33 3A 27 75 05 27 34 36 21 3C 36 34 39 75 18 34 39 22 34 27 30 75 14 3B 34 39 2C 26 3C 26 75 19 34 37 75 6F 7C 64 67 66 61
结合Lab05-01.py,每个字节和0x55
进行XOR
可以直接File>script file
导入,好像被弃用了
sea = ScreenEA()
for i in range(0x00,0x50):
b = Byte(sea+i)
decoded_byte = b ^ 0x55
PatchByte(sea+i,decoded_byte)
解密结果
xdoor is this backdoor, string decoded for Pratical Malware Analysis Lab:)1234
参考
1.斯科尔斯基, 哈尼克. 恶意代码分析实战[M]. 电子工业出版社, 2014.
2.恶意代码分析_Lab05-01_IDA