首页
论坛
课程
招聘
[原创]VMProtect分析(二)
2021-7-13 17:58 11174

[原创]VMProtect分析(二)

2021-7-13 17:58
11174

VmProtect分析(一)


Tls回调函数(上)

继续看下程序的Handler是如何计算的,查看VmJMP代码:

算法教简单:Handler表中根据BYTE:[RSI-1]取偏移,循环右移5 ,再加上Handler基址

寄存器状态如下:

程序的Handler(部分截图)00007FF7C63B065C , L800):


Handler数量有0n256个之多,我们此次将Tls回调函数作为分析目标,先走一小步,只看那些会用到的,没用到的先不管它。

首先需要确定Tls回调函数的结束地址,在启动中断在Tls时,查看调用栈(下图),Tls回调执行完毕后,会返回到00007FFDBB969A1D这个地址,可以在这个地址下断,用于标识Tls回调函数已经执行完毕。


然后我们写个插件,用于辅助分析Handler,插件注册了4个命令(插件源码见附件vm_plug):

写脚本如下:

    vardel $handlerTable
    vardel $handlerCount
    vardel $handlerBaseAddress
    vardel $vmJmp
    vardel $tlsEnd
    var $handlerTable, VMP_UserDebugger.exe:0 + 19065C 
    var $handlerCount, 0x100
    var $handlerBaseAddress, VMP_UserDebugger.exe:0 - 54F80000
    var $vmJmp, VMP_UserDebugger.exe:0 + 18C8F2
    var $tlsEnd, ntdll.dll:0 + 19A1D
    clearlog
    vmtraceclear
    vminit $handlerTable
    bd
    bp $tlsEnd
    bp $vmJmp  
    SetBreakpointSilent $tlsEnd
    SetBreakpointSilent $vmJmp 
.begin:
    be $tlsEnd
    be $vmJmp
    g
    bd $vmJmp
    bd $tlsEnd
.loop:
    cmp cip, $tlsEnd
    jz .leave
    cmp cip, $vmJmp
    jz .trace
    log "Unexpected breakpoit: {p:rip}"
    jmp .leave   
.trace:
    vmtracestart "vm_{p:rcx}", 1
    cmp $result, 1
    jnz .begin
    ticnd "cip == $vmJmp || cip == $tlsEnd"
    vmtracestop
    jmp .loop
.leave:
    bd $tlsEnd
    bd $vmJmp
    ret

调试启动程序,中断在Tls回调函数起始处,执行上文脚本,各个handler的trace文件会以名字vm_[handler地址].trace64保存至X64DBG所在文件夹下(可调用vmclear删除),跟踪文件见附件trace.zip。


分析各个Handler(需要一点耐心),根据实现定义伪操作码如下:

看几个有代表性的Handler:

从上面两个Handler可以判断出栈应是2字节对齐的。


可以发现,上一节分析过的VmInitializeVmCALL的一部分,将其改名为VmCallInitialize。


我们注意到会有多个Handler实现同一个功能


重新调试执行程序,修改脚本,使用已分析的Handler翻译程序(vmdump):

    vardel $handlerTable
    vardel $handlerCount
    vardel $handlerBaseAddress
    vardel $vmJmp
    vardel $tlsEnd
    var $handlerTable, VMP_UserDebugger.exe:0 + 19065C 
    var $handlerCount, 0x100
    var $handlerBaseAddress, VMP_UserDebugger.exe:0 - 54F80000
    var $vmJmp, VMP_UserDebugger.exe:0 + 18C8F2
    var $tlsEnd, ntdll.dll:0 + 19A1D
    clearlog
    vmtraceclear
    vminit $handlerTable
    bd
    bp $tlsEnd
    bp $vmJmp  
    SetBreakpointSilent $tlsEnd
    SetBreakpointSilent $vmJmp 
.begin:
    g
.loop:
    cmp cip, $tlsEnd
    jz .leave
    cmp cip, $vmJmp
    jz .dump
    log "Unexpected breakpoit: {p:rip}"
    jmp .leave   
.dump:
    vmdump rcx, rsi, rbx
    jmp .begin
.leave:
    bd $tlsEnd
    bd $vmJmp
    ret


得到伪代码如下(见附件vm_tls.txt):

[Anakin] VmPOP V_98
[Anakin] VmPUSH FFFFFFFF9F5A5C32
[Anakin] VmADD
[Anakin] VmPOP V_40
[Anakin] VmPOP V_B8
[Anakin] VmPOP V_28
[Anakin] VmPOP V_18
[Anakin] VmPOP V_00
[Anakin] VmPOP V_78
[Anakin] VmPOP V_A0
[Anakin] VmPOP V_90
[Anakin] VmPOP V_40
[Anakin] VmPOP V_20
[Anakin] VmPOP V_68
[Anakin] VmPOP V_50
[Anakin] VmPOP V_58
[Anakin] VmPOP V_30
[Anakin] VmPOP V_B0
[Anakin] VmPOP V_38
[Anakin] VmPOP V_48
[Anakin] VmPOP V_70
[Anakin] VmPOP V_88
[Anakin] VmPOP V_10
[Anakin] VmPOP V_A8
[Anakin] VmPUSH 0000000064765E24
[Anakin] VmPUSHB8 00
[Anakin] VmPUSH 000000014018B3E7
[Anakin] VmPUSH V_98
[Anakin] VmADD
[Anakin] VmPOP V_08
[Anakin] VmREADB
[Anakin] VmSBP
[Anakin] VmREADB
[Anakin] VmNOTANDB
[Anakin] VmPOP V_60
[Anakin] VmADDB
[Anakin] VmPOP V_10
...
...
...

3W多行的汇编代码已然被翻译为300多行的伪代码,是一个较大的进步,后面我们需要进一步分析这些伪代码,进而把Tls回调的执行搞清楚。

另一方面,一个一个地进行Handler的手工分析,终归不能令人满意,这也是需要改善的一点。



[公告] 欢迎大家踊跃尝试高研班11月试题,挑战自己的极限!

最后于 2021-7-13 18:07 被Anakin Stone编辑 ,原因:
上传的附件:
收藏
点赞4
打赏
分享
最新回复 (3)
雪    币: 44
活跃值: 活跃值 (114)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
天月 活跃值 2021-7-13 18:08
2
0
雪    币: 954
活跃值: 活跃值 (1340)
能力值: ( LV6,RANK:85 )
在线值:
发帖
回帖
粉丝
tobeabel 活跃值 1 2021-7-14 15:02
3
0
就等大佬带我学vmp了
雪    币: 63
活跃值: 活跃值 (360)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hemdacker 活跃值 2021-7-14 20:31
4
0
这种分析文章没有“为什么”,毫无意义。
游客
登录 | 注册 方可回帖
返回