Lab 5-1
只用IDA Pro分析在文件Lab05-01.dll中发现的恶意代码。这个实验的目标是给你一个用IDA Pro
动手的经验。如果你已经用IDA Pro工作过,你可以选择忽略这些问题,而将精力集中在逆向工程恶意代码上。
问题
1.DllMain的地址是什么?
在0x1000D02E.
2.使用Imports 窗口并浏览到gethostbyname,导入函数定位到什么地址?
在0x100163CC.
3.有多少函数调用了gethostbyname ?
5个不同函数调用了9次(同一个地址以不同形式重复显示了).
4.将精力集中在位于0x10001757处的对gethostbyname的调用,你能找出哪个DNS 请求将被触发吗?
触发此域名'pics.praticalmalwareanalysis.com'.
5.IDA Pro识别了在0x10001656处的子过程中的多少个局部变量?
方框是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),会发生什么?
如果返回结果为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.交叉引用图
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个参数是什么?
16.使用MSDN页面的socket和 IDA Pro中的命名符号常量,你能使参数更加有意义吗?在你应用了修改以后,参数是什么?
17.搜索in指令(opcode 0xED)的使用。这个指令和一个魔术字符串 VMXh用来进行VMware检测。这在这个恶意代码中被使用了吗?使用对执行 in 指令函数的交叉引用,能发现进一步检测VMware的证据吗?
1.使用了.
2.有三个函数调用了这段代码函数.
2-2.他们检测到了都会打印一段字符串.方框是检查VM函数如果不是虚拟机会在箭头处跳走.
18.将你的光标跳转到0x1001D988处,你发现了什么?
一长段没有规律的字符串.
19.如果你安装了IDA Python插件(包括IDA Pro 的商业版本的插件),运行Lab05-01.py,一个本书中随恶意代码提供的IDA Pro Python脚本,(确定光标是在0x1001D988处。)在你运行这个脚本后发生了什么?
1.字符串被还原了.
g)
20.将光标放在同一位置,你如何将这个数据转成一个单一的ASCII字符串?
光标放在同一位置按A键就会变更成字符串.
21.使用一个文本编辑器打开这个脚本。它是如何工作的?
1.通过循环0x50次依次异或0x55进行解密的.