因为特殊情况这块地址不给用了你要挪到另外一个地方,你本来是在哪里的挪到另外一个地方你还是在哪里。push 0xFACE0002-------->修复后是:0mov edi,0xFACE0003-------->修复后是:新区段首地址jmp dword ptr ds:[eax*4+0x474FCF]-------->修复后是:Handle块jmp short 00474984-------->修复后是:VMDispatcher1、这些地址直接使用肯定会报错,因为这些地址是基于加壳机的,并非我们被加壳程序的。struct_DisassemblyFunction->LODWORD_VMP_Address;struct_DisassemblyFunction->ReadHexAddress。4、基本要修复都是有:Displacement、Immediate这些。第一种:修复struct_DisassemblyFunction->LODWORD_VMP_Address第二种:修复struct_DisassemblyFunction->ReadHexAddress00474991 FF2485 CF4F4700 jmp dword ptr ds:[eax*4+0x474FCF]这一句不修复肯定执行会错误。我们要修复这一句的Displacement,改成一个被加壳程序存在的地址就Ok了。例如:jmp dword ptr ds:[eax*4+0x4051BB]公式: jmp后的偏移量=目标地址-原来地址-5(5是指令长度)筛选Esi_Addr[X]结构数据保存到ruct_VmpOpcodePY_50结构。将struct_DisassemblyFunction所在的数组下标保存到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后的偏移量=目标地址-原来地址-5(5是指令长度)2、伪代码加密(前面构成出Add的解密代码,所以这里要对称整出一套加密代码)看雪ID:黑手鱼
https://bbs.pediy.com/user-585205htm
*本文由看雪论坛 黑手鱼 原创,转载请注明来自看雪社区进阶安全圈,不得不读的一本书
文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458298848&idx=3&sn=1ec322edf5fdeed2138ba78fd01d6d13&chksm=b181996a86f6107cba13ca0eadec0a29d2a8354d50910cdc0d302b9b61ea6c23f07ca78fe503#rd
如有侵权请联系:admin#unsafe.sh