飘云阁(PYG官方论坛)

 找回密码
 加入论坛

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1466|回复: 17

[原创] 谈谈vmp的还原(1)

    [复制链接]
  • TA的每日心情
    擦汗
    2016-4-19 21:35
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2018-3-19 12:17:53 | 显示全部楼层 |阅读模式
    本帖最后由 wai1216 于 2018-3-19 18:04 编辑

    0x00 前言
    本来想等到54之前发的,看到有朋友提前发相关文章了,没办法我也只能提前发了。
    起因是校长叫我写一个vm引擎,然后我看了一两个月的vmp, 大概摸清楚了,正准备动手的时候,结果生了一场重病耽误了很久。拖到现在
    首先文章不同于其他的文章,从vmp是如何vm opcode入手,看完以后不说还原,相信爆破,静态分析也应该有所帮助。
    主要是vmp3.x以下。

    0x01 简介vmp的流程
    大体如下:
    1.png
    2.png
    直接定位到流程:
    3.png
    4.png
    很直观,首先读了vmp_opcode_begin_block end_block
    然后计算_vm_opcode_size
    5.png
    没错,之前的帖子有提到,vmp作者设计了4handle,就是这4套了。
    6.png
    注意到上上图113行之后,同时我们也可以看出早期版本的构造
    7.png
    下面这个之前也有提到
    8.png
    9.png
    先允许我跳过esi的构造以及修复,继续讲下去

    10.png
    可以看到vmp通过这样方式实现jmp vm_entry,所以有些vm插件会通过这种方式来定位到入口
    68 xx xx xx xx e9 xx xx xx xx
    之后,创建区段vmp0
    11.png

    set jmp_entry
    3333.png
    之后写之前的push esi jmp vm_entry
    12.png
    然后写完之后写vmp1区段,流程大概就这个样子,当然我跳过了构造esi以及对esi的修正

    0x10 反汇编引擎
    之所以会先谈谈这个,因为如果不看懂这个,后面的vm流程肯定看不懂

    为了逆出这个反汇编引擎,我看了几遍opcode的构造方式以及一份开源的反汇编引擎(libudis86)。不过正因为如此,我才大概猜测出来一部分,vmp作者是如何构造这套vm的。
    13.png
    14.png
    这个函数大概3000+
    这下面通过这两条指令来看看是怎么反汇编的,当然需要一些基础知识。
    [Asm] 纯文本查看 复制代码
    817D FC 33020000   cmp dword ptr ss:[ebp-0x4],0x233//563
    75 09              jnz short zf.0040D7E2
    17.png
    17_1.png
    从文件读出opcode 0x81
    18.png
    首先判断type
    19.png
    注意到*(a2-10)其实是对应的这个东西
    20.png
    上个图就明白为什么是 (xx & 2 ) == 2了
    21.png
    然后读modrm 0x7D进行查找mnemonic
    23.png
    得到0x43 对应关系如下:
    24.png
    25.png
    之后就是解析modrm了挺精妙的,看图就好
    27.png
    28.png
    29.png
    30.png
    先对modrm.mod进行分析
    判断是否行如[base+disp]
    如果是   判断是否有address size override prefix
    判断是否包含sib
    读取disp
    之后再读取immediate
    31.png
    创建下一个结构体,读取opcode 0x75
    32.png
    其他的没啥好说的看一看,_vmp_SetJccIndex
    33.png
    是不是感觉很有意思把hex & 0xf然后switch
    可能这样不是很明白

    那么我们先看看0x70~0x7f这些opcode是什么
    34.png
    那么对照一下就明白了
    Vmp作者为了区分溢不溢出 低于不低于做了一个很有意思的事情
    初始化了一个
    0x11
    然后把不溢出不低于的,也就是形如jnx n的这样做了

    0x11|2
    35.png

    理解了之后,我们就可以得到反汇编的结构了
    dis.png
    dis1.png
    对应:
    dis2.png
    dis3.png

    0x11 结束语
    写得有点仓促,下一贴主要是讲vmp是如何膨胀指令的

    评分

    参与人数 14威望 +28 飘云币 +26 收起 理由
    翁臣岩 + 1 PYG有你更精彩!
    ldljlzw + 1 + 1 很给力!
    wanttobeno + 1 PYG有你更精彩!
    九层楼 + 5 + 5 PYG有你更精彩!
    侠骨留香 + 1 + 1 PYG有你更精彩!
    gfjykldd + 1 PYG有你更精彩!
    飞天 + 2 + 2 很给力!果然精华之帖。
    langzhi + 1 PYG有你更精彩!
    0xcb + 1 + 1 佩服,分析的透彻
    2402436533 + 5 膜拜 ~

    查看全部评分

    本帖被以下淘专辑推荐:

  • TA的每日心情
    开心
    2018-6-28 21:41
  • 签到天数: 454 天

    [LV.9]以坛为家II

    发表于 2018-3-19 13:07:42 | 显示全部楼层
    我仿佛看到了VMP的威力
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-7-12 20:19
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    发表于 2018-3-19 13:14:27 | 显示全部楼层
    这个必须要顶  楼主辛苦  耗费了不少精力
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2018-3-19 13:42:43 | 显示全部楼层
    精品系列好文,推荐学习 ~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-3-8 11:19
  • 签到天数: 55 天

    [LV.5]常住居民I

    发表于 2018-3-19 15:11:38 | 显示全部楼层
    牛的一逼啊~~到现在才在学C++的我,基本上抓瞎!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2017-11-5 12:00
  • 签到天数: 113 天

    [LV.6]常住居民II

    发表于 2018-3-19 21:36:57 | 显示全部楼层
    分析的精彩,佩服
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 14:39
  • 签到天数: 730 天

    [LV.9]以坛为家II

    发表于 2018-3-20 09:24:38 | 显示全部楼层
    楼主功力深厚,赞赞赞。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2018-6-19 09:40
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2018-3-22 16:09:47 | 显示全部楼层
    可以啊,写的还不错呢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2018-7-11 14:20
  • 签到天数: 26 天

    [LV.4]偶尔看看III

    发表于 2018-3-27 17:20:10 | 显示全部楼层
    收藏,学习,VM_CODE还是头疼……
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    前天 16:20
  • 签到天数: 53 天

    [LV.5]常住居民I

    发表于 2018-4-9 16:57:13 | 显示全部楼层
    厉害呀,菜菜都不敢碰vmp。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入论坛

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    快速回复 返回顶部 返回列表