学习笔记-第五章 恶意代码分析实战

第五章

1.加载可执行文件。可以选择加载方式。 使用二进制文件进行反汇编等等。因为恶意代码有时
会带有shellcode,其他数据,加密参数,甚至在合法的PE文件中带有可执行文件,并且包含这
些附加数据的恶意代码在Windows上运行或被加载到IDA Pro时,它并不会被加载到内存。

2.选择合适的反汇编窗口模式
 <1>图形模式,图形模式更容易看清流程,对于每一个跳转比较清除
 <2>文本模式,是传统的视图模式,并且必须使用它查看一个二进制的数据区。
 对分析有用的窗口
  函数窗口 列举可执行文件中的所有函数,并显示每个函数的长度。 L指明是库函数,
  名字窗口 列举每个地址的名字,函数,命名代码,命名数据和字符串
  字符串窗口 显示所有的字符串。默认只显示长度超过5个字符的ASCII字符,可以修改属性
  导入表窗口 列举一个文件所有的导入函数
  导出表窗口 列举一个文件的所有导出函数。分析dll时这个窗口很有用。
  结构窗口 列举所有活跃数据结构的布局。这个窗口也提供用自己创建的数据结构作为内存布局模板的能力

3.搜索
 从顶部的菜单选择搜索
 search->Next Code ,移动光标到包含你所指定的指令的下一个位置。
 search->Text,在整个反汇编窗口中搜索一个指定的字符串。
 search->sequence of bytes,在十六进制视图窗口中对一个特定字节序列执行二进制搜索。

4.使用交叉引用
 交叉引用,在IDA Pro中被成为xref,可以告诉你一个函数在何处被调用,或者一个字符串在何处被使用,
 如果你识别了一个有用的函数,并且想要知道它在被调用时用了那些参数,你可以使用一个交叉引用,
 来快速浏览这些参数被放在栈上的什么位置。基于交叉引用关系也可以生成有趣的图形。
 
 代码交叉引用
 数据交叉引用

5.分析函数
给定已经分析的函数,变量有意义的变量名字。

6.使用图形工作。

7.增强反汇编。
 IDA Pro允许修改它的反汇编。 IDA Pro没有撤销特性,所以做修改时要当心。
 <1>重命名位置
 <2>注释
 <3>格式化操作数。 例如62h可以修改为八进制的 142o,二进制1100010b或者ASCII字符b。
 <4>使用命名的常量
 <5>重新定义代码和数据

8.使用插件扩展IDA
  

课后作业

实验软件:IDA Pro

只用IDA pro分析在文件lab05-01.dll中发现的恶意代码。这个实验的目的是给你一个使用ida pro动手的经验,如果你已经用ida pro工作过,你可以选择忽略这些问题,而将精力集中在****恶意代码上。

问题
  1. DLLMain的地址是什么?
      打开IDA进入了入口地址
    学习笔记-第五章 恶意代码分析实战

  图模式也可以更改选项查看入口地址
学习笔记-第五章 恶意代码分析实战
2.使用imports窗口并浏览到gethostbyname,导入函数定位在什么地址?
  进入到imports窗口,双击gethostbyname就可以看到定位到什么地址
  idata:0x1001 63CC的地址
学习笔记-第五章 恶意代码分析实战
学习笔记-第五章 恶意代码分析实战
  双击查看gethostbyname
学习笔记-第五章 恶意代码分析实战
3.有多少函数调用了gethostbyname?
  通过查看上面的交叉引用发现有5个函数调用了。

4.将精力集中在位于0x1000 1757处的对gethostbyname的调用,你能找出那个dns请求将被触发吗?
  发现一串字符串,+0dH的偏移量,指向网址字符串的第一个字符
学习笔记-第五章 恶意代码分析实战
查看内容找到了请求的dns。学习笔记-第五章 恶意代码分析实战
5.ida pro识别了在0x1000 1656处的子过程中的多少局部变量?
按G跳转到指定位置
以var,初始为负值表示局部变量
学习笔记-第五章 恶意代码分析实战

6.ida pro识别了在0x1000 1656处的子过程有多少个参数?
  值为正表示参数
  发现有一个参数

7.使用strings窗口,来在反汇编中定位字符串\cmd.exe /c,它位于哪?
  view 打开strings爽口
  xdoors_d:1009 5B34 位置, 双击字符串的上箭头查看引用
