记一次恶意样本分析/2026.5.29
来源
https://www.52pojie.cn/forum.php?mod=viewthread&tid=2063618&page=1&extra=#pid53963559
一个exe和dll
观察行为
首先虚拟机运行一遍,过滤后发现:
每隔大概30s与这个ip通信
分析过程
WindowsEvent.exe
这个很小的exe是汇编写的
在start函数中,首先是调用一个异或解密的函数,内部主要是对一些加密数据进行解密,每密文的第一个数据是长度,后面是密文
通过交叉引用,发现一共调用12次
用IDA mcp让AI帮我解密一下得到这样的结果,IDA9pro也可以shift D直接异或解密:
另外发现400660这个函数对一大段数据解密 同时调用,大概就是加载guard.dll了
先VirtualAlloc分配0x4 可读可写权限,进行解密操作
然后再VirtualProtect 分配0x20 可读可执行权限,后面直接call过去
所以这个exe的大概作用就是 零导入表启动,动态加载dll,自解密执行shellcode。
Guard.dll
因为是dll,看导出表,除了dllmain,还有个叫MonitorAndRestart的api函数。
这里看到了两项内容是一样的,搜索了一下,第一个是C的导出风格,第二个是C++的导出风格,想起来之前研究过的C++的函数修饰
大概分析一下
导出的这个MonitorAndRestart,大概作用就是:
检查是否只有一个该进程在运行,没有则拉起一个,然后无限循环 通过系统进程快照检查WindowsEvent.exe是否在运行,有则sleep 1秒,没有就schtasks启动一个无窗口的进程 如果失败了 就强制重启,
很异或,通过sleep函数交叉引用,没有发现每隔30秒进行一次网络连接的操作,并且dll的导入表也没有网络通信api,那么就是exe的shellcode进行的?
shellcode
动调dump下来shellcoode,strings查看有这样的信息
反编译,分析了一下,是这样的逻辑,拿到api地址主要是通过 提前计算好的hash值,去遍历ntdll中的INT,如果计算的hash值一致就是找到了。这里我用AI计算了每个hash值是哪个函数,关键的重命名了一下
最后的几行本人是看不出来这是啥,AI告诉我是通信的两种方式。
所以这个shellcode也是一个加载器,没在这里看到什么有害的行为,就是一些获取api、与ip进行通信的操作,所以在c2服务器获取的shellcode是实现危害行为的,那么之前在虚拟机上观察到的每隔差不多30s进行的网络通信,实际上是因为我的虚拟机断网,网络连接失败,一直在重试,而非程序实现的。。
这次分析中学到的
- 程序不导入任何api函数,通过peb导入dll。具体操作就是fs存的是teb地址,在32位系统下,
peb = fs+0x30就是PEB的地址,ldr = peb+0xC就是LDR的地址,ldr+0x24是一个双向链表InMemoryOrderModuleList,顺着链表遍历,直到找到kernel.dll, - 加载shellcode时,先VirtualAlloc申请可写的权限,在VirtualProtect修改到可执行的权限
- 更了解EOT ENT EAT
- 检测进程是否运行的方式 可以通过
CreateToolhelp32Snapshot后Process32FirstWProcess32NextW遍历进程,当某个进程的PROCESSENTRY32W结构体中的szExeFile与目标进程名一致时 就匹配上了 CreateProcessW启动的参数CREATE_NO_WINDOW是无窗口进程- 检测某个命令执行是否成功,可以通过退出代码判断
收获满满!