飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 15658|回复: 33

[原创] 谈谈vmp的爆破

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

    [LV.2]偶尔看看I

    发表于 2018-2-22 15:49:43 | 显示全部楼层 |阅读模式
    本帖最后由 wai1216 于 2018-2-22 21:48 编辑

    恩,算是玩vmp的笔记吧,祝大家新年快乐。
    -----------------------------------------------------
    先谈谈爆破,这个比起其他的方面的话,应该很多人喜欢,比较直截了当。当然,也会提一些vmp其他的东西。
    基础知识:
    平常我们爆破一个软件,有一种有常见的方法就是通过修改jcc跳转来达到爆破的目的。而vmp实现jcc,跳还是不跳,其实计算是eflags
    jz为例,大家都知道jz跳不跳其实是看zf标志位的状态:
    zf == 1 ---> 跳转
    zf == 0 ---> 不跳转
    那么我们看看vmp是怎么做的,先上个elflags reg图和给几个要用的数字以及一个handle
    1.png
    数字:0x815      0x246      0x206      0x216      0x40
    (如果有玩过vmp的,应该对这几个数字有熟悉)
    handle大致样子,记为vm_p(a,b):
    [Asm] 纯文本查看 复制代码
    not a
    not b
    and a,b
    a和b可以是寄存器 空间
    -----------------------------------------------------
    下面我会一一解释。
    先看看0x815的二进制:100000010101
    好像看不出来什么所以然,那么这样呢?
    2.png
    这样就很直观了,其实等价于OF AF PF CFmask
    同理大家可以看看其他的几个数字。
    比如0x40,这里就直接用维基的图了:
    3.png
    -----------------------------------------------------
    明白了这几个数字的含义那么我们看看可以怎么得到zf1的情况,之前已经说到了会用到eflag的值。是不是可以这样:
           ~zf  = and(0x40,not(eflags)) = 0                                                         (1)
            zf   = and(0x40,eflags) = 1                                                                (2)
    注意到这里的0和1所对应到eflags zf的数值
    那么eflags又是怎么得到的,这里vmp通过加法和0x815实现
           eflags = and( eflags1, 0x815) + and( eflags2, not(0x815))                    (3)
    vmp中的not,and运算都可以用vm_p来实现,比如我们将式(1)转换后,如下:
           ~zf = vm_p(not(0x40),eflags) = 0
    至于eflags1,eflags2我们可以并不关心他怎么运算的,因为我们只需要修改最终的eflags即可达到爆破的目的。
    不过接触过vmp的人应该明白eflags1,eflags2的数值是通过vm_p(sn,sn)+?这样的式子得到的。
    相信vmp为什么会选择0x40这个数字来计算zf大家也明白了(还有一点,大家注意下af)。
    -----------------------------------------------------
    那么明白了原理之后,我们找个东西进行一番实践。
    这里我选择的是EverEdit,因为官方刚好有两个vmp版本
    使用的是官方下的32位的绿色版
    你可以输入了随意输入sn(不过注意,evereditsn太短不行,233)通过暂停法然后再单步找到vmp调用handle的地方(也就是dispather),也可以通过那块保存sn的堆空间找到(因为是malloc),当然方法很多。
    4.png
    然后取消断点,使用trace into记录数据,等待出现注册码不正确,结束记录。
    5.png
    接下来我们只需要找到vm_p这条handle,然后在记录的文件之中搜索(记得倒着,从下向上)ok
    怎么找handle,如果你对vmp有了解的话,应该知道其实就4handler
    这里我用一种我的方法,先分析是如何jmphandle的。
    [Asm] 纯文本查看 复制代码
    0052474C    8B1485 00D05B00   mov edx,dword ptr ds:[eax*4+0x5BD000]    ; <== handler调用
    00524753  ^\E9 EA9BFAFF       jmp EverEdit.004CE342
    004CE342    4A                dec edx                                  ; EverEdit.00524F92
    然后我们在看看0x5BD000这个数组:
    6.png
    如果有人再仔细一些会发现,这个地址刚好是vmp0的区段的开始,其实这是有原因的。
    对了,可以提一提,这个数组大小是0x100 * 4。但其实vmp加密的时候第一次扫了186次,第二次随机扫剩下的,再把地址填进去。
    至于为什么是186:
    1).186个匹配规则
    2).186handle
    然后我把这些地址记录下来,再用c打了出来:
    7.png
    具体代码就不帖了。
    很幸运的是,od看了看第一个handle对应的就是vm_p
    [Asm] 纯文本查看 复制代码
    0041742D    66:D3C2           rol dx,cl
    00417430    8B45 00           mov eax,dword ptr ss:[ebp]
    00417433    66:89F2           mov dx,si
    00417436    8B55 04           mov edx,dword ptr ss:[ebp+0x4]
    00417439    66:0FBAE3 01      bt bx,0x1
    0041743E    F7D0              not eax
    00417440    66:0FBAE4 01      bt sp,0x1
    00417445    60                pushad
    00417446    F7D2              not edx
    00417448    F8                clc
    00417449    66:85E4           test sp,sp
    0041744C    F5                cmc
    0041744D    21D0              and eax,edx
    0041744F    9C                pushfd
    00417450    890C24            mov dword ptr ss:[esp],ecx               ; EverEdit.005BA174
    -----------------------------------------------------
    [Asm] 纯文本查看 复制代码
    not eax
    not edx
    and eax,edx
    -----------------------------------------------------
    这时我们打开trace记录的log,直接搜eax=40或者edx=40或者not(40)
    8.png
    三次找到这个地方:
    [Asm] 纯文本查看 复制代码
    00417430 Main     mov eax,dword ptr ss:[ebp]                ; EAX=FFFFFFBF
    00417436 Main     mov edx,dword ptr ss:[ebp+0x4]            ; EDX=00000246
    0041743E Main     not eax                                   ; EAX=00000040
    00417446 Main     not edx                                   ; EDX=FFFFFDB9
    0041744D Main     and eax,edx                               ; FL=PZ, EAX=00000000

    vm_p(not(40),eflags) ------>  and( 40, not(eflags))
    很明显这里就是取0x40eflags进行运算了,然后相信怎么修改大家也有明确了。
    比如这里eax得到0,注册码不成立,那么正确的应该是这样vm_p(not(0x40),0x216) = 0x40,也就是eax的值是0x40成立。后面还有vm_shr之类的运算,不过那是确定zf的。
    (这里想吐槽下EverEdit的作者,把sn一个一个读取的过程也vm了,跑了这么多行指令也是醉了)
    然后我们可以根据寄存器的情况,写个小脚本或者做补丁了。比如这样的:
    [Asm] 纯文本查看 复制代码
    bp 41744d
    
    start:
    run
    cmp eax,00000040
    jnz start
    cmp edx,FFFFFDB9
    jnz start
    cmp esp,0012E4E4
    jnz start
    
    end:
    bc 41744d
    ret
    当然我这里取esp做剪枝不太好,取esi,edi之类的更好。
    9.png
    停下来的时候修改寄存器的数值即可达到爆破的目的。
    10.png
    这里我直接修改edxnot(206)即可。然后这个软件好像是个重启验证,恩,有兴趣的可以研究研究。应该多改几次就可以了,估计不止一个jcc
    -----------------------------------------------------
    接着说下vmp3.x的爆破,其实差不多,不过vmp3.x比起之前的来说区别还是很多
    比如把handle更分散,用jmp等方法连接,然后还有一些检测。不过大家了解了vmp对于eflag的使用,那么应该没啥问题。
    这里给个最新版的点,以便于大家理解。trace into之后的对比前16w行即可
    [Asm] 纯文本查看 复制代码
    00423F89    8A45 0B         mov al,byte ptr ss:[ebp+0xB]
    00423F8C    8BE5            mov esp,ebp
    00423F8E    5D              pop ebp                                  ; EverEdit.00423ED3
    00423F8F    C2 0800         retn 0x8
    有兴趣的可以看看,当然都不是爆破这个软件的点。本身这个软件实现无限试用也不难。
    最后说下vmp。在未了解之前,就一直说听过。在了解了之后,才发现这个东西设计得多么细腻,从反汇编引擎到加壳的过程可以说是一个很顺畅的流程。当然vmp3.x重写了反汇编引擎(有点怪异..),然后想看怎么加壳发现流程被vm了。

    评分

    参与人数 15威望 +124 飘云币 +100 收起 理由
    飞腾小子 + 4 原创精品 感谢分享!
    Jongan + 4 赞一个!
    losers + 4 很给力!
    qq2068985434 + 4 很给力!
    syer + 4 很给力!
    九层楼 + 20 + 20 PYG有你更精彩!
    雷破天 + 4 厉害。。。。。。
    speedboy + 8 + 8 PYG有你更精彩!
    Anewbie + 4 + 4 衡量是不是大神的标志大家都看出来吧,NB
    tree_fly + 5 赞一个!

    查看全部评分

    本帖被以下淘专辑推荐:

    PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2021-7-31 10:39
  • 签到天数: 67 天

    [LV.6]常住居民II

    发表于 2018-2-22 17:12:01 | 显示全部楼层
    顶礼膜拜。玩VMP的都是大牛
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2023-12-24 15:31
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    发表于 2018-2-22 17:22:25 | 显示全部楼层
    师傅文章写得很详细 很厉害. 小菜拜读.

    点评

    竹子师傅新年好  详情 回复 发表于 2018-2-22 17:31
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2016-4-19 21:35
  • 签到天数: 3 天

    [LV.2]偶尔看看I

     楼主| 发表于 2018-2-22 17:31:21 | 显示全部楼层
    bambooqj 发表于 2018-2-22 17:22
    师傅文章写得很详细 很厉害. 小菜拜读.

    竹子师傅新年好
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2024-2-28 12:52
  • 签到天数: 978 天

    [LV.10]以坛为家III

    发表于 2018-2-23 01:07:56 | 显示全部楼层
    收藏备用,感谢分享~~
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-4-24 08:03
  • 签到天数: 489 天

    [LV.9]以坛为家II

    发表于 2018-2-23 09:08:58 | 显示全部楼层
    虽然看不懂,但是无法阻挡我来膜拜老大的。

    很高深,多搞一些爆破VMP的教程吧。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    8 小时前
  • 签到天数: 1394 天

    [LV.10]以坛为家III

    发表于 2018-2-23 11:02:17 | 显示全部楼层
    感谢楼主分享分析心得。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    7 小时前
  • 签到天数: 1462 天

    [LV.10]以坛为家III

    发表于 2018-2-23 18:55:58 | 显示全部楼层
    顶礼膜拜。玩VMP的都是大牛。
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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