恶意样本分析初探

详细分析

首先静态分析该exe文件,看下导入函数,其中一个调用了 WININET.dll中的 InternetGetConnectedState 函数,这个跟其他调用 kernel32.dll 中的函数相比,显得有些特殊。

image-20211023170231536

查阅文档可知,这是一个 判断本地网络连接状态的函数,连接成功返回1,连接失败返回0

互联网连接状态功能 (wininet.h) - win32 应用程序|微软文档 (microsoft.com)

1
2
3
4
BOOL InternetGetConnectedState(
[out] LPDWORD lpdwFlags,
[in] DWORD dwReserved
);

找到了main 函数,就从这里开始分析

main函数位于401040,调用了401000处的函数

image-20211024100414924

跳过去看看

上面一大堆没用的是编译器生成的,不要陷入其中

看到该区段的权限是 可读/可执行,并且调用了 InternetGetConnectedState 函数

image-20211024095211845

不看流程图的话大概也可以看出这是一个 if 语句的汇编代码,cmp [ebp+var_4] ,0 ,根据结果跳转到不同的分支

image-20211024100555118

View->Graphs->Flow chart可以查看流程图,相比较于空格的 流程图,更简洁明了

这里使用cmp指令对保存了返回结果的eax寄存器与0比较,然后使用 jz 指令控制执行流。上面我们提到,当 建立网络连接时,InternetGetConnectedState 函数返回1,否则返回0. 如果结果是1,0标志位(ZF)会被清除,jz跳转到1所在的false分支,否则跳转到true分支

下面分析这个位于 40105f处的子过程

image-20211024103413308

image-20211024102412365

其实这里是 printf 函数,但是我们并没有看到一些printf函数的特征,这就需要去找一些其他的特征来证明这里是printf函数

在调用这个函数之前,都向栈中push了 一串 格式化字符串,并且结尾是 \n 换行符,因此可以推出这里调用的函数就是 printf

上面都是是根据静态分析得出的结论,真正的结果还是要实践检验一下

image-20211024104729701

总结

这个恶意代码的主要功能就是检查是否存在 Internet连接,存在输出1,否则输出0。

Peace.