【原创】Themida 2260 虚拟机 FISH 初探(一)
标 题: 【原创】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
这篇文章摘自一年前我的工作笔记,早就想放上来的,由于我懒,一直懒得整理编辑,老婆出差,闲着也是闲着,所以下定决心整理了一下,发出来抛砖引玉
以下是正文
前言:
著名的反虚拟机插件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 的指针了。
类 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
类 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
类 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
类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
类类 ESP控制
类中断操作类
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
类串操作类
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
类 popfd&pushfd
类 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
【原创】Themida 2260 虚拟机 FISH 初探(一)的更多相关文章
- Java虚拟机 safepoints 初探
safepoint的定义很不规范,还跟JVM的具体实现有关,我们的讨论主要针对Hotspot VM. 先看看openjdk的官方解释: http://openjdk.java.net/groups/ ...
- java 基础 --- volatile
问题 : volatile 解决的是什么问题 有什么应用场景 概述 某些共享变量的时候我们使用volatile 修饰,它会保证修改的值立即被更新到主存,或是从主存中获取最新的值.它的底层是如何实现的 ...
- (原创)LAMP教程5-配置VirtualBox虚拟机中centos6.4的网卡
(原创)LAMP教程5-配置VirtualBox虚拟机中centos6.4的网卡 是的,今天我们要讲的是如何配置VirtualBox虚拟机中centos6.4的网卡,毕竟我们是要做网站开发的,没有网络 ...
- (原创)LAMP教程1-下载虚拟机软件
(原创)LAMP教程1 从今天开始会在我的博客更新LAMP教程,第一章节就是安装虚拟机,因为不可能所有的人都有机会操作服务器,所以今天我打算教大家用虚拟机安装配置当下比较流行的框架,lamp. 好了费 ...
- [原创]ASM动态修改JAVA函数之函数字节码初探
ASM是非常强大的JAVA字节码生成和修改工具,具有性能优异.文档齐全.比较易用等优点.官方网站:http://asm.ow2.org/ 要想熟练的使用ASM,需要对java字节码有一定的了解,本文重 ...
- 【原创】ubuntu14.04 LTS系统VMware虚拟机内Windows server 2008 r2系统的网络配置
主系统:ubuntu14.04 LTS 虚拟机:VMware 内系统:Windows server 2008 r2 主系统IP:任何IP 内系统IP:192.168.202.128(自动获取,如果不是 ...
- 【原创】主机不能访问虚拟机CentOS7中的站点
主机不能访问虚拟机CentOS7中的站点 ================================ 虚拟机上装好了centos7,并配好了nginx+php+mysql,但是本机就是无法访问. ...
- [原创]Windows Server 2003 物理机转换为VMware虚拟机出现VSS错误的处理
一台Windows Server 2003 物理机需要转换为VMware虚拟机,工具为Vmware vCenter Converter Standalone 6.0,转换开始就出现错误“FAILED: ...
- [原创]VM虚拟机Centos6.4网络配置。
关于虚拟机VMware 3种网络模式(桥接.nat.Host-only)的工作原理http://www.cnblogs.com/hehexiaoxia/p/4042583.html 操作环境 主机:W ...
随机推荐
- jQuery动态添加和删除表格行
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- x-admin
https://blog.csdn.net/u014793102/article/details/80316335
- linux系统基础优化及高级操作命令
Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. ifconfig 查询.设置网卡和 ...
- 一次高IO下的GC分析之旅
一次高IO下的GC分析之旅 编码前线 关注 2018.12.21 00:06 字数 597 阅读 45评论 0喜欢 0 起因:收到GC STW报警 [监控系统]Total time for which ...
- 解析XML的几种方式:DOM、SAX、PULL
DOM解析 解析器读入整个文档,然后构建一个主流内存的树结构,然后代码就可以使用dom接口来操作这个树结构. 优点: 整个文档树在内存中,便于操作:支持删除.修改.重新排列等多种功能. 通过树形结构存 ...
- DH加密算法
http://blog.csdn.net/zbw18297786698/article/details/53609794
- leetcode-easy-math-412 Fizz Buzz
mycode 99.06% class Solution(object): def fizzBuzz(self, n): """ :type n: int :rtype ...
- ORCAD导网表:遇"No_connect" property
问题: Orcad Capture中将No Connect标识放置到了原本应该放置连线的管脚上,不知道怎么删除. 虽然添加一根Wire可以掩盖该管脚上已经添加的No Connect标识,但是到处网表的 ...
- javascript - 事件详解(阻止事件冒泡+阻止事件行为)
一.事件流 1.事件流 描述的是在页面中接受事件的顺序 2.事件冒泡 由最具体的元素接收,然后逐级向上传播至最不具体的元素的节点 (最具体 –> 最不具体) 3.事件捕获 最不具体的节点先接收事 ...
- 写10个简单的 linux 命令?
mkdir 创建文件夹rmdir 删除文件夹rm 删除文件 mv 移动文件cp 拷贝文件cat 查看文件 tail 查看文件尾部more 分页查看文件cd 切换当前目录 ls 列出文件清单reboot ...