恶意代码分析实战 — Lab 05-01

Lab 05-01

DllMain地址

IDA载入,程序停在DllMain入口处,点空格可以查看到地址为.text:1000D02E

或者图像界面,选择Options –> General –> Line prefixes点选出地址选项

此时在代码前边会显示地址

imports中查找到gethostbyname

双击进入函数

Ctrl + X 查看交叉引用,主要是看type = p的函数调用,去掉重复调用,一共有5个

按字母G跳转到指定地址

根据调用查看参数 off_10019040

其中0x0D = 13 字符串偏移13个字符后为 pics.practicalmalwareanalysis.com

负数的是变量,正数的是参数

View –> open subviews –> strings

查找到cmd.exe

向上找可以看到字符串,显示一个欢迎对话框

向下查找,可以看到调用recv、memcmp函数,有字符比较,如quit、exit、cd等

结合来看,这个就类似于开启了一个Remote Shell对话,通过命令进行控制

根据比较结果,决定执行cmd.exe还是command.exe

来到此地址,Ctrl + X 查看交叉引用 Type = W 赋值写入部分

由eax赋值,返回的eax需要查看上一句的call调用

此函数调用GetVersionExA获取操作系统版本,然后VersionInformation.dwPlatformId与2比较

查看api文档,发现与2比较确定是否是win32_nt操作系统

找到robotwork的比较代码位置

当memcmp返回0的时候,走红色路径

查看此call函数,发现是访问注册表

然后在关闭出册表前调用了sub_100038EE

点击查看此函数,发现 call send,据此推断功能就是访问注册表某些键值,然后进行发送。

在Exports中找到导出函数PSLIST

双击进去查看到第一个call

第一个call的作用就是获取操作系统版本信息,是否是win_32平台

然后dwMajorVersion 跟 5比较,看是否是vista以上操作系统

然后call strlen后有两个分支,对应两个call

左边的call sub_10006518,调用CreateToolhelp32Snapshot循环获取进程id和name值等信息,创建一个snapshot

右边的call sub_1000664C同样也是获取创建进程信息快照

G跳到此地址,选择此函数,右键选择 Xrefs from

可以得到此函数的调用图表,据此推断出函数主要功能是获取系统语言信息,然后发送

右键重命名为 Send_LangId

转到DllMain,选择View –> Graphs –> User xrefs chart进行深度设置为2

比较复杂,就不展开细看了

跳转到sleep函数,睡眠时间跟eax值有关

Mov赋值处,再加上0DH,此时eax = 30,然后调用atoi,将str字符转成int

Imul乘法运算,将Hex转为十进制是1000,也就是30 * 1000 = 30000ms = 30s,sleep(30s)

跳转,三个参数分别是2,1,6,注意是倒序的

第一个参数af = 2,代表的含义就是AF_INET

选择2这个参数,然后右键 –> Use standard symbolic constant

选择AF_INET

此时2就变成了AF_INET,同样的方法搜索参数1和6的含义,方便后续处理

选择Search –> sequence of bytes,然后输入查找字符0xED,勾选所有

找到in操作

将564D5868H转成字符 VMXh

查看此函数的交叉引用

对三处调用分析均发现有一个是否是虚拟机的判断操作

跳转后发现一堆乱码字符,似乎没有意义

Idc脚本,每个字符跟0x55进行xor异或操作

Python脚本

选择File –> Script file

然后打开idc文件,此时乱码解码后变得有意义了

您可能还喜欢...