恶意代码分析实战--IDA pro的使用及课后练习l

1.对分析有用的窗口

函数窗口

Functions window  位于左半部分

列举可执行文件中的所有函数,可以在众多函数中过滤出想要的函数。这个窗口也对每一个函数关联了一些标志(F L S等),这其中最有用的是L,指明是库函数。

字符串窗口

Strings window (Shift + F12)

显示所有的字符串,可以右键Setup来修改它的属性

导入表窗口

Imports window

列举一个文件的所有导入函数

导出表窗口

Exports window

列举一个文件的所有导出函数,分析DLL文件时很有用

结构窗口

Structures

列举所有活跃数据结构的布局。这个窗口也提供用自己创建的数据结构作为内存布局模板的能力

2.常用快捷键

    ❶.交叉引用 ctrl+x 或者 x,可以看到函数在哪里被调用

    ❷.跳转 g ,直接跳转到该地址

    ❸.Search列表快捷键

    next code:移动光标到包含你所指定的指令的下一个位置

    text:在整个反汇编窗口中搜索一个指定的字符串

    Sequence of bytes:在十六进制视图窗口中对一个特定字节序列执行二进制搜索

    ❹.数据操作

    将十六进制数据转换成十进制 H

    将十六进制数据转换成二进制 B

    将十六进制数据转换成字符串 R

实验:Lab5-1

使用IDA pro分析文件Lab05-01.dll

问题:(1-10)

1.DllMain的地址是什么?

在IDA pro右侧的Functions window 查找DllMain函数

按空格进入汇编窗口,即可看到函数地址

2.使用Imports窗口并浏览到gethostbyname,导入函数定位到什么地址?

进入Imports window,并按ctrl+f进行搜索gethostbyname

双击跳到对应位置获取地址

3.有多少函数调用来gethostbyname?

函数交叉引用,p是引用,r是读取,必须先读取,再引用。引用了9次,被5个函数调用。

4.将精力集中在位于0x10001757处的对gethostbyname的调用,你能找出那个DNS请求将被触发吗?

在汇编窗口按g,跳转到对应位置

根据函数的传参规则,一般将eax寄存器存的值作为参数传给函数,于是我们在这条指令上面寻找对eax的赋值语句

其中off_10019040对应的值为

又因为将off_10019040赋值给eax之后,还进行来add eax,0Dh  此处是对地址进行加法,则c语言的指针加法就相当于从该字符串的第十三位开始,于是为pics.praticalmalwareanalysis.com

5.IDA Pro识别了在0x10001656处的子过程中的多少个局部变量?

相同方式跳转到对应的地址

这里为负值的均为局部变量23个

6.IDA Pro识别了在0x10001656处的子过程中的多少个参数?

由上图的函数所给可以得到参数为 lpThreadParameter,为1个

7.使用Strings窗口,来在反汇编中定位字符串\cmd.exe /c。 它位于哪?

在Strings window 使用搜索功能

双击跟随过去

位置:xdoors_d:10095B34

然后点击上图位置就可以跳转到对应函数

9.在引用\cmd.exe /c的代码所在的区域发生了什么?

在上图选择位置F5

查看这个参数

发现了对应有 remote shell session

应该是个远程shell会话函数

9.在同样的区域,在0x100101C8处,看起来好像dword_1008E5C4是一个全局变量,它帮助决定走哪条路径。那恶意代码是如何设置dword_1008E5C4的呢?(提示:使用dword_1008E5C4的交叉引用。)

使用交叉引用 x

根据type可以确定有一处是w 写入,被修改,双击进入

因为是把eax的值赋给dword_1008E5c4,因为eax是存返回值的,所以我们需要看上面的call指令的函数

F5反汇编

其中GetVersionExA获取版本信息

判断该系统是否为WinNT系统。

然后上面的setz al指令

setz:当ZF标志被设定时,AL寄存器设1

当当前系统为winNT系统时,cmp指令返回ZF为1,于是setz 指令根据ZF的值将AL设为1,所以sub_10003694的返回值是1,最后的dword_1008E5C4的值就被赋成了1,所以这个全局变量在程序运行的时候一直保持的是1

