标 题: 【原创】Themida 2260 虚拟机 FISH 初探(一)
作 者: xiaohang
时 间: 2016-03-03,00:39:37
链 接: http://bbs.pediy.com/showthread.php?t=208207

引用:

标 题: 【原创】Themida 2260 虚拟机 FISH 初探 (二)
作 者: xiaohang
时 间: 2016-03-03,14:35:18
链 接: http://bbs.pediy.com/showthread.php?t=208217

这篇文章摘自一年前我的工作笔记,早就想放上来的,由于我懒,一直懒得整理编辑,老婆出差,闲着也是闲着,所以下定决心整理了一下,发出来抛砖引玉
以下是正文

Themida 2260 VM FISH 初探
by xiaohang99

前言:
著名的反虚拟机插件Oreans UnVirtualizer 已经升级到1.8 ,完全支持了对Themida 2.2.6.0 的FISH 虚拟机生成代码的还原 。
下面摘录自Oreans UnVirtualizer 的更新信息:

引用:

[v1.8]
- FISH BLACK variant avaible
- Fixed deofuscation order (GenV6)
- New deofucation scheme for FISH machine
- New smart code tracer for FISH machines
- Stack sort for FISH commands
- Improved management of memory (faster deofuscation)
- Added movzx reg32, [esp+eax+memoffset] on CISC machines
- Added a message prompt when the opcode buffer is not enough
- Added LEAVE instruction for FISH machines
- Added support for CALLs to VM section in FISH machines
- CHECK_PROTECTION macro disabled, now it must be restored by hand
- Fixed QWORD incorrect names for some opcodes
- Fixed a problem when deofuscating RISC machines

我尝试着通过对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

引用:

loc_1003ED83: ; jumptable 1003ED7C case 0
mov ecx, [ebp+arg_0_pTheMidaFishOpcode]
push ecx
mov edx, [ebp+arg_4_pOVopIAT]
push edx
mov ecx, [ebp+var_4]
call j_Make_pop
jmp loc_1003EF53

由于虚拟机中对pop和push的使用最平凡,所以OU对其分类摆在了第一位。而具体处理pop还是push,是由handler读取OPCode中的参数决定。

1类 type1

引用:

loc_1003ED98: ; jumptable 1003ED7C case 1
mov eax, [ebp+arg_0_pTheMidaFishOpcode]
push eax
mov ecx, [ebp+arg_4_pOVopIAT]
push ecx
mov ecx, [ebp+var_4]
call j__make_handle_type1_function
jmp loc_1003EF53

这个类型从功能上比较难辨别,它里面其实包含很多种操作,具体执行哪个是由handler读取Opcode中的subhandle(subhandle的概念以后的章节会说明)决定的,但是有一个规律是可以抓住的,这些操作都是单一参数的汇编操作,如inc,dec,neg等等

2类 type2

引用:

loc_1003EDAD: ; jumptable 1003ED7C case 2
mov edx, [ebp+arg_0_pTheMidaFishOpcode]
push edx
mov eax, [ebp+arg_4_pOVopIAT]
push eax
mov ecx, [ebp+var_4]
call j__make_handle_type2_function
jmp loc_1003EF53

这个类型从和上面的类型有很大的相似之处,就是包含多种操作,具体执行看Opcode中的subhandle,但是区别就在于它处理的都是带两个操作数的汇编操作,如sub,add等

3类xchg

引用:

loc_1003EDC2: ; jumptable 1003ED7C case 4
mov ecx, [ebp+arg_0_pTheMidaFishOpcode]
push ecx
mov edx, [ebp+arg_4_pOVopIAT]
push edx
mov ecx, [ebp+var_4]
call j_make_xchg
jmp loc_1003EF53

这个比较好理解,就是单一模拟xchg这个汇编指令,至少我暂时没看出他有其他的什么功能。

4类流程控制
这个类型OU中分了好几个类型,那我就放在一起讲了,就是负责控制程序的流程的,当然就是模拟各种汇编中的jmp call ret jnz jz 等等的指令,功能也比较一目了然的。

5类 ESP控制
VM本质上是和宿主程序共用堆栈的,所以ESP的控制很重要,他必须要模拟宿主程序进入call和返回时候所有ESP操作,否则会出现堆栈异常甚至溢出。

6类中断操作类

引用:

loc_1003EE94: ; jumptable 1003ED7C case 31
mov eax, [ebp+arg_0_pTheMidaFishOpcode]
push eax
mov ecx, [ebp+arg_4_pOVopIAT]
push ecx
mov ecx, [ebp+var_4]
call j_Handler_type_1F ; clc cld cli cmc stc std sti
jmp loc_1003EF53

程序中模拟clc cld cli等中断错作类的指令。

7类串操作类

引用:

loc_1003EED3: ; jumptable 1003ED7C cases 14-28
mov eax, [ebp+arg_0_pTheMidaFishOpcode]
push eax
mov ecx, [ebp+arg_4_pOVopIAT]
push ecx
mov ecx, [ebp+var_4]
call j_make_str_fun
jmp short loc_1003EF53

模拟lods scas cmps等串操作类的指令

8类 popfd&pushfd
模拟popfd和pushfd的操作

9类 VM FISH中的自有操作
这些指令的存在不是为了模拟某种汇编指令,而是VM FISH为了自身运行而创造出来的,比如初始化,加密等等
最典型的就是初始化,再每次进入VM后,一般第一条OPCODE指令就是初始化指令,指向一个初始化handler的序号,以下是经过整理的一个典型初始化handler(注意是经过整理,源代码有很多混淆)

引用:

// FISH Virtual Handler 0000 00422A0F
00422A17 MOV DWORD PTR [EBP+0x53],0x0
00422A25 MOV DWORD PTR [EBP+0xa7],0x0
00422A33 MOV DWORD PTR [EBP+0x89],0x0
00422A41 MOV DWORD PTR [EBP+0x14],0x0
00422A4F MOV DWORD PTR [EBP+0x8f],0x0
00422A5D MOV WORD PTR [EBP+0xa0],0x0
00422A6A MOV BYTE PTR [EBP+0x57],0x0
00422A75 MOV DWORD PTR [EBP+0x68],0x0
00422A88 MOV ESI,DWORD PTR [EBP+0x8]
00422A8A ADD ESI,0x0
00422A90 MOV DI,WORD PTR [ESI]
00422A93 SHL EDI,0x2
00422A9E MOV ESI,DWORD PTR [EBP+0x4f]
00422AA0 ADD ESI,EDI
00422AA2 MOV EDX,DWORD PTR [ESI]
00422AAB ADD DWORD PTR [EBP+0x8],0x2
00422AB1 JMP EDX

可以看到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

转载于:https://www.cnblogs.com/Reverser/p/5240501.html

【原创】Themida 2260 虚拟机 FISH 初探(一)相关推荐

  1. 虚拟服务器蓝屏,【原创】在虚拟机中运行系统导致实机系统蓝屏“0x000000F4”原因分析。...

    本帖最后由 羊羔助手 于 2020-3-26 16:48 编辑 在虚拟机中运行系统导致实机系统蓝屏"0x000000F4"原因分析. 通常虚拟机中的系统是与实机的系统没有任何关联的 ...

  2. 如何分析虚拟机系列(1):新手篇VMProtect 1.81 Demo

    原文网址:https://www.52pojie.cn/thread-713219-1-5.html 序言 (本贴也发布于看雪:https://bbs.pediy.com/thread-225262. ...

  3. 攻防世界 simple-unpack 之UPX脱壳初探

    目录 0x01 "壳"what? 0x02 加壳的目的和作用 0x03 常见壳介绍 0x04 查壳 0x05 脱壳 0x01 "壳"what? 计算机软件中有一 ...

  4. Ubuntu设置虚拟机共享目录在mnt下无法显示文件

    ---------------- 版权声明:本文为CSDN博主「Orville778」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://bl ...

  5. 反病毒软件技术简析与探索(2009年5月18日)

    <下文是本人大三时期的一篇课外小论文,是基于大量的对杀毒软件杀毒能力的实验结果而写,请勿转载,谢谢.> 摘  要 为什么即使有杀毒软件的保护,还是有那么多的计算机系统遭到病毒的侵袭呢?答案 ...

  6. 新老压缩/加密壳大全洪雨收集推荐

    upx.aspack.fsg.Aspack Scrambler.ExeStealth.ID Application Protector.V2Packer.WWPack32.XComp0.98.bamb ...

  7. 脱壳入门初级教学(第四课 常见压缩壳与加密壳)

    转自:http://bestmk.cn/thread-491.htm 加壳软件按照其加壳目的和作用,可分为两类:一是压缩(Packers),二是保护(Protectors).压缩这类壳主要目的是减小程 ...

  8. 291计算机毕业设计

    原创基于JAVA和XML的网络数据交换之研究及其应用.rar http://dl.vmall.com/c07q338ekp 最新基于JSP+SQL Server 2005技术的云师大住房公积金管理系统 ...

  9. 软件加密系统Themida应用程序保护指南(四):虚拟机的选择

    Themida是先进的Windows软件保护系统,它被用于满足软件开发人员对于所开发应用程序安全保护的需求,使其远离被先进的逆向工程和软件破解的危险.Themida采用最新最强大的软件保护技术Secu ...

最新文章

  1. 【GLib】GLib学习笔记(二):源码编译
  2. 基础IPsec-remote基本配置
  3. 从另一个分支在Git中创建一个分支
  4. 【Linux 内核 内存管理】RCU 机制 ① ( RCU 机制简介 | RCU 机制的优势与弊端 | RCU 机制的链表应用场景 )
  5. 编程范式,程序员的编程世界观
  6. 成功解决You are using pip version 9.0.1, however version 9.0.3 is available. You should consider upgra
  7. 数据流DataInput(Output)Stream 和 字节数组流 ByteArrayInput(Output) Stream
  8. Java数组和Arrays类
  9. HOG特征(Histogram of Gradient)总结
  10. java对象初始化顺序的简单验证
  11. React 编程思想 正反向数据流(单向数据流) 为了好理解我才叫正反向
  12. C语言结构体练习-互动粒子仿真
  13. AI入门,从每个人都应该学的AI第一课开始
  14. Name Mangling and extern “C” in C++
  15. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_07-CMS需求分析-SSI服务端包含技术...
  16. web1:http协议简介和用netassist和py程序当http服务器
  17. 能源管理系统—能源在线监测平台搭建
  18. 15个富有创意的单页设计
  19. Android开源项目 陌客随机聊天
  20. mwt是什么意思网络用语_skr、xswl、zsqg…这些网络用语你知道是什么意思吗?

热门文章

  1. AE-新知识-关于快捷键“U”和“S”
  2. iOS小技能:开发iOS项目的步骤
  3. DayDayUp:计算机技术与软件专业技术资格证书之《系统集成项目管理工程师》证书考试历年真题及其解析之2017年/2018年
  4. Google组织架构不学传统大公司
  5. 哈尔滨理工大学第七届程序设计竞赛初赛 题集
  6. 0514课的预习任务
  7. 集装箱RFID物流运输管理系统应用
  8. InSAR 道路提取
  9. Keepass密码管理,windows+安卓+Onedrive实现云同步
  10. Java操作Bat文件,启动Bat