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

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

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

Tls回调函数(上)

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

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

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

寄存器状态如下:

代码加壳保护软件VMProtect:Tls回调函数分析(上)程序的Handler表(部分截图)(00007FF7C63B065C , L800):

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

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

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

代码加壳保护软件VMProtect:Tls回调函数分析(上)
然后我们写个插件,用于辅助分析Handler,插件注册了4个命令(插件源码见附件vm_plug):

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

    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(需要一点耐心),根据实现定义伪操作码如下:

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

看几个有代表性的Handler:

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

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

代码加壳保护软件VMProtect:Tls回调函数分析(上)可以发现,上一节分析过的VmInitialize是VmCALL的一部分,将其改名为VmCallInitialize。
代码加壳保护软件VMProtect:Tls回调函数分析(上)

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

我们注意到会有多个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交流群:

标签:

来源:慧都

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年6月17日
下一篇 2021年6月17日

相关推荐

发表回复

登录后才能评论