Ⅰ 如何加载 VMware Workstation v8.0.1 加密过的虚拟磁盘文件
首先介绍一下VMware Workstation v8.0 的加密功能(修改、移除密码也是在这里操作),操作很简单:
新建一个任意虚拟机,然后“编辑虚拟机设置”→“选项”,可以看到一个“加密”,说明写的是:“该虚拟机未加密。你可以使用密码保护该虚拟机的数据和配置。”
旁边有个“加密按钮”,点击,会要求你输入密码,然后开始加密,他会把虚拟机配置文件和整个虚拟磁盘统统重新编码进行加密,而且是不可逆的高强度加密,如果你没有密匙,是无法还原的。
我们再看看它的配置文件发生了什么变化。
主要文件有:
Windows XP Professional.vmdk //虚拟磁盘文件
Windows XP Professional.vmsd //储存密匙的文件
Windows XP Professional.vmx //虚拟机的整体配置文件
Windows XP Professional.vmxf //某种配置文件
加密前:
Windows XP Professional.vmdk //正常
Windows XP Professional.vmsd //空白
Windows XP Professional.vmx //明文的配置内容
Windows XP Professional.vmxf //明文的配置内容
Windows XP Professional.vmx 内容大概是这个样子的:
.encoding = "GBK"
config.version = "8"
virtualHW.version = "8"
scsi0.present = "TRUE"
memsize = "512"
ide1:0.present = "TRUE"
ide1:0.autodetect = "TRUE"
ide1:0.deviceType = "cdrom-raw"
ide1:1.present = "TRUE"
ide1:1.fileName = "E:\b\1\Windows XP Professional.vmdk"
floppy0.startConnected = "FALSE"
floppy0.fileName = ""
floppy0.autodetect = "TRUE"
usb.present = "TRUE"
ehci.present = "TRUE"
sound.present = "TRUE"
sound.fileName = "-1"
sound.autodetect = "TRUE"
mks.enable3d = "TRUE"
serial0.present = "TRUE"
serial0.fileType = "thinprint"
pciBridge0.present = "TRUE"
pciBridge4.present = "TRUE"
pciBridge4.virtualDev = "pcieRootPort"
pciBridge4.functions = "8"
pciBridge5.present = "TRUE"
pciBridge5.virtualDev = "pcieRootPort"
pciBridge5.functions = "8"
pciBridge6.present = "TRUE"
pciBridge6.virtualDev = "pcieRootPort"
pciBridge6.functions = "8"
pciBridge7.present = "TRUE"
pciBridge7.virtualDev = "pcieRootPort"
pciBridge7.functions = "8"
vmci0.present = "TRUE"
hpet0.present = "TRUE"
usb.vbluetooth.startConnected = "TRUE"
displayName = "Windows XP Professional"
guestOS = "winxppro"
nvram = "Windows XP Professional.nvram"
virtualHW.proctCompatibility = "hosted"
powerType.powerOff = "hard"
powerType.powerOn = "hard"
powerType.suspend = "hard"
powerType.reset = "hard"
extendedConfigFile = "Windows XP Professional.vmxf"
可以看到第一行是指定了编码,底下是虚拟机的参数。
加密后:
Windows XP Professional.vmdk //文件数据完全改变
Windows XP Professional.vmsd //有内容了
Windows XP Professional.vmx //加密的配置内容
Windows XP Professional.vmxf //没变
Windows XP Professional.vmsd 内容为:
.encoding = "GBK"
encryption.keySafe = "vmware:key/list/(pair/(null/%3cVMWARE%2dEMPTYSTRING%3e,HMAC%2dSHA%2d1,tvdbb%%2b7seyEXsITq%2frJfM%2bpRhuxn6hLdUf0sV2M7KK%%2bvDIIk%%3d))"
encryption.data = "jzMK85KB33C+ZvVvCDKF9cTMLXd7hUEWEZCY2p3/fVZERl1trvql+gD65kYqSk4WS+NKrQ=="
第一行指定编码格式,第二行是安全密匙(Url 编码的密匙信息+ Base64 编码的密匙),第三行是Base64 编码的加密数据。
Windows XP Professional.vmx 内容为:
.encoding = "GBK"
displayName = "Windows XP Professional"
encryption.keySafe = "vmware:key/list/(pair/(phrase/Q8qRfGi6V0M%3d/pass2key%3dPBKDF2%2dHMAC%2dSHA%2d1%3acipher%3dAES%2d256%3arounds%3d1000%3asalt%3dOiu7KvvIxTv%2b5a0RBmb4VA%253d%253d,HMAC%2dSHA%2d1,mwIz3U9k2vDV8kW5zgVcUkmP8SWBB%%2fcTA7RN9EoAb4A%2fD3fBYXctJDdDSKprDCk%%3d))"
encryption.data = "+D5d8Y8NV2Ua8+++mv/++/yi1Q/EpN5dIOHjFr9H0Vb3GLlu++eqvqWpFBNZUgKU+vH3ROfLNhGM6qnbaWrpn//+//3b+SOu3PJfEpr9pQ/aa/ezEAKrVE+2gb6L6ZIFsz/E6EqrQklJKHO+/WJ6m4CyAFt03RX/+7aqXY+o++9X0DxUGn8Y2W76agCZPVN3wO+//+k7RFa///DomPZ/vyxzIeaj/zafelc+9XM57DDTD6+D/dZbonatgXkQKnEEwSF4RCYBV+qm7MNlg+jz8pUHSK6QyGaOzj+WlU6O3XwELTB1zzl6JthHY/HHMgR/C4T3Tj2LPwK/nLq8+/2GDR/+/+uQhB7BrFzLnzmh7+BP9Tm3WG5J3vG0nb2MblKfRPk3u+/5mVCiAtMVWPHjQ+"
格式和上边的差不多,实际上“encryption.data”为加密过的明文配置信息。
对两段encryption.keySafe www.2cto.com 分别进行Url解码后,发现:
vmware:key/list/(pair/(phrase/Q8qRfGi6V0M=/pass2key=PBKDF2-HMAC-SHA-1:cipher=AES-256:rounds=1000:salt=Oiu7KvvIxTv+5a0RBmb4VA==,HMAC-SHA-1,mwIz3U9k2vDV8kW5zgVcUkmP8SWBB+/cTA7RN9EoAb4A/D3fBYXctJDdDSKprDCk/=))
vmware:key/list/(pair/(null/<VMWARE-EMPTYSTRING>,HMAC-SHA-1,tvdbb++7seyEXsITq/rJfM+pRhuxn6hLdUf0sV2M7KK/+vDIIk/=))
其中简要地说明了密匙信息,加密算法有:HMAC-SHA-1、PBKDF2-HMAC-SHA-1,密匙长度:AES-256,还加盐!
通过之前的观察,我们发现有变化的文件有:
Windows XP Professional.vmdk //虚拟磁盘文件
Windows XP Professional.vmsd //储存密匙的文件
Windows XP Professional.vmx //虚拟机的整体配置文件
这三个文件是关键,那么如果你新建了一个虚拟机,想加载之前加密过的虚拟磁盘文件,该如何做呢?
首先,新建一个和之前系统一样的虚拟机,配置随意,然后找到保存配置的目录,复制.vmsd、.vmx 过去覆盖(或者替换其中的密匙信息),然后打开该虚拟机(不是启动!),删掉之前的磁盘,加载加密过的磁盘,直接就可以用了。
Ⅱ iOS代码加密的几种方式
众所周知的是大部分iOS代码一般不会做加密加固,因为iOS
APP一般是通过AppStore发布的,而且苹果的系统难以攻破,所以在iOS里做代码加固一般是一件出力不讨好的事情。万事皆有例外,不管iOS、adr还是js,加密的目的是为了代码的安全性,虽然现在开源畅行,但是不管个人开发者还是大厂皆有保护代码安全的需求,所以iOS代码加固有了生存的土壤。下面简单介绍下iOS代码加密的几种方式。
iOS代码加密的几种方式
1.字符串加密
字符串会暴露APP的很多关键信息,攻击者可以根据从界面获取的字符串,快速找到相关逻辑的处理函数,从而进行分析破解。加密字符串可以增加攻击者阅读代码的难度以及根据字符串静态搜索的难度。
一般的处理方式是对需要加密的字符串加密,并保存加密后的数据,再在使用字符串的地方插入解密算法。简单的加密算法可以把NSString转为byte或者NSData的方式,还可以把字符串放到后端来返回,尽量少的暴露页面信息。下面举个简单例子,把NSString转为16进制的字符串:
2.符号混淆
符号混淆的中心思想是将类名、方法名、变量名替换为无意义符号,提高应用安全性;防止敏感符号被class-mp工具提取,防止IDA Pro等工具反编译后分析业务代码。目前市面上的IOS应用基本上是没有使用类名方法名混淆的。
别名
在编写代码的时候直接用别名可能是最简单的一种方式,也是比较管用的一种方式。因为你的app被破解后,假如很容易就能从你的类名中寻找到蛛丝马迹,那离hook只是一步之遥,之前微信抢红包的插件应该就是用hook的方式执行的。
b.C重写
编写别名的方式不是很易读,而且也不利于后续维护,这时你可能需要升级一下你的保护方式,用C来重写你的代码吧。这样把函数名隐藏在结构体中,用函数指针成员的形式存储,编译后,只留下了地址,去掉了名字和参数表,让他们无从下手( from 念茜)。如下例子:
c.脚本处理
稍微高级一点的是脚本扫描处理替换代码,因为要用到linux命令来编写脚本,可能会有一点门槛,不过学了之后你就可以出去吹嘘你全栈工程师的名头啦。。。
linux脚本比较常用的几个命令如下:
脚本混淆替换是用上述几个命令扫描出来需要替换的字符串,比如方法名,类名,变量名,并做替换,如果你能熟练应用上述几个命令,恭喜你,已经了解了脚本的一点皮毛了。
如以下脚本搜索遍历了代码目录下的需要混淆的关键字:
替换的方式可以直接扫描文件并对文件中的所有内容替换,也可以采用define的方式定义别名。例如:
d.开源项目ios-class-guard
该项目是基于class-mp的扩展,和脚本处理类似,是用class-mp扫描出编译后的类名、方法名、属性名等并做替换,只是不支持隐式C方法的替换,有兴趣的同学可以使用下。
3.代码逻辑混淆
代码逻辑混淆有以下几个方面的含义:
对方法体进行混淆,保证源码被逆向后该部分的代码有很大的迷惑性,因为有一些垃圾代码的存在;
对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低,这很容易把破解者带到沟里去;
它拥有和原始的代码一样的功能,这是最最关键的。
一般使用obfuscator-llvm来做代码逻辑混淆,或许会对该开源工具做个简单介绍。
4.加固SDK
adr中一般比较常见的加固等操作,iOS也有一些第三方提供这样的服务,但是没有真正使用过,不知道效果如何。
当然还有一些第三方服务的加固产品,基本上都是采用了以上一种或几种混淆方式做的封装,如果想要直接可以拿来使用的服务,可以采用下,常用的一些服务如下:
几维安全
iOS加密可能市场很小,但是存在必有道理,在越狱/开源/极客的眼中,你的APP并没有你想象的那么安全,如果希望你的代码更加安全,就应给iOS代码加密。