CVE漏洞中文网

0DayBank一个专门收集整理全球互联网漏洞的公开发布网站
  1. 首页
  2. 百科
  3. 正文

vmprotect

2017年5月22日 797点热度 0人点赞 0条评论
  • 首页
  • 分类阅读
  • 文库
  • 专栏
  • 公开课
  • 商城
  • 漏洞盒子
注册 | 登录
投稿

VMProtect完全解析之TLS

cxh8524562014-08-26+10共198600人围观 ,发现 11 个不明物体终端安全

听朋友说程序加了VMProtect后,很难破解,今天我们就来看看这个保护有多难。首先先分析下VMProtect最早执行的部分–TLS。今天我们的样本就先看看VMProtect的主程序,我用的是VMProtect Ultimate v 2.12.3版本,网上搜一下就可以下载得到。

VMProtect主要实现了一个自己的虚拟机,通过解析执行来完成相关的工作,直接看他的引擎本文暂不描述,我自己写了个解析器。将TLS部分解析后如下:

           SetReg32 38
           GetImm32 9711ACF7
           Add32
           SetReg32 0C
           SetReg32 2C
           SetReg32 30
           SetReg32 20
           SetReg32 34
           SetReg32 24
           SetReg32 08
           SetReg32 14
           SetReg32 3C
           SetReg32 10
           SetReg32 18
           SetReg32 1C
           SetReg32 28
           GetImm32 45569F07
           GetImm16 0000
           GetImm32 01179B0A   ===================== cmp byte ptr [0x01179b0a], 0
           RmDs8
           GetEsp32
           RmSs8
           NNA8
           SetReg32 04
           Add8
           SetReg32 28
           GetEsp32
           RmSs8
           NNA8
           SetReg32 0C
           SetReg8 1C
           GetReg32 28
           GetReg32 28
           NNA32
           SetReg32 08
           GetImm32 FFFFF7EA
           NNA32
           SetReg32 3C
           GetReg32 0C
           GetReg32 0C
           NNA32
           SetReg32 3C
           GetImm32 00000815
           NNA32
           SetReg32 04
           Add32
           SetReg32 00
           SetReg32 04
           GetImm32 449A0010
           GetEsp32
           GetImm16 0004
           GetReg32 04
           GetImm32 FFFFFFBF
           NNA32
           SetReg32 28
           Shr32
           SetReg32 08
           Add32
           SetReg32 00
           RdSs32
           jne -> 449A0010:45569F07
           SetReg32 1C
           SetReg32 3C
           SetReg32 00
           GetReg32 1C
           SetReg32 00
           GetReg32 00
           GetEsp32
           RdSs32
           NNA32
           SetReg32 08
           GetImm32 BBBEF8A6
           NNA32
           SetReg32 3C
           GetReg32 00
           GetImm32 44410759
           NNA32
           SetReg32 08
           NNA32
           SetReg32 3C
           SetReg32 08
           GetReg32 2C
           GetReg32 18
           GetReg32 04
           GetReg32 20
           GetReg32 34
           GetReg32 18
           GetReg32 10
           GetReg32 24
           GetReg32 30
           GetReg32 00
           GetReg32 14
           GetImm32 68EE5309
           GetReg32 2C
           Add32
           SetReg32 0C
           GetReg32 38
           GetReg32 08
           SetEip

