由于工作需要,经常会接触一些加过壳的软件,VMProtect是其中自己比较’欣赏’的一款加壳软件,Tls回调函数分析。
VMProtect正版授权在线订购享受最低价,仅售801元起!还不赶紧加入你的订购清单/span>>>更多详情可点击咨询购买
Tls回调函数(上)
继续看下程序的Handler是如何计算的,查看VmJMP代码:

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

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


我们注意到会有多个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进行处理,非常感谢!