来源

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进行的网络通信,实际上是因为我的虚拟机断网,网络连接失败,一直在重试,而非程序实现的。。

这次分析中学到的

  1. 程序不导入任何api函数,通过peb导入dll。具体操作就是fs存的是teb地址,在32位系统下,peb = fs+0x30就是PEB的地址,ldr = peb+0xC就是LDR的地址,ldr+0x24是一个双向链表InMemoryOrderModuleList ,顺着链表遍历,直到找到kernel.dll,
  2. 加载shellcode时,先VirtualAlloc申请可写的权限,在VirtualProtect修改到可执行的权限
  3. 更了解EOT ENT EAT
  4. 检测进程是否运行的方式 可以通过CreateToolhelp32SnapshotProcess32FirstW Process32NextW 遍历进程,当某个进程的PROCESSENTRY32W结构体中的szExeFile 与目标进程名一致时 就匹配上了
  5. CreateProcessW启动的参数CREATE_NO_WINDOW是无窗口进程
  6. 检测某个命令执行是否成功,可以通过退出代码判断

收获满满!