首先检测 0x01179B0A 是否初始化,这个值关系着后面的流程,如果这个被置1,后面就不会检测入口的断点。我们接着看第二部分:

           ===================================================================
           ===== Jne 00DB0749 0117985E
           ===================================================================
           =====00DB0749 00DB0749
           SetReg32 24
           GetImm32 9711ACF7
           Add32
           SetReg32 04
           SetReg32 00
           SetReg32 1C
           SetReg32 38
           GetReg32 38
           GetReg32 38
           NNA32
           SetReg32 10
           GetImm32 BBBEF8A6
           NNA32
           SetReg32 08
           GetReg32 38
           GetImm32 44410759
           NNA32
           SetReg32 10
           NNA32
           SetReg32 18
           SetReg32 20
           SetReg32 04
           SetReg32 30
           SetReg32 34
           SetReg32 28
           SetReg32 10
           SetReg32 3C
           SetReg32 0C
           SetReg32 2C
           SetReg32 08
           GetReg32 0C
           GetReg32 30
           GetReg32 3C
           GetReg32 04
           GetReg32 1C
           GetReg32 10
           GetReg32 34
           GetImm32 55D02669
           GetImm32 01179B0A
           GetImm32 00400000     =============================Image base
           SetReg32 2C
           GetImm32 0000003C     =============================PeOffset
           GetReg32 2C
           Add32
           SetReg32 18
           RmDs32
           SetReg32 08
           GetReg32 2C
           GetReg32 08
           Add32
           SetReg32 30
           SetReg32 18           ==============================PeHead
           GetImm32 00000028     ==============================Pe Entry offset
           GetReg32 18
           Add32
           SetReg32 30
           RmDs32
           GetEsp32
           RdSs32
           SetReg32 34
           GetReg32 2C
           Add32
           SetReg32 08
           SetReg32 30
           GetImm16 00CC         ================================INT 3断点
           GetReg32 30
           RmDs8
           GetEsp32
           RmSs8
           NNA8
           SetReg32 18
           Add8
           SetReg32 34
           GetEsp32
           RmSs8
           NNA8
           SetReg32 18
           SetReg8 08
           GetReg32 34
           GetEsp32
           RdSs32
           NNA32
           SetReg32 20
           GetImm32 FFFFF7EA
           NNA32
           SetReg32 0C
           GetReg32 18
           GetEsp32
           RdSs32
           NNA32
           SetReg32 08
           GetImm32 00000815
           NNA32
           SetReg32 14
           Add32
           SetReg32 20
           SetReg32 14
           SetReg32 08
           GetImm32 55D026FC
           GetEsp32
           GetImm16 0004
           GetReg32 14
           GetImm32 FFFFFFBF
           NNA32
           SetReg32 3C
           Shr32
           SetReg32 20
           Add32
           SetReg32 3C
           RdSs32
           jne -> 55D026FC:55D02669
           SetReg32 3C
           SetReg32 38
           SetReg32 34
           GetReg32 3C
           SetReg32 34
           GetReg32 34
           GetEsp32
           RdSs32
           NNA32
           SetReg32 20
           GetImm32 AB37E0B8
           NNA32
           SetReg32 3C
           GetReg32 34
           GetImm32 54C81F47
           NNA32
           SetReg32 20
           NNA32
           SetReg32 20
           SetReg32 38
           GetReg32 2C
           GetReg32 10
           GetReg32 10
           GetReg32 28
           GetReg32 2C
           GetReg32 04
           GetReg32 14
           GetReg32 30
           GetReg32 28
           GetReg32 1C
           GetReg32 08
           GetReg32 00
           GetImm32 68EE5309
           Add32
           SetReg32 0C
           GetReg32 24
           GetReg32 38
           SetEip

从上面的代码可以看出,VMProtect直接检测了入口的CC断点,因此,如果我们OD直接停在入口点的话将会被检测到。

           ===================================================================
           =====011839BB 011839BB
           SetReg32 3C
           GetImm32 9711ACF7
           Add32
           SetReg32 18
           SetReg32 20
           SetReg32 2C
           SetReg32 04
           SetReg32 08
           SetReg32 0C
           SetReg32 38
           SetReg32 00
           SetReg32 28
           SetReg32 34
           GetReg32 34
           GetReg32 34
           NNA32
           SetReg32 14
           GetImm32 AB37E0B8
           NNA32
           SetReg32 10
           GetImm32 54C81F47
           GetReg32 34
           NNA32
           SetReg32 24
           NNA32
           SetReg32 30
           SetReg32 14
           SetReg32 24
           SetReg32 10
           SetReg32 30
           GetImm16 0001                =======================如果检测到了就写入1
           GetImm32 00000001            =======================记录地址偏移1(0x01179b0a+1)
           GetReg32 2C
           Add32
           SetReg32 30
           WmDs8
           GetImm32 0000027B
           GetReg32 30
           GetReg32 24
           GetReg32 14
           SetReg32 18
           GetReg32 18
           GetEsp32
           RdSs32
           NNA32
           SetReg32 10
           GetImm32 AB37E0B8
           NNA32
           SetReg32 1C
           GetImm32 54C81F47
           GetReg32 18
           NNA32
           SetReg32 1C
           NNA32
           SetReg32 10
           GetReg32 28
           GetReg32 00
           GetReg32 38
           GetReg32 0C
           GetReg32 08
           GetReg32 04
           GetReg32 2C
           GetImm32 68EE5309
           GetReg32 20
           Add32
           SetReg32 30
           GetReg32 3C
           SetReg32 1C
           GetImm32 9711ACF7
           Add32
           SetReg32 3C
           SetReg32 34
           SetReg32 3C
           SetReg32 30
           SetReg32 10
           SetReg32 20
           SetReg32 04
           SetReg32 0C
           SetReg32 38
           SetReg32 28
           GetReg32 28
           GetEsp32
           RdSs32
           NNA32
           SetReg32 2C
           GetImm32 AB37E0B8
           NNA32
           SetReg32 18
           GetReg32 28
           GetImm32 54C81F47
           NNA32
           SetReg32 08
           NNA32
           SetReg32 08
           SetReg32 2C
           SetReg32 00
           SetReg32 24
           SetReg32 14
           SetReg32 14
           SetReg32 24
           SetReg32 00
           SetReg32 18
           SetReg32 30
           SetReg32 08
           SetReg32 38
           GetReg32 38
           GetReg32 38
           NNA32
           SetReg32 0C
           GetImm32 000008FF
           NNA32
           SetReg32 0C
           AddEsp4
           GetEsp32
           RdSs32
           GetEsp32
           GetImm32 00000010
           Add32
           SetReg32 0C
           WmSs32
           SetReg32 3C
           SetReg32 3C
           SetReg32 04
           GetReg32 10
           GetReg32 14
           GetReg32 38
           GetReg32 00
           GetReg32 2C
           GetReg32 08
           GetReg32 24
           GetReg32 30
           GetReg32 18
           GetReg32 0C
           GetReg32 0C

