标 题: 【原创】Themida 2260 虚拟机 FISH 初探(一)
作 者: xiaohang
时 间: 2016-03-03,00:39:37
链 接: http://bbs.pediy.com/showthread.php?t=208207
这篇文章摘自一年前我的工作笔记,早就想放上来的,由于我懒,一直懒得整理编辑,老婆出差,闲着也是闲着,所以下定决心整理了一下,发出来抛砖引玉
以下是正文
前言:
著名的反虚拟机插件Oreans UnVirtualizer 已经升级到1.8 ,完全支持了对Themida 2.2.6.0 的FISH 虚拟机生成代码的还原 。
下面摘录自Oreans UnVirtualizer 的更新信息:
我尝试着通过对Oreans UnVirtualizer (以下称之为OU)的逆向,来学习Themida的FISH VM结构,有所心得,整理笔记,以成此文。
一下的内容是对VM FISH White 进行的分析,其他颜色的虚拟机可能部分适用,毕竟原理还是一样的。
VM FISH虚拟机的结构
VM FISH 虚拟机在我看来有些类似之前的CISC和RISC的组合,包含了两种指令集的特色,以增加逆向的难度。VM FISH white的结构大概可以分6个部分,他们分别是引导区域、VM入口、Handler表、Handler代码、VM context以及 OP code存储区。
引导区域
这个比较简单,引导区调用自程序代码段,主要任务是PUSH两个立即数,第一个是要使用的OP code 所保存的偏移量,第二个是第一个调用的handler序号。
注意堆栈是先进后出的,所以在栈顶的是handler的序号。
VM入口
和之前的CSIC类似,完成几个标准动作
1、首先是保存当前寄存器
2、计算VM context的偏移量
3、检测虚拟机的线程安全
4、保存参数如ImageBase和OP code 偏移
5、计算handler表的偏移
6、检测handler表是否已初始化,否则进行初始化
7、通过引导区给出的第一个handler序号,跳转到相应的handler开始VM的运行
这部分其实和CSIC比较起来没什么变化,所以初看起来就是CSIC,但是真正的变化在进入handler运行之后。
Handler表
这部分也没什么特别好说的,保存的是每个handler的偏移量,在VM入口中被初始化后就是绝对地址了。寻址方式就是一个数组,handler id 乘以4 加上handler表的基地址,就是相应handler 的指针了。
Handler 代码区
Handler 表往上看就是Handler代码区,handler表中每个指针都指向这一段区域的handler开始的位置。
VM context
Handler代码段往上看就是VM context了,保存了所有虚拟机运行过程中的数据,很类似CISC的VM context,只是这里要大很多,每个handler在读写context的时候都会有变化,不会有固定的类似CISC中专门的地方用来模拟eax的情况出现。
OP code存储区
这个就不解释了,保护时生成的OP code 就保存在这里。
VM FISH的Handler
Handler是VM Fish中的关键,可以说是VM Fish的核心,他的功能包括读取参数,处理Opcode,保存运算结果,对运算结果再加密,等等……
所以,理清Handler的工作原理,可以说基本上就弄明白了VM FISH的工作原理了。下面我们重点来探讨一下VM FISH中的Handler。
VM FISH的Handler类型
任何东西都是可以分门别类的,在程序的世界里尤其如此,当然,这也是最耗时,最磨人的工作。有幸的是,由于有了对OU的逆向,我不需要自己对所有的Handler分类了,我唯一要做的是理解这些分类的意义,并给他们命个自己,包括看客们能明白的名称而已。
0类 pop&push
由于虚拟机中对pop和push的使用最平凡,所以OU对其分类摆在了第一位。而具体处理pop还是push,是由handler读取OPCode中的参数决定。
1类 type1
这个类型从功能上比较难辨别,它里面其实包含很多种操作,具体执行哪个是由handler读取Opcode中的subhandle(subhandle的概念以后的章节会说明)决定的,但是有一个规律是可以抓住的,这些操作都是单一参数的汇编操作,如inc,dec,neg等等
2类 type2
这个类型从和上面的类型有很大的相似之处,就是包含多种操作,具体执行看Opcode中的subhandle,但是区别就在于它处理的都是带两个操作数的汇编操作,如sub,add等
3类xchg
这个比较好理解,就是单一模拟xchg这个汇编指令,至少我暂时没看出他有其他的什么功能。
4类流程控制
这个类型OU中分了好几个类型,那我就放在一起讲了,就是负责控制程序的流程的,当然就是模拟各种汇编中的jmp call ret jnz jz 等等的指令,功能也比较一目了然的。
5类 ESP控制
VM本质上是和宿主程序共用堆栈的,所以ESP的控制很重要,他必须要模拟宿主程序进入call和返回时候所有ESP操作,否则会出现堆栈异常甚至溢出。
6类中断操作类
程序中模拟clc cld cli等中断错作类的指令。
7类串操作类
模拟lods scas cmps等串操作类的指令
8类 popfd&pushfd
模拟popfd和pushfd的操作
9类 VM FISH中的自有操作
这些指令的存在不是为了模拟某种汇编指令,而是VM FISH为了自身运行而创造出来的,比如初始化,加密等等
最典型的就是初始化,再每次进入VM后,一般第一条OPCODE指令就是初始化指令,指向一个初始化handler的序号,以下是经过整理的一个典型初始化handler(注意是经过整理,源代码有很多混淆)
可以看到handler做的就是把所有的我称之为加密寄存器清零,(加密寄存器我以后再讲),然后读取OPCODE中的第二个handle序号,跳转到下一个handler去。
VM FISH中的handler是如何处理OPcode的
虚拟机被创造出来的目的就是以Opcode来替代原来PC中的指令,并加入混淆欺骗等等,以增加逆向的难度,这里我们就以VM处理Opcode为引,探索一下Themida Fish VM 是如何处理Opcode的,从而对Fish VM有个概念上的了解,并且其中还将详细的解说subhandle和加密寄存器的作用以及他们的运作机制。
这里,我就举handler中比较复杂的type2类型handler处理一段Opcode为例子,进行详细说明:
(未完待续……)
后面的内容看反馈再整理发布。
求版主发exetools的邀请码以资鼓励,给邀请码就越有动力整理发布嘛
另外,欢迎转载,但转载请说明出处哦,还有就是大家有兴趣一起研究新版本的themida动物园的,可以联系我,邮箱:xiaohang99@gmail.com ,共同探讨,一起进步
下篇已经发布: 【原创】Themida 2260 虚拟机 FISH 初探(二)
*转载请注明来自看雪论坛@PEdiy.com