恶意代码分析实战—实验5-1

实验环境

实验设备环境:windows XP
实验工具:IDA pro

实验思路

1、掌握IDA Pro基本使用方法
2、利用IDA Pro静态分析恶意程序

实验过程

1、DLLMain的地址是什么?
打开IDAPro将Lab05-01.dll文件拖进来
Dllmain
进来我们就可以发现DLLMain的位置。我们可以鼠标放置在此函数上,点击空格键获得内存地址信息:
内存地址
2、使用imports窗口并浏览到gethostname的调用,导入函数定位到什么地址?
gethostbyname
可以通过点击imports窗口获得信息,双击这个函数就可以获得导入函数地址。
3、有多少函数调用了gethostbyname?
我们可以来到这个函数,鼠标放置在这个函数上,按Ctrl+X就可以获得以下窗口信息:
函数调用和读取
我们会观察到以上的信息中Type类型分为p和r类型,实际上r类型的是读操作,而p类型的是调用。所以P类型的就是调用了gethostname函数的函数。
4、观察位于0x10001757处的gethostbyname调用,你能找出哪个DNS请求将被触发么?
我们可以回到IDA,按键盘上的G键就可以获得一个按照内存地址进行搜索的搜索框,输入以上地址定位:
定位地址
可以看到是加上影响到gethostbyname参数的就是Off_10019040这个数加上0D以后放置在EAX中,之后将EAX入栈,当做gethostbyname的函数参数。
可以查看一下Off_10019040保存的是什么,双击之后获得:
网址
这时我们可以看到一个网址,我们就有理由猜测这个就是dns要解析的网址。那么为什么还要在加上0D呢?是因为在域名之前还有字符串即“[This is RDO]”这段字符串的长度就是0D,加上0Dh之后就是将EAX指向了网址字符串。

5、IDAPro识别了在0x10001656处的子过程中的多少个局部变量和参数?

局部变量都会存在一些特征,例如带有var的或者在等号的右边带有负号的。而等号右边是正值的就是参数。
局部变量和参数
6、使用strings窗口,来在反汇编中定位字符串\cmd.exe /c。它位于哪
打开strings窗口,翻找一下以上字符串的内容:
cmd
双击进去以后就可以看到他的位置。

7、在引用\cmd.exe /c的代码所在区域发生了什么?
上箭头引用
我们可以点击上图中的上箭头,定位以后向上查找字符串如下:
字符串
双击aHiMasterDDDDDD:
远程会话
图中的字符串表示会为了远程shell会话解密一段数字。即开启一段远程session会话。现在我们可以按esc返回上一层
8、在同样的区域,在0x100101C8处,看起来好像dword_1008E5C4是一个全局变量,他帮助决定走哪条路径,恶意代码是如何设置dword_1008E5C4的呢?
我们可以定位到这个位置之后,双击dword_1008E5C4,获得内存地址:
内存地址
现在我们可以将鼠标放置在这个内存地址上之后CTRL+X查看交叉引用:
交叉引用结果
我们可以看到只有第一个是会改变变量值的交叉引用,双击进入以后:
w型交叉引用
我们可以观察到此时eax的值就是上一个调用函数的返回值,所以我们现在需要进入到函数中查看做了什么:
函数
以上函数的作用就是判断当前新系统是否是win32系统。
返回值就是操作系统的版本信息,那么eax中存储的就是版本信息。dword_1008E5C4存储的就是版本信息。
9、在位于0x1000FF58处的子过程中的几百行指令中,一系列使用memcmp来比较字符串的比较,如果对robotwork的字符串比较是成功的(当memcmp返回0),会发生什么?

定位到0x1000FF58之后向下翻找robotwork字符串如下:
robotwork
题目中要求是比较成功那么也就是memcmp返回值为0,而jnz是不相等跳转,所以也就是说跳过jnz命令向下执行,我们点击进入sub_100052A2函数中:
函数内部
我们会发现其对注册表进行了一系列的操作,再往下我们主要关注call指令:
call