TLS中只是将检测结果保存起来,然后在入口点之后的代码里检测这个标志位,我们只要在入口点将这个值改成0,后面就不会显示检测到调试器,当然后面的检测还有,下次再分享,本文就不再描述。

总结:整个TLS的过程不复杂,复杂的是对VMProtect的引擎的解析,如果大家喜欢此类文章,后续我将继续发表相关文章。  

cxh8524561 篇文章等级: 1级
|
|
  • 上一篇:极限黑客破解:低温环境下读取Android加密数据
  • 下一篇:小米手机MIUI远程代码执行漏洞分析

这些评论亮了

  • fans回复
    @anlfi  anlfi大牛我关注你很久了。
    作者再发这样长的代码,我的滚轮就要报废了
    )17(亮了
发表评论

已有 11 条评论

  • anlfi (5级) 2014-08-26回复1楼

    不说了他的引擎虽然好 但据我了解已经被吃透了

    亮了(3)
    • fans 2014-08-26回复

      @anlfi  anlfi大牛我关注你很久了。
      作者再发这样长的代码,我的滚轮就要报废了

      亮了(17)
  • lanker 2014-08-26回复2楼

    期待引擎分析文章 TLS还是没太明白 期待楼主继续科普VMP 十分感谢!

    亮了(2)
  • fakemac (1级) 2014-08-26回复3楼

    自己写的解析器,好牛x。
    完全看不懂。。

    亮了(2)
  • yjd (4级) 2014-08-27回复4楼

    fb难得有逆向文章。

    亮了(2)
  • chansim (1级) 2014-08-27回复5楼

    最近我也在研究逆向工程,大牛继续啊!

    亮了(1)
  • yyyy3333 2014-08-27回复6楼

    能自己玩VM TMD 滴 ……都算高手了吧。。。

    看清楚 是自己玩。。。 别照着网上的文章依葫芦画瓢 然后自称可以脱VM了。。。

    亮了(2)
  • 浩天寰宇 (3级)猴子是我请来的逗比~ 2014-08-27回复7楼

    :oops: 赞!

    亮了(1)
  • netorgcom (4级) 2014-08-31回复8楼

    太牛鼻了`~~~~

    亮了(0)
  • test 2014-09-02回复9楼

    这文真有意思。。贴一堆东西,然后说,看就这样了。

    这能叫分析、解析么。。这叫贴结论。

    亮了(1)
  • 不愿透露姓名的王尼玛 2014-10-13回复10楼

    滚轮滚三滚,一篇文章完成

    亮了(0)

必须您当前尚未登录。登陆?注册

必须(保密)

表情插图

取消

cxh852456

这家伙太懒,还未填写个人描述!

1 篇文章3 条评论

相关阅读

  • 圣经和古兰经APP中被发现监控木马
  • 2016宏病毒分析及预防报告(1-2月)
  • mobile app security PPT下载
  • FBI 警告:让物联网设备远离网络
  • 刷机教程:教你如何打造一台渗透测试手机

特别推荐

关注我们 分享每日精选文章

不容错过

  • 「安全大咖说」专访360核心安全负责人:郑文彬(MJ0011)| FB视频Sophia2016-07-13
  • 混搭新式:社工+powershell,轻松畅游主机东二门陈冠希2016-05-30
  • GSM Hacking:使用BladeRF、树莓派、YatesBTS搭建便携式GSM基站鸢尾2016-04-25
  • 隔墙有耳:黑客可以“听到”离线计算机的密钥GeekPwn2016-02-17

FREEBUF

  • 免责声明
  • 关于我们
  • 加入我们

广告及服务

  • 寻求报道
  • 广告合作
  • 联系我们
  • 友情链接

关注我们

  • 官方微信
  • 新浪微博
  • 腾讯微博
  • Twitter

赞助商

Copyright © 2013 WWW.FREEBUF.COM All Rights Reserved 沪ICP备13033796号

css.php

正在加载中...

0daybank

标签: 暂无
最后更新:2017年5月22日

小助手

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

COPYRIGHT © 2024 www.pdr.cn CVE漏洞中文网. ALL RIGHTS RESERVED.

鲁ICP备2022031030号

联系邮箱:wpbgssyubnmsxxxkkk@proton.me