病毒分析常用技巧-修复内存dump文件

病毒常用的技俩之一就是创建一个傀儡进程,借助傀儡进程,执行自己的恶意代码。

其实现方法:

1.以挂起方式创建一个进程

2.写入一个PE文件到这个挂起的进程的内存,可能会使用API WriteProcessMemory或MapViewOfSection那一套API来完成这个操作

3.调用ResumeThread恢复进程执行

对付这种我们可以在它写入数据到目标进程时下断点,例如WriteProcessMemory

在这里插入图片描述

WriteProcessMemory函数原型:

BOOL WINAPI WriteProcessMemory(
  _In_  HANDLE  hProcess,
  _In_  LPVOID  lpBaseAddress,
  _In_  LPCVOID lpBuffer,
  _In_  SIZE_T  nSize,
  _Out_ SIZE_T  *lpNumberOfBytesWritten
);

可以看到第三个参数1170000内存地址处就是要写入的内容,大小是20000,一个PE文件
在这里插入图片描述

到内存布局页面找到相应的内存段,转存到文件
在这里插入图片描述

下一步就是要检查这个PE文件是否已经在内存中展开了,如果展开过了,我们需要做一些修复才能使用

1) 方法一, 检查PE扩展头中SizeOfImage字段,内存镜像大小,如果该字段和你dump的文件大小一致说明是映射过的PE文件,需要修复。
在这里插入图片描述

2)方法二,检查区段内存偏移地址,如果一个PE在内存中展开后,该区段的内存偏移地址处应该有代码才对。
在这里插入图片描述
因为本文中使用的dump PE文件是一个加过UPX壳的,所以我们检查第二个区段的偏移地址6000,通常情况检查第一个区段的内存偏移地址就行了。

使用16进制编辑器打开dump文件,跳转到第二个区段内存偏移6000看看是否是一个区段的开头
在这里插入图片描述

3)第三种方法,检查导入表是否正确,可以看到导入表基本全部是无效的
在这里插入图片描述

现在可以确定了这个dump下来的PE在内存展开过,要让它正常运行,需要修复一下!~

这里我们使用一种快速修复的方法,修复区段Raw地址和大小,修改成在内存展开后的地址和大小就行了,不影响运行。

在这里插入图片描述

现在再看导入表也恢复正常了

在这里插入图片描述

接下来就是UPX脱壳了~

在这里插入图片描述

把刚才修复好的PE拖进x32dbg,运行到EP,然后经典的UPX脱壳步骤
你可以使用ESP定律,不过今天介绍另一种UPX快速脱壳的方法,如果你知道UPX壳的原理,你可以直接跳转到流程图界面,在最后一个jmp 下断,一般这个跳转是去OEP的。

在这里插入图片描述

断下后,单步一下,就来到了OEP
在这里插入图片描述

Scylla搞起~

首先dump下来脱壳的PE,按下图中的提示文字操作
在这里插入图片描述

然后修复导入表
在这里插入图片描述

脱壳成功!现在可以使用IDA来分析这个木马咯

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cssxn/article/details/84031416