病毒分析常用技巧-修复内存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文件,动态在自身内存中展开那种,类似壳的,我们可以直接在VirtualAlloc下断点,发现有申请内存后写入了MZ头,转到内存布局,在该内存块下一次性执行断点,等断下来,就可以直接转到内存布局去保存文件了。

如果断不下来,或者比如OD调试器不支持内存块下执行断点,那就下内存块访一次性问断点,第一次断下后,直接转到OEP,下INT3断点,F9跑到OEP,然后到内存布局保存内存块,再修复PE~

怎么知道OEP是哪里? 可以先把第一次写入的残缺的PE文件,导入PE工具查看,扩展头里面有个入口点偏移。

OEP下断的地方,就是申请的地址+扩展头中的入口偏移

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

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

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

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

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

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

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

这里我们使用一种快速修复的方法:
1. 修复区段Raw地址和大小,修改成在内存展开后的地址和大小
2. 然后修复exe加载基地址和dump的内存地址一样就行了,不影响运行。

在这里插入图片描述

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

在这里插入图片描述

接下来就是UPX脱壳了~

在这里插入图片描述

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

在这里插入图片描述

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

Scylla搞起~

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

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

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

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值