恶意代码分析实战 — 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文件,此时乱码解码后变得有意义了