VMP学习笔记之壳的重定位修复(五)
2019-09-13 18:59:00 Author: mp.weixin.qq.com(查看原文) 阅读量:85 收藏

本文为看雪论坛优秀文章
看雪论坛作者ID:黑手鱼
理论知识
>>>>

为什么需要重新定位

因为特殊情况这块地址不给用了你要挪到另外一个地方,你本来是在哪里的挪到另外一个地方你还是在哪里。
如下图所示:
小明在教室A是第一排,搬到教室B小明还是第一排。
>>>>

待修复数据如下

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这些。
如图所示:
第一种:修复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是指令长度)
正文
筛选Esi_Addr[X]结构数据保存到ruct_VmpOpcodePY_50结构。
struct_DisassemblyFunction所在的数组下标保存到struc_69结构里。
挑选jmp ret指令保存起来:
struc_69结构定义如下:
总结:
>>>>


struc_69结构

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

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

符合条件的是:解析JmpAddr跳转表,填充的VMOpcode都是0x23。
然后对struct_VmpOpcodePY_50结构进行数组乱序。
>>>>
循环填充struc-SaveAllDisasmFunData->ArrayNumber(基本版)Vmp_Address(0×10)替换成实际壳的真实地址
每次执行完毕后sub_480BE0(a1a, ReadHexLen, v3->Characteristics & 0x20, 0i64)函数。
struc_59->LODWORD_UserVmpStartAddr+=ReadHexLen;(默认的壳起始OEP(新区段的起始地址))。
然后替换掉struct_DisassemblyFunction->LODWORD_VMP_Address为真正的地址。
总结:
前面所有工作都是找到所有使用到的struct_DisassemblyFunction结构,然后对其地址进行替换成真实壳地址。
替换前后对比:
前:
后:
>>>>

修复特定值

push 0xFACE0002------->Push 重定位值
mov edi,0xFACE0003------->Mov edi,VMContext
>>>>

修复所有JMP VMDispatcher的地址

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

修复完毕的样子

下一篇文章介绍
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 单操作数
- End -

看雪ID:黑手鱼

https://bbs.pediy.com/user-585205htm 

*本文由看雪论坛 黑手鱼 原创,转载请注明来自看雪社区

推荐文章++++

移动基带安全研究系列之一 概念和系统篇

Linux Kernel Exploit 内核漏洞学习(4)-RW Any Memory

Android 调试任意APK - smail工程--多进程

使用IDA Python寻找二进制漏洞

看雪CTF从入门到存活(六)主动防御

进阶安全圈,不得不读的一本书

“阅读原文”一起来充电吧!

文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458298848&idx=3&sn=1ec322edf5fdeed2138ba78fd01d6d13&chksm=b181996a86f6107cba13ca0eadec0a29d2a8354d50910cdc0d302b9b61ea6c23f07ca78fe503#rd
如有侵权请联系:admin#unsafe.sh