奥特慢 发表于 2014-8-28 00:31

VMProtect完全解析之TLS

听朋友说程序加了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 , 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的引擎的解析,如果大家喜欢此类文章,后续我将继续发表相关文章。      

fjya 发表于 2014-8-28 00:53

学习中,支持啊。

qqlinhai 发表于 2014-8-28 00:38

支持楼主,收藏一个~

Shark恒 发表于 2014-8-28 03:52

心断空 发表于 2014-8-28 19:32

吾爱扣扣 发表于 2014-8-28 00:55
我还以为是原创

在没看这句话前。我还以为楼主很叼

小淫仙 发表于 2014-8-28 00:54

学习一下~~

吾爱扣扣 发表于 2014-8-28 00:55

我还以为是原创

mtkppqq 发表于 2014-8-28 00:57

这对小白来说,完全看不懂!

whoops宿命 发表于 2014-8-28 01:10

说话很流利。

xiaowenyu520 发表于 2014-8-28 01:22

年轻誑少 发表于 2014-8-28 01:38

呵呵,看不懂

hy5188 发表于 2014-8-28 02:58

看不懂!哈哈
页: [1] 2
查看完整版本: VMProtect完全解析之TLS