本文章为《恶意代码分析实战》的题目答案解析以及个人的一些理解,将通过一下问题对恶意代码进行分析:
- D1lMain的地址是什么?
- 使用Imports窗口并浏览到gethostbyname,导入函数定位到什么地址?
- 有多少函数调用了gethostbyname?
- 将精力集中在位于0x10001757处的对gethostbyname的调用,你能找出哪个DNS请求将被触发吗?
- IDA Pro识别了在0x10001656处的子过程中的多少个局部变量?
- IDA Pro 识别了在0x10001656处的子过程中的多少个参数?
- 使用Strings窗口,来在反汇编中定位字符串\ /c。它位于哪?
- 在引用\ /c的代码所在的区域发生了什么?
- 在同样的区域,在0x100101C8处,看起来好像dword_1008E5C4是一个全局变量,它帮助决定
走哪条路径。那恶意代码是如何设置dword_1008E5C4的呢?(提示:使用dword_1008E5C4的交叉引用。 - 在位于0x1000FF58 处的子过程中的几百行指令中,一系列使用memcmp来比较字符串的比较。
如果对robotwork的字符串比较是成功的`(当memcmp返回0),会发生什么? - PSLIST导出函数做了什么?
- 使用图模式来绘制出对sub_10004E79的交叉引用图。当进入这个函数时,哪个API函数可能被
调用?仅仅基于这些API函数,你会如何重命名这个函数? - D11Main直接调用了多少个Windows API?多少个在深度为2时被调用?
- 在ex10001358处,有一个对Sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的
调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久? - 在Ox10001701处是一个对socket的调用。它的3个参数是什么?
- 使用MSDN页面的socket和 IDA Pro中的命名符号常量,你能使参数更加有意义吗?在你应用
了修改以后,参数是什么? - 搜索in指令( opcode 0xED)的使用。这个指令和一个魔术字符串 vXh用来进行VMware检测。
这在这个恶意代码中被使用了吗?使用对执行 in 指令函数的交叉引用,能发现进一步检测VMware的证据吗? - 将你的光标跳转到Ox1001D988处,你发现了什么?
- 如果你安装了IDA Python插件(包括IDA Pro的商业版本的插件),运行,一个本
书中随恶意代码提供的IDA Pro Python脚本,(确定光标是在Ox1001D988处。)在你运行这个脚本后发生了什么? - 将光标放在同一位置,你如何将这个数据转成一个单一的ASCII字符串?21.使用一个文本编辑器打开这个脚本。它是如何工作的?
答案解析:
1. DllMain的地址是什么?
1000D02Eh
使用IDA打开文件后会自动跳转到DLLMAIN,或者你可以在左边的functions窗口找到dllmain地址
2. 使用Imports窗口并浏览到gethostbyname,导入函数定位到什么地址?
100163CCh
打开Imports窗口,ctrl+f搜索gethostbyname左边为地址
3. 有多少函数调用了gethostbyname?
9个
Imports窗口双击该条目跳转到反汇编窗口,点击gethostbyname条目可以使用ctrl+x或者右键List cross references to来查看函数交叉引用窗口,可以看到有9个不同的地址调用了gethostbyname
4. 将精力集中在位于0x10001757处的对gethostbyname的调用,你能找出哪个DNS请求将被触发吗?
跳转到10001715h,gethostbyname函数的名字已经很明显了,调用前肯定需要压入一个hostname变量,反汇编窗口可以看到压入了eax,eax赋值为10019040h然后加0xD,其实右边已经有注释了,跳转也可以看见hostname的字符串
可以看到[This is RDO],eax之所以要加0xD,就是要让指针偏移到hostname开始的地方,去掉前面的”[This is RDO]“
5-6. IDA Pro识别了在0x100081656处的子过程中的多少个局部变量?多少个参数?
参数为EBP的正偏移,局部变量为EBP的负偏移,所以局部变量有23个,参数有1个。
7-8. 使用Strings窗口,来在反汇编中定位字符串\ /c。它位于哪?在引用\ /c的代码所在的区域发生了什么?
打开Strings窗口,如果没有可以在View->Open Subviews->Srings打开,ctrl+f搜索cmd,地址为10095B34h跳转至反汇编窗口,ctrl+x打开交叉引用窗口,可以看到有一个地方调用了该字符串,跳转分析。
分析上文可以猜测是通过cmp版本信息确定是使用还是
空格使用图形模式,整体分析直接看这个函数内使用了哪些函数。下文发现大量的字符串被用于比较(如cd、exit、quit、mhost等等),上文存在一个变量字符串“his Remote Shell Session”,、这个函数中存在recv调用,函数调用前有send、connect调用,故猜测为故猜测为一个远程shell函数。
9. 在同样的区域,在0x100101C8处,看起来好像dword_1008E5C4是一个全局变量,它帮助决定 走哪条路径。那恶意代码是如何设置dword_1008E5C4的呢?(提示:使用dword_1008E5C4的交叉引用。
7-8题的分析提到了可能是通过比较版本信息来选择执行路线,dword_1008E5C4应该就是通过获取版本信息得到的,查看他的交叉引用发现在0x10001678处被写入值
跟踪函数sub_10003695查看eax值是表示什么,存在一个GetVersionExA函数掉用,通过_OSVERSIONINFOA结构体的dwPlatformId(如果是2那么就是win2000或更高版本)值与2比较,决定al是否置位。所以通常eax为1。
10. 在位于0x1000FF58 处的子过程中的几百行指令中,一系列使用memcmp来比较字符串的比较。 如果对robotwork的字符串比较是成功的`(当memcmp返回0),会发生什么?
找到robot字符串比较处,若比较成功则调用sub_100052A2。
"SOFTWARE\Microsoft\Windows\CurrentVersion"压入栈执行RegOpenKyeExA打开注册表,打开成功则执行RegQueryValueExA检索workTimes的值如果返回0则表示成功。调用atoi将查询到的字符串值转换为整数然后写入buffer,然后将长度Biffer和变量socket s push,再调用send,将信息发送给网络socket s。
11. PSLIST导出函数做了什么?
PSLIST传入了3个int,一个字符串指针。PSLIST调用了一个函数100036C3,获取操作系统信息,获取成功eax返回非0, PSLIST根据返回的eax判断版本如果等于0,如果等于0 1008E5BC置0,retn 10h,如果eax返回值不为0,那么判断STR字符串是否为0,不为0跳转,压入STR调用函数1000664C。 然后对系统的所有进程拍摄快照CreateToolhelp32Snapshot,通过send函数发送至sockt s
12. 使用图模式来绘制出对sub_10004E79的交叉引用图。当进入这个函数时,哪个API函数可能被 调用?仅仅基于这些API函数,你会如何重命名这个函数?
该函数内的函数调用右键xrefs graph from即可
13. D11Main直接调用了多少个Windows API?多少个在深度为2时被调用?
自定义交叉引用,找到mian函数使用user xrefs chart ,即可自定义深度
19. 如果你安装了IDA Python插件(包括IDA Pro的商业版本的插件),运行,一个本 书中随恶意代码提供的IDA Pro Python脚本,(确定光标是在Ox1001D988处。)在你运行这个脚本后发生了什么?
14-17均比较简单,不再花篇幅解释,说一下这个idapython脚本,由于书中的ida版本是比较早期的版本了,所以示例的py脚本里面很多函数在新版中是无法使用的,我使用的版本是IDA7.7,重新写了一下:
ea=idc.get_screen_ea()
for i in range(0x00,0x50):
b=idc.get_wide_byte(ea+i)
d=b^0x55
ida_bytes.patch_byte(ea+i,d)
- 1
- 2
- 3
- 4
- 5
如果有需要本书电子版以及源文件可以私聊我