Lab 5-1

只用IDA Pro分析在文件Lab05-01.dll中发现的恶意代码。这个实验的目标是给你一个用IDA Pro

动手的经验。如果你已经用IDA Pro工作过,你可以选择忽略这些问题,而将精力集中在逆向工程恶意代码上。

问题

1.DllMain的地址是什么?

在0x1000D02E.

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

在0x100163CC.

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

img

5个不同函数调用了9次(同一个地址以不同形式重复显示了).

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

触发此域名'pics.praticalmalwareanalysis.com'.

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

img

方框是IDA识别出的局部变量(23个).但实际是一共678个字节.

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

一个参数,看上图箭头标识.

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

0x10095B34处.

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

是个字符串拼接函数.strcat函数第二个参数.感觉想要运行cmd程序.

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

1.通过0x10003695处的函数返回值设置dword_1008E5C4全局变量的.我分析了0x10003695处的函数,主要是通过GetVersionExA获取_OSVERSIONINFOA结构体,通过结构体中的dwPlatformId成员是不是2(VER_PLATFORM_WIN32_NT宏),如果是2返回0否则返回1.

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

img

如果返回结果为0将不会跳转压入一个参数执行0x100052A处的函数.

分析0x100052A处函数:

1.调用RegOpenKeyExA查询'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion'项中.汇编中是80000002h通过宏可得知是HKEY_LOCAL_MACHINE,如果失败直接执行4.

2.查询项中"worktime"名称的的值,读取里面的数据并"\r\n\r\n[Robot_WorkTime :] %d\r\n\r\n"的形式打印出来,没有直接执行3.

3.查询项中"worktimes"名称的的值,读取里面的数据并"\r\n\r\n[Robot_WorkTimes :] %d\r\n\r\n"的形式打印出来,没有直接执行4.

4.调用RegCloseKey关闭句柄退出.

操作完注册表后通过调用0x100038EE处函数发送网络数据出去.

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

int PSLIST(Socket s,char* ProcessName);函数需要两个参数.

1.1如果ProcessName参数不为NULL,调用CreateToolhelp32Snapshot函数获取系统进程快照,如果成功调用Send函数发送数据{'ProcessID ProcessName ThreadNumber'},不过可能是练习缘故,Send中的SOCKET参数是0,然后再将发送的数据{'ProcessID ProcessName ThreadNumber'}写入当前目录下"xinstall.dll"文件中,如过文件不存在会创建.

1.2然后通过CreateToolhelp32Snapshot函数返回的快照句柄调用Process32First加上Process32Next遍历进程,如果失败调用Send函数("\r\nProcess32First() Fail:Error %d",GetLastError()),否则循环遍历进程.

1.3如果找到与参数ProcessName相同的进程名将会调用Send函数用此格式发送数据("\r\n%-16d%-20s%d",PID,ProcessName),后在调用Send函数用此格式发送数据("\r\n[%s]",GetModuleFileNameExA获取的文件名).

1.4将进程信息按照当前格式"%-16d%-20s%d\r\n[%s]",PID,ProcessName,cntThreads(线程数量), GetModuleFileNameExA获取的文件名,追加到当前目录下"xinstall.dll"文件中,如过文件不存在会创建.

2.如果ProcessName参数为NULL,将遍历系统中的所有进程,将每个遍历到的进程信息按照当前格式"%-16d%-20s%d\r\n[%s]",PID,ProcessName,cntThreads(线程数量), GetModuleFileNameExA获取的文件名,追加到当前目录下"xinstall.dll"文件中,如过文件不存在会创建.

3.如果CreateToolhelp32Snapshot返回句柄,调用CloseHandle销毁句柄.

12.使用图模式来绘制出对sub_10004E79的交叉引用图。当进入这个函数时,哪个API函数可能被

调用?仅仅基于这些API函数,你会如何重命名这个函数?

1.交叉引用图

img

2.一共4个函数,分别是GetSystemDefaultLangID,sprintf,strlen,sub_100038EE(经过分析是Send函数).

3.我会重命名为SendLangId;

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

1.调用了四个API分别是CreateThread,_strnicmp,strncpy,strlen.进一步有Sleep,printf,atoi,GetTickCount,LoadLibraryA,GetProcAddress,WinExec,inet_ntoa还有一系列网络相关的API.

14.在0x10001358处,有一个对Sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的

调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?

1.push进去的eax是atoi函数返回值,传进去的是"[This is CTI]30"字符串加0xD也就是"30",所以是30000毫秒.

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

img

16.使用MSDN页面的socket和 IDA Pro中的命名符号常量,你能使参数更加有意义吗?在你应用了修改以后,参数是什么?

img

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

1.使用了.

img

2.有三个函数调用了这段代码函数.

img

2-2.他们检测到了都会打印一段字符串.方框是检查VM函数如果不是虚拟机会在箭头处跳走.

img

18.将你的光标跳转到0x1001D988处,你发现了什么?

一长段没有规律的字符串.

19.如果你安装了IDA Python插件(包括IDA Pro 的商业版本的插件),运行Lab05-01.py,一个本书中随恶意代码提供的IDA Pro Python脚本,(确定光标是在0x1001D988处。)在你运行这个脚本后发生了什么?

1.字符串被还原了.

imgg)

20.将光标放在同一位置,你如何将这个数据转成一个单一的ASCII字符串?

光标放在同一位置按A键就会变更成字符串.

21.使用一个文本编辑器打开这个脚本。它是如何工作的?

img

1.通过循环0x50次依次异或0x55进行解密的.