学习笔记-第五章 恶意代码分析实战
8.在引用\cmd.exe /c的代码所在的区域发生了什么?

  查看附近代码区域的程序。
  向上看 查看到this remote shell session 开启远程会话
学习笔记-第五章 恶意代码分析实战
  向下看 cd,recv,quit… 猜测可能开启远程会话

9.在同样的区域,在0x1001 01C8处,看起来好像dowrd_1008 E5C4是一个全局变量,它帮助决定走那条路径。那恶意代码是如何设置dword_1008 E5C4的呢?(提示:使用dword_1008 E5C4的交叉引用)
  按g跳转
  对于字符也可以使用交叉引用, 地址 ctrl+x
  r 读取,w写入。 查找到赋值
  查看到 getVersionExA Msdn platform 和2比较判断是不是win32-nt平台
学习笔记-第五章 恶意代码分析实战

10.在位于0x1000 FF58处的子过程中的几百行指令中,一系列使用memcmp来比较字符串的比较。如果对robotwork的字符串比较是成功的(当memcmp返回0),会发生什么?
  相等发现 打开了注册表, worktime, 分配内存,send

11.PSLTST导出函数做了什么?
  查看导出表,
  按下空格转化到图形模式
  判断是不是win32-NT平台。
  majorversion 大于5表示是 vista 以上的版本
  esc返回上一个界面。
  createToolHelp32Snapshot 可以获取我们系统中的进程列表
  恶意进程 获取所有进程发走,匹配到某一个特定的进程发走
  可能发送进程列表,或者寻找特定的进程发送
学习笔记-第五章 恶意代码分析实战
12.使用图模式来绘制出对sub_1000 4E79的交叉引用图。当进入这个函数时,那个API函数可以被调用?仅仅基于这些API函数,你会如何重命名这个函数?
  view->graphs->user xrefs chart查看弹出的图
  获取系统默认的语言,sprintf,strlen,send
  获取操作系统的语言然后发送, 可以重命名一下,便于识别
学习笔记-第五章 恶意代码分析实战
13.DLLMain直接调用了多少个Windowss API?多少个深度为2时被调用?
  弹出交叉引用图 depth=2
学习笔记-第五章 恶意代码分析实战

14.在0x1000 1358处,有一个对sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的调用,那顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?
  先上查看eax的值。 将"…30"赋值给eax,ascii转化成数值
  303E8H ->301000
  休眠30s
学习笔记-第五章 恶意代码分析实战

15.在0x1000 1701处是一个对socket的调用。它的三个参数是什么?
  三个参数 2 1 6
学习笔记-第五章 恶意代码分析实战
16.使用MSDN页面的socket和IDA pro中的命名符号变量,你能使参数更加有意义吗?在你应用了修改之后,参数是什么?
  msdn 查看socket ,af==2代表 AF_INET 右键,use symbool
  转化之后便于理解和分析

17.搜索in指令(opcode 0xED)的使用。这个指令和一个魔术字符串VMXh用来进行VMware检测。在这个恶意代码中被使用了吗?使用对执行in指令函数的交叉引用,能发现进一步检测VMware的证据吗?
  search-> sequence of bytes 查看in
  转化成字符串,查看交叉引用,有理由相信说判断是不是VMW虚拟机
  发现三个函数调用
  查看发现, 找到了虚拟机,安装结束。
学习笔记-第五章 恶意代码分析实战

18.将你的光标跳转到0x1001 D988处,你发现了什么?
  查看一堆乱码

19.如果你安装了IDA python插件(包括IDA pro的商业版本的插件),运行Lab05-01.py,一个本书中随恶意代码提供的IDA pro python脚本,(确定光标是在0x1001 D988处)在你运行这个脚本后发生了什么?
  python脚本配置,比较麻烦。
  字节取出乱码,和0x55异或,赋值。
  可以使用 idc脚本。
学习笔记-第五章 恶意代码分析实战

#include <idc.idc>
static main()
{
	auto ea=ScreenEA(),b,i,decode_byte;
	for(i =0x00;i<=0x50;i++)
	{
		b=Byte(ea+i);
		decoe_byte=b^0x55;
		PatchByte(ea+i,decode_byte);
	}
}

  光标放在起始位置,
  screaip file->open
  xdoor is this backdoor,string decode for analysis lab

20.将光标放在同一个位置,你如何将这个数据转成一个单一的ASCII字符串?
答案见问题19
21.使用一个文本编译器打开这个脚本,它是如何工作的?
答案见问题19