恶意代码分析实战-通过IDA对恶意代码进行静态分析

时间:2024-10-25 11:10:33

本文章为《恶意代码分析实战》的题目答案解析以及个人的一些理解,将通过一下问题对恶意代码进行分析:

  1. D1lMain的地址是什么?
  2. 使用Imports窗口并浏览到gethostbyname,导入函数定位到什么地址?
  3. 有多少函数调用了gethostbyname?
  4. 将精力集中在位于0x10001757处的对gethostbyname的调用,你能找出哪个DNS请求将被触发吗?
  5. IDA Pro识别了在0x10001656处的子过程中的多少个局部变量?
  6. IDA Pro 识别了在0x10001656处的子过程中的多少个参数?
  7. 使用Strings窗口,来在反汇编中定位字符串\ /c。它位于哪?
  8. 在引用\ /c的代码所在的区域发生了什么?
  9. 在同样的区域,在0x100101C8处,看起来好像dword_1008E5C4是一个全局变量,它帮助决定
    走哪条路径。那恶意代码是如何设置dword_1008E5C4的呢?(提示:使用dword_1008E5C4的交叉引用。
  10. 在位于0x1000FF58 处的子过程中的几百行指令中,一系列使用memcmp来比较字符串的比较。
    如果对robotwork的字符串比较是成功的`(当memcmp返回0),会发生什么?
  11. PSLIST导出函数做了什么?
  12. 使用图模式来绘制出对sub_10004E79的交叉引用图。当进入这个函数时,哪个API函数可能被
    调用?仅仅基于这些API函数,你会如何重命名这个函数?
  13. D11Main直接调用了多少个Windows API?多少个在深度为2时被调用?
  14. 在ex10001358处,有一个对Sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的
    调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?
  15. 在Ox10001701处是一个对socket的调用。它的3个参数是什么?
  16. 使用MSDN页面的socket和 IDA Pro中的命名符号常量,你能使参数更加有意义吗?在你应用
    了修改以后,参数是什么?
  17. 搜索in指令( opcode 0xED)的使用。这个指令和一个魔术字符串 vXh用来进行VMware检测。
    这在这个恶意代码中被使用了吗?使用对执行 in 指令函数的交叉引用,能发现进一步检测VMware的证据吗?
  18. 将你的光标跳转到Ox1001D988处,你发现了什么?
  19. 如果你安装了IDA Python插件(包括IDA Pro的商业版本的插件),运行,一个本
    书中随恶意代码提供的IDA Pro Python脚本,(确定光标是在Ox1001D988处。)在你运行这个脚本后发生了什么?
  20. 将光标放在同一位置,你如何将这个数据转成一个单一的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

如果有需要本书电子版以及源文件可以私聊我