本帖最后由 wzy41718682 于 2013-12-8 18:40 编辑
上一次意外的发现淘宝电子书任购的小漏洞,估计很多人都下载到了许多书O(∩_∩)O~,可是数据都是被加密的,而且是swf格式,下载的swf文件复制到其他电脑还打不开囧。前段时间在看雪大牛群有个网友很感兴趣,我俩就开始试图解密还原并生成PDF格式喽。
原任购漏洞已修复呵呵
1.逆向TaobaoReaderSWF 分析加密解密
用flash反编译程序将<淘宝电子书离线阅读器>目录下TaobaoReader.swf逆向出fla源码,fla源码是浅尘大哥给的,并提醒我此AIR源码是用Adobe Flash CS6编写的。浅尘提醒:Flash CS6安装在xp下有点小错误就会shutdown系统,要安装在win7下。
在DB.as中记录着swf/xml密钥提取、db数据库加密解密代码
[AppleScript] 纯文本查看 复制代码 public static function getSwfKey():ByteArray
{
swfKey = EncryptedLocalStore.getItem("swfKey");
if (!swfKey){
swfKey = createRandomKey();
EncryptedLocalStore.setItem("swfKey", swfKey, false);
};
return (swfKey);
}
public static function getXmlKey():ByteArray
{
xmlKey = EncryptedLocalStore.getItem("xmlKey");
if (!xmlKey){
xmlKey = createRandomKey();
EncryptedLocalStore.setItem("xmlKey", xmlKey, false);
};
return (xmlKey);
}
public static function openDB():Boolean
{
storedKey = EncryptedLocalStore.getItem("dbKey");
if (!storedKey){
storedKey = createRandomKey();
EncryptedLocalStore.setItem("dbKey", storedKey, false);
};
//........
file = File.applicationStorageDirectory.resolvePath("book.db");
try {
if (!file.exists){
if (!created){
con.open(file, SQLMode.CREATE, false, 0x0400, storedKey);
createDB();
created = true;
openDB();
}
//........
在download\DownloadManager.as中记录着加密、解密代码
[AppleScript] 纯文本查看 复制代码 private static function encyptSwf(_arg1:ByteArray):ByteArray
{
var _local2:ByteArray = DB.getSwfKey();
var _local3:int;
while (_local3 < 0x0400) {
_arg1[_local3] = (_arg1[_local3] ^ _local2[(_local3 % 16)]);
_local3++;
};
return (_arg1);
}
private static function encyptXml(_arg1:ByteArray):ByteArray
{
var _local2:ByteArray = DB.getXmlKey();
var _local3:int = _arg1.length;
var _local4:int;
while (_local4 < _local3) {
_arg1[_local4] = (_arg1[_local4] ^ _local2[(_local4 % 16)]);
_local4++;
};
return (_arg1);
}
代码尽在眼前,xml/swf/db密钥是2组16位随机数,加密是异或操作,再异或一下便是解密呵呵。
db加密0x00~0x400, swf加密0x00~0x400, xml加密全部
解密:
[AppleScript] 纯文本查看 复制代码 i=0; Data=swf/db/xml原始数据; key[]=16位密钥;
while (i < strlen((Data))
{
(Data[i] = (Data ^ key[i % 16]);
i++;
};
值得一提的是EncryptedLocalStore和File.applicationStorageDirectory.resolvePath("book.db");http://help.adobe.com/zh_CN/air/reference/html/flash/data/EncryptedLocalStore.html
Adobe AIR 为安装在用户的计算机上的每个 AIR 应用程序提供了加密本地存储区 (ELS)。这样,您就可以以加密格式保存和检索存储在用户本地硬盘驱动器上的数据,使其他用户不能轻易地对这些数据进行解密。为每个 AIR 应用程序使用一个单独的加密本地存储区,且每个 AIR 应用程序为计算机上的每个用户帐户使用一个单独的加密本地存储区。
File.applicationStorageDirectory.resolvePath("book.db");这句是数据库存放位置,通过百度后得知位于C:\Documents and Settings\Administrator\ApplicationData\TaobaoReader\Local Store\book.db
2.编写解密程序
这样思路就很清晰了,只需要编写一个AIR程序伪装成TaobaoReader提取key程序就能搞定一切了。为了解密,只好从0开始学AIR编程,网上资料少的不能再少了..提供一个入门教程wenku.baidu.com/view/ad29651ba76e58fafab003d3.html 通过简单的学习,就写出了AIR key提取程序TaobaoReader.air,源码见附件。
运行TaobaoReader.air之前,必须先要通过淘宝安装程序卸载掉<淘宝电子书>,否则会有错误。点击卸载后并未真正卸载在安装目录依旧有<淘宝电子书>不影响使用。
安装后运行,如图。
3个keys内都是16位16进制数,我的分别是
swfkeys: 347F2D01D954807AD1E20C8AA17C3B3F
xmlkeys: D480064DA6E5BC28BF50549F26C95746
dbkeys: AA3A924BC29A5AEB5A6E5619C1558C91 //db用的SQLite3存放, 有密钥也法通过普通数据库查看软件查看,因为一般的查看软件都只能输入0~9 A~z以及特殊字符,而这些16进制无法输入,想要查看必须自己写SQL查看软件或者用 OD bp 数据库查看软件的GetDlgItemText,从内存替换为这16位密钥O(∩_∩)O~用vc6编写一个数据异或程序试验一下理论是否正确
复制swf 0x00~0x400 内容 输入密钥 一键异或 就看到了swf特征头部:CWS [CWS:已压缩swf FWS:未压缩swf] 把解密出来的数据覆盖掉加密部分,保存后确实能看了!
可是通过异或方法将xml解密出来后发现还是加密的。(⊙o⊙)…只不过有些类似能用文本阅读的样子,也没有继续看解密部分,直接猜测是ASCII+-算法。
通过ascii码表计算了30个左右找到规律
:-3 -5 -2 -3 -5 -2 -4 -2 -1 -5 -1 -1 -1 -4 -3 -3 -4 -1,这样就将整个xml解密完毕。
下面只需要读取xml列表按页数解密swf最后合成就大功告成了。
3.swf合成与转换成PDF格式
swfcombine
功能:将多个小swf合成为整个swf
格式:swfcombine -a -v xx.swf xx1.swf xx2.swf xxx.swf -o output.swf
swfcombine.exe 复制到system32下或者自己添加环境变量方便cmd调用
PDF-XChange
安装这款软件后,会增加一个虚拟打印机,将合成的swf文件用IE打开,右击打印选中PDF-XChange打印机,注意页面范围:选择全部!点击打印后,会输出PDF文件了。绝对高清不失真...这才叫PDF电子书哈
放大N倍
4.附加:另类获取xml密钥
即便没有xml密钥,也能解密xml列表。因为xml列表开头部分<?xml version="1.0" encoding="UTF-8"?>前16个字符是固定的,ASCII移动后也是固定的:16进制3F447A7071227A6773786A706F412534
用加密后的swf 0x00~0x16 ^ 3F447A7071227A6773786A706F412534 = 随机密钥
用加密后的swf 0x00~0x400 ^ 随机密钥 就能还原了O(∩_∩)O~。
代码写的比较烂。。不太希望被看到..可还是传上来了 只能说 达到目的了。。
例子
你可以去http://ebook.taobao.com 找一本积分免费购买电子书试试
因为每个用户 每台电脑 都有自己不同的密钥 我传上来我下载的文件 您也打不开哦。
特意做了个使用小录像 + AIR+VC6 3份源码程序打包
链接:链接: http://pan.baidu.com/s/1EdZa0 密码: pb5g |