10.在位于0x1000FF58处的子过程中的几百行指令中,一系列使用memecmp来比较字符串的比较。如果对robotwork的字符串比较是成功的(当memcmp返回0),会发生什么?

使用g跳转到该地址

F5反汇编,然后找到robotwork

当memcmp返回值为0,那么会执行这条语句,然后我们进入下面这个函数

看汇编代码比较直观

看一下loc_10005309

有个call函数,继续跟进,直接看反汇编代码

发现使用了send函数,这里我们可以推断出,通过获取我们的注册表信息,然后使用send函数发送给某地址。

11.PSLIST导出函数做了什么?

在Exports window 搜索PSLIST函数

双击跟进

进入sub_100036C3

根据汇编代码可以看出,是获取对应操作系统版本

12.使用图模式来绘制出对sub_10004E79的交叉引用图。当进入这个函数时,那个API函数可能被调用?仅仅基于这些API函数,你会如何重命名这个函数?

在函数窗口找到该函数

然后

根据其使用的函数可以知道获取使用的语言ID,即可判断使用的是什么语言,并且使用了send函数,可以重命名为

send_SystemLangID

在函数名处右键—>rename即可重命名

13.DLLMain直接调用了多少个Windows API? 多少个在深度为2时被调用?

和上题一样,但需要把深度修改为2即可

14.在0x10001358处,有一个对Sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?

跳转到该地址

其中这几条指令决定了eax的值,即传入Sleep函数的参数的值

这里我们可以知道off_10019020的值

用该地址加上0x0D,就是偏移了0x0D,指向30,然后atoi函数将字符串转换为int,然后使用30 * 0x3E8(十进制为1000),即30000毫秒,为30秒

15.在0x10001701处是一个对socket的调用。它的3个参数是什么?

跳转到该地址

容易看出入栈的三个数即为参数,分别为2 1 6

16.使用MSDN页面的socket和IDA Pro中的命名符号常量,你能使参数更加有意义吗?在你应用了修改以后,参数是什么?

socket函数:socket function (winsock2.h) - Win32 apps | Microsoft Docs

根据对应参数的对应值

首先找到这个,修改成使用标准常量符号,之后rename即可

修改完为

17.搜索in指令(opcode 0xED)的使用。这个指令和一个魔术字符串VMXh用来进行VMware检测。这在这个恶意代码中被使用了吗?使用对执行in指令函数的交叉引用,能发现进一步检测VMware的证据吗?

使用search功能

做如下搜索

然后找到in指令,双击跟进

选择十六进制串,按r将其变成字符串

发现存在VMXh

其他地方也存在该字段

18.将你的光标跳转到0x1001D988处,你发现了什么?

跳转到对应地址

发现是一些十六进制的数据

结合脚本可以进行解密,我们选中所有数据,然后使用 shift+E 键倒出数据

选择c数组类型,使用对应脚本解密即可

Decode.py

a = [0x2D, 0x31, 0x3A, 0x3A, 0x27, 0x75, 0x3C, 0x26, 0x75, 0x21,

  0x3D, 0x3C, 0x26, 0x75, 0x37, 0x34, 0x36, 0x3E, 0x31, 0x3A,

  0x3A, 0x27, 0x79, 0x75, 0x26, 0x21, 0x27, 0x3C, 0x3B, 0x32,

  0x75, 0x31, 0x30, 0x36, 0x3A, 0x31, 0x30, 0x31, 0x75, 0x33,

  0x3A, 0x27, 0x75, 0x05, 0x27, 0x34, 0x36, 0x21, 0x3C, 0x36,

  0x34, 0x39, 0x75, 0x18, 0x34, 0x39, 0x22, 0x34, 0x27, 0x30,

  0x75, 0x14, 0x3B, 0x34, 0x39, 0x2C, 0x26, 0x3C, 0x26, 0x75,

  0x19, 0x34, 0x37, 0x75, 0x6F, 0x7C, 0x64, 0x67, 0x66, 0x61]





for i in range(0x00,0x50):

    out = a[i] ^ 0x55

    print(chr(out),end=“")



#output : xdoor is this backdoor, string decoded for Practical Malware Analysis Lab :)1234

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值