搜索

VMP学习笔记之壳基础流程(一)(二)

发布网友 发布时间:2024-10-23 17:59

我来回答

1个回答

热心网友 时间:2024-10-27 03:31


【文章标题】: Vmp1.21学习笔记



【软件名称】: Vmp1.21



【编写语言】: Borland Delphi 4.0 - 5.0



【操作平台】: win7 32位



【详细过程】



【章节目录】



第一章: 壳的基础操作



    读取PE结构信息
    增加区段
    根据加密等级选择不同的框架


第二章: Opcode快速入门



    了解Opcode解析过程
    辅助第三章解析Opcode引擎而编写的
    无脑查表就对了


第三章: 反汇编引擎框架学习



    看懂第二章就看得懂第三章
    无脑查表就对了


第四章: 壳的初始化与Handle块优化



    去掉无用的Handle块(不重要)
    指令的等级变换
    部分指令变形
    汇编的多变性


第五章: 壳的重定位修复(未完成)



第六章: 壳的伪代码生成与排序等等(未完成)



第七章: 万用门介绍(未完成)



第八章: Vmp壳的实现或则去混淆插件(不打算写了感觉太麻烦了)



2019年08月09日 23:31:16



【基础知识之加壳基本套路】



    读取PE信息
    添加区段
    修复重定位
    获取壳需要使用的API(PEB那一套)


【读取PE基本信息】



定义的结构如下:



【获取到壳要的各种API】



【将用户要VM的Opcode进行解析】



【如何定位到加密按钮】



    使用DarkDe4.exe
    设置是保护全关,所以ProtectOptions = 8
    分析关键函数sub_4A3414(最核心的函数)


【sub_4A3414函数分析】



    偏移到新区段的起始地址
    判断RVA合法性
    内存对齐后的总大小
    根据保护等级选择使用哪个壳模板,并设置区段保护属性


【指令前缀讲解】(可选)



【Opcode结构顺序是不能被打乱的】



【指令前缀分为四组】



    组1——锁定和重复前缀
    组2 — 段重载前缀
    分支提示
    组366H—操作数大小重载前缀,也可被用作某些指令的强制性前缀
    组467H—地址尺寸重载前缀


【强制性前缀应当位于其他可选的前缀之后(例外的情形请查看第2.2.1节,”REX前缀”)】



【操作数大小重载前缀允许程序在16位和32位操作数大小间切换】



【地址尺寸重载前缀(67H)允许程序在16位和32位地址间切换】



【ModR/M 和 SIB 字节】(可选)



【ModR/M字节包含3个域信息】



    mod域与r/m域组成32个可能的值:8个寄存器和24个寻址模式
    reg/opcode域确定寄存器号或者附加的3位操作码
    r/m域确定一个寄存器为操作数或者和mod域一起编码寻址模式


【某些ModR/M字节编码需要第二寻址字节(SIB)。基址+索引或者比例+索引形式的32位寻址需要SIB字节】



【针对前面内容进行实践】



【举例说明】



    26:C784C8 44332211 78563412 MOV DWORD PTR ES:[EAX+ECX*8+0x11223344],0x12345678


【指令拆解】



    Legacy Prefix(可选)26H—ES 段重载
    Opcode(必须有)C7
    ModRM(可选)844
    SIB(可选)C85
    Displacement(可选)44332211
    Immediate(可选)78563412


【解析Opcode】



    找到主操作码(查表)得到的是 MOV R/M32,IMM32


【分析ModRM】(查表)



    ModRM结构如下
    转换成二进制如下:84=‭10000100‬


【分析SIB】(查表)



    根据上文找到的地址发现是[--][--]”,表示有SIB表


【得到:MOV DWORD PTR ES:[EAX+ECX*8+0x11223344],0x12345678

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
Top