首页
社区
课程
招聘
[分享]VMP学习笔记之壳的重定位修复(五)
发表于: 2019-9-5 23:14 12073

[分享]VMP学习笔记之壳的重定位修复(五)

2019-9-5 23:14
12073

理论知识:

1、为什么需要重定位

因为特殊情况这块地址不给用了你要挪到另外一个地方,你本来是在哪里的挪到另外一个地方你还是在哪里

如下图所示:

小明在教室A是第一排,搬到教室B小明还是第一排

2、待修复数据如下:

push 0xFACE0002                             -------->修复后是:0

mov edi,0xFACE0003                        -------->修复后是:新区段首地址VMcontext

jmp dword ptr ds:[eax*4+0x474FCF] -------->修复后是:Handle块

jmp short 00474984                           -------->修复后是:VMDispatcher

总结:

1、这些地址直接使用肯定会报错,因为这些地址是基于加壳机的,并非我们被加壳程序的。

2、我们要将所有地址修复成基本我们被加壳程序的

3、我们要修改两处:struct_DisassemblyFunction->LODWORD_VMP_Address跟struct_DisassemblyFunction->ReadHexAddress

4、基本要修复都是有:Displacement、Immediate这些

3、如图所示

第一种:修复struct_DisassemblyFunction->LODWORD_VMP_Address

修复前:

修复后:

第二种:修复struct_DisassemblyFunction->ReadHexAddress

典型例子1:

00474991 FF2485 CF4F4700 jmp dword ptr ds:[eax*4+0x474FCF]这一句不修复肯定执行会错误

我们要修复这一句的Displacement,改成一个被加壳程序存在的地址就Ok了

例如:jmp dword ptr ds:[eax*4+0x4051BB]

典型例子2:

Jmp VMDispatcher

公式: jmp后的偏移量=目标地址-原来地址-5         5是指令长度


正文:

1、筛选Esi_Addr[X]结构数据保存到ruct_VmpOpcodePY_50结构

将struct_DisassemblyFunction所在的数组下标保存到struc_69结构里

挑选jmp ret指令保存起来

struc_69结构定义如下:

总结:

1、struc_69结构

struc_69->ArrayNumber == Handle块头

struc_69->FilterArrayNumber == Handle块结束地址,也就是jmp或则ret


2、找到第一组Handle块在数组的元素下标,作为结尾标识

符合条件的是:解析JmpAddr跳转表,填充的VMOpcode都是0x23


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-9-5 23:15 被黑手鱼编辑 ,原因:
上传的附件:
收藏
免费 3
支持
分享
最新回复 (3)
雪    币: 10960
活跃值: (2920)
能力值: ( LV5,RANK:71 )
在线值:
发帖
回帖
粉丝
2
感谢分享,膜而无法学习
2019-9-6 09:18
0
雪    币: 785
活跃值: (2358)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
难得楼主还在坚持WIN平台的研究,感谢分享。
2019-9-6 09:50
0
雪    币: 26245
活跃值: (63297)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
4
一直在关注楼主的整个系列,赞!
2019-9-6 14:35
0
游客
登录 | 注册 方可回帖
返回
//