首页
论坛
专栏
课程

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

2019-9-5 23:14 2705

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

2019-9-5 23:14
2705

理论知识:

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

然后对struct_VmpOpcodePY_50结构进行数组乱序


3、循环填充struc_SaveAllDisasmFunData->ArrayNumber(基本版)Vmp_Address(0x10)替换成实际壳的真实地址

每次执行完毕后sub_480BE0(a1a, ReadHexLen, v3->Characteristics & 0x20, 0i64)函数

struc_59->LODWORD_UserVmpStartAddr+=ReadHexLen;(默认的壳起始OEP(新区段的起始地址))

然后替换掉struct_DisassemblyFunction->LODWORD_VMP_Address为真正的地址

总结:

1、前面所有工作都是找到所有使用到的struct_DisassemblyFunction结构,然后对其地址进行替换成真实壳地址

替换前后对比:

前:

后:


4、修复特定值

push 0xFACE0002------->Push 重定位值

mov edi,0xFACE0003------->Mov edi,VMContext



5、修复所有 JMP VMDispatcher的地址

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


6、修复完毕后的样子


下一篇文章介绍:

1、伪代码构造

2、伪代码加密(前面构成出Add的解密代码,所以这里要对称整出一套加密代码)

正向就是解密,取反就是加密了

0x4=add ---->加密用sub

0x5=xor ---->xor不变

0x34=sub ---->加密用add

0x43=rol 循环左移

0x44=ror 逻辑右移

0x5C=not 单操作数

0x29=inc 单操作数

0x2A=dec 单操作数

0x5D=neg 单操作数

0x31=bswap 单操作数





[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最后于 2019-9-5 23:15 被黑手鱼编辑 ,原因:
上传的附件:
最新回复 (3)
joker陈 2019-9-6 09:18
2
0
感谢分享,膜而无法学习
pushmop 2019-9-6 09:50
3
0
难得楼主还在坚持WIN平台的研究,感谢分享。
Editor 2019-9-6 14:35
4
0
一直在关注楼主的整个系列,赞!
游客
登录 | 注册 方可回帖
返回