我们会发现图片中的函数并不是调用的系统函数或者访问注册表函数,我们点击进入查看:
函数内部
函数内部首先分配了一段内存后来又调用了send函数,所以我们可以猜测其是修改注册表项,然后将注册表项修改的内容通过send函数发送出去。
10、PSLIST导出函数做了什么?
可以在exports窗口中找到此函数,双击进入以后按空格键返回图形视图:
图形视图
我们双击进入第一个call函数:
call第一个函数
返回上一层,下方会出现一个分支:
分支
我们先分析左边调用的函数,双击进入:
函数内部
调用这个系统函数的主要目的是或去系统进程信息。
返回上一层,查看右边调用的函数如下:
内部函数
我们可以观察到此函数同样调用了此系统函数用来获取进程信息,两者的不同可能在于一个是获得所有的信息,一个是根据processID获得指定进程信息。
现在我们可以清楚PSLIST导出函数是在针对不同的操作系统实施不同方式的获取进程信息的操作。
11、使用图模式来绘制出sub_1004E79交叉引用图,当进入这个函数时,哪个API函数可能被调用?仅仅基于这些API函数,你会如何重名名这个函数?

可以通过Function window通过function name进行函数的查找,找到之后双击进入,进行如下操作:
转换图模式
之后出现的窗口点击OK就可以了,之后就可以出现图模式:
图模式
根据以上我们可以总结此函数的主要目的是获取系统的语言并通过send函数发送出去。之后就可以进行重命名了(随便即可)
12、DLLMain直接调用了多少个Windows API,多少个是在深度为2时被调用?
我们可以通过进入DLLMain之后进入图模式以后直观查看调用函数情况(但是要注意在最后弹出来的User xrefs chart窗口中修改Recursion depth为2):
dllmain调用
我们可以观察到调用情况如上,图中标识出来的仅仅是一部分的二级调用函数。
13、在0x10001358处,有一个对sleep的调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?
sleep函数
此函数会睡眠多久取决于上面的eax中的值。向上分析会发现:
函数信息
我们可以双击进入查看一下:
内部
我们会发现其保存了一个字符串,下面的eax加上0D是为了去掉字符串前面的’[]'及其内容,使eax指向‘30’。之后再调用atoi函数将字符串转化为了数值,之后使用乘法指令’imul’即30*3E8h,其中30是十进制,3E8是十六进制,3E8转化为十进制是1000,那么结果就是30000,也就是说其会休眠30000ms即为30s。
14、在0x10001701处是一个对socket的调用,他的三个参数分别是什么
socket调用参数
我们可以清晰的看到其调用的三个参数为6,1,2
15、使用MSDN页面的socket和IDA Pro中的命名符号常量,你能使参数更加有意义么?当你应用了修改以后,参数是什么?
右击第三个参数:
参数转化
查看MSDN可以发现2代表的是AF_INET可以在点击后的字符串中选择AF_INET。
16、搜索IN指令(opcode 0xED)的使用,这个指令和一个魔术字符串UHXh用来进行VMWare检测。这在这个恶意代码中使用了么?使用对执行in指令函数的交叉引用,能发现进一步检VMWare的证据么?
首先我们可以查找这个ED,通过IDA Pro中的search进行查找:
search
点击之后出现的窗口输入‘ED’,并勾选Find all occurrance,就可以看到很多函数,但是我们要查找的是有关于in的语句,如下:
in
我们可以双击进去如下:
in函数内部
我们可以查看到上面有一个mov eax 564D5868h;但是后面的一串数字很难懂,可以右键将其转化为’VMX’结果如下:
VMX
现在我们可以点击空格返回图形化界面,查看函数的交叉引用(sub_10006196),点击进入第一个函数内部:
内部
我们会发现这个字符串代表的就是找到了虚拟机,取消安装。
17、将光标跳转到0x1001D988处,你发现了什么?
这里我们发现是一堆乱码,可以使用python文件对其进行解密,python脚本如下:
在这里插入图片描述
其中for循环的作用是取出每一个数据,将其与0x55进行异或,最后将结果显示出来。
但是由于python脚本与IDA之间的配置较麻烦,所以这边将python改写成idc语言,即类似于C语言如下:

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

在IDA内我们使用:
引入
点击以上引入idc文件,点击打开之后就可以发现原来加密的字符串被解密了,结果如下:
解密文件

实验心得

实验主要参考i春秋发布的《恶意代码分析实战》课后试验

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值