彩票走势图

代码加壳保护软件VMProtect:Tls回调函数分析(上)

转帖|使用教程|编辑:杨鹏连|2021-07-20 14:20:36.827|阅读 287 次

概述:由于工作需要,经常会接触一些加过壳的软件,VMProtect是其中自己比较'欣赏'的一款加壳软件,Tls回调函数分析。

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

VMProtect是一种很可靠的工具,可以保护应用程序代码免受分析和破解,但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下,才能实现最好的效果。

VMProtect通过在具有非标准体系结构的虚拟机上执行代码来保护代码,这将使分析和破解软件变得十分困难。除此之外,VMProtect还可以生成和验证序列号,限制免费升级等等。

下载VMProtect最新试用版

VMProtect正版授权在线订购享受最低价,仅售801元起!还不赶紧加入你的订购清单?>>更多详情可点击咨询购买

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字节对齐的。

可以发现,上一节分析过的VmInitialize是VmCALL的一部分,将其改名为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的手工分析,终归不能令人满意,这也是需要改善的一点。

如果您对该加密/解密软件感兴趣,欢迎加入vmpQQ交流群:740060302


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP