修复rmnet蠕虫病毒感染的exe、dll文件

先是拿到一个被感染的exe文件:123456789.exe

PEView:文件中有一个.rmnet节区头,文件大小为0xE200,镜像中大小为0xF000,有可疑

IDA:rmnet节区中分2部分start( )函数、数据部分

start函数:

1、pusha指令保存所有寄存器值,使用call $+5,pop ebp获取当前的虚拟内存地址。

2、从宿主文件的IAT表中直接获取LoadLibraryA( )、GetProcAddress( )函数的地址(在感染时已经确定了这两个函数的位置)

3、加载kernel32.dll库,从中依次获取FreeLibrary、CreateMutexA、ReleaseMutex、CloseHandle、GetLastError、CreateFileA、WriteFile、GetModuleFileNameA、CreateProcessA函数地址。

4、创建"KyUffThOkYwRRtgPP"互斥量,如果错误代码为0xB7(ERROR_ALREADY_EXISTS),就转到start函数结束处。否则执行第5步。

在调试过程中发现进程监控中不仅显示"KyUffThOkYwRRtgPP"互斥量,还会出现"ShimCacheMutex"互斥量,后来在VT中查样本时发现:好多不相关的样本行为都会有"ShimCacheMutex"互斥量出现;还有一次在测试MoveFileA函数是也出现了这个互斥量;这个互斥量应该不是rmnet作者创建的,而是"操作系统创建进程的共性"。

5、对rmnet节区的数据部分做异或解密操作。

6、GetModuleFileNameA:获取当前宿主路径。

7、CreateFileA:创建文件,文件名是第6步字符串追加Srv.exe。

8、WriteFile:一次性写入0xDC00大小数据。

9、CreateProcessA:用刚生成的pe文件创建子进程。

10、FreeLibrary:释放kernel32.dll库文件。

11、popa指令恢复所有寄存器值,跳转到宿主的入口点执行。

1--11步骤中用到的字符串都存放在数据部分:

整个start函数缩略图:

当发现exe或者dll文件中含有特征,就可以判断已经被rmnet病毒感染了。

被感染exe、dll文件可以被修复,按pe文件格式顺序:

1、文件头中节区数量减去1。

2、入口点修改回原宿主文件入口点(可以从数据部分查找)

3、NT头中镜像大小减去rmnet节区的镜像大小。

4、.rmnet节区头清零。

5、被感染文件尾的rmnet节区全部删掉。

猜你喜欢

转载自blog.csdn.net/singleyellow/article/details/88091715