百度文库资源解析原理与实现
具体原理不是太懂,于是下载一些已经实现了的工具进行逆向一下,看看别人都是怎么实现
的.
下载了一个"冰点文库下载"拖入 OD,关于如何找关键代码就不说了.这里直接切入重点.
仍以工具默认的文库下载网
址:http://wenku.baidu.com/view/9a2feb165f0e7cd18425363a.html 为例子说
明.
首先下载 http://wenku.baidu.com/view/9a2feb165f0e7cd18425363a.html 网页
内容,找到 DOC_INFO 即文档的基本信息,这里是:
?
DOC_INFO={doc_id:"9a2feb165f0e7cd18425363a",cid:"62",price:"2",value_
average:"8",doc_size:"311.5KB",doc_name:'
侧方位停车图解教你侧方停车技巧
',doc_type:"doc",url:"http://wenku.baidu.com",wealth:parseInt
('0'),level:parseInt('1'),isOrgDoc:'0',catal:"0",isAdmin:"",totalPage
Num:"3",cid1:"2",cid2:"62",cid3:""};
然后软件解析这段文本并写入一个配置文件中:
?
[task]
dac=bDD38048E63267FE4B3ABEF2314679EC9
mtime=20110826141952
status=2
site=2
downfile=1
totalpage=3
filenum=1
docname='侧方位停车图解教你侧方停车技巧',doc_type,doc
webaddr=http://wenku.baidu.com/view/9a2feb165f0e7cd18425363a.html
docaddr=http://ai.wenku.baidu.com/play/9a2feb165f0e7cd18425363a?pn=1&
rn=10
docid=9a2feb165f0e7cd18425363a
docserver=ai.wenku.baidu.com
author=
desc=
docver=
pdffile=D:\冰点文库下载 1.5\kpdf\'侧方位停车图解教你侧方停车技巧
',doc_type,doc.pdf
expword=1
其实到这里差不对就知道下载文库的基本方法了,因为重要的信息是:
docaddr=http://ai.wenku.baidu.com/play/9a2feb165f0e7cd18425363a?pn=1
&rn=10
我们只要把这个网址输入到浏览器中并保存网页内容,稍加修改就是一个 swf 文件了。这
个后面我们再具体解释。
软件会创建一个线程用来下载文档:
0041C0B9| 51
| push
ecx
0041C0BA| 6A 04
| push
4
0041C0BC| 57
| push
edi
0041C0BD| 68 B0C24100
| push
iDocDown.0041C2B0
0041C0C2| 6A 00
0041C0C4| 6A 00
| push
| push
0
0
|
|
|
|
|
|
0041C0C6| FF15 BC104400
| call
dword ptr ds:[<&KERNEL32.CreateThread>]
|kernel32.CreateThread
找到线程回调函数地址:0041C2B0 分析里面的处理过程,中间有处理豆丁文库的
代码,我们下次再说。此次只说百度文库的下载。
0041C9F6| E9 81020000
| jmp
iDocDown.0041CC7C
0041C9FB| 83F8 03
| cmp
eax,3
0041CA0D| 50
| push
eax
0041CA0E| 57
| push
edi
0041CA0F| 68 02000084
| push
84000002
0041CA14| 6A 01
| push
1
0041CA16| 53
| push
ebx
|
|
|
|
|
|
|
0041CA17| E8 94C90100
| call
……
堆栈参数:
0256F0A4
003B7D78 ASCII
"http://ai.wenku.baidu.com/play/9a2feb165f0e7cd18425363a?pn=1&rn=1"
0256F0A8
00000001
0256F0AC
84000002
0256F0B0
003BA5F8 ASCII "Accept: */* Referer: http://www.baidu.com/"
0256F0B4
0000002C
文件下载到“D:\冰点文库下载 1.5\kdocin”目录下的临时文件中:
b_9a2feb165f0e7cd18425363a_1.dat.tmp,下载完成改名为:b_9a2feb165f0e7cd18425363a_1.dat。
实际上是一个 swf 文件,只不过开头多了一下数据:
Offset
0 1
2
3 4
5 6
7
8
9 A B C D E
F
00000000
7B 22 74 6F 74 61 6C 50
61 67 65 22 3A 22 33 22
{"totalPage":"3"
00000010
2C 22 66 72 6F 6D 50 61
67 65 22 3A 22 31 22 2C
,"fromPage":"1",
00000020
22 74 6F 50 61 67 65 22
3A 22 31 22 7D 20 20 20
"toPage":"1"}
00000030
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
00000040
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
00000050
20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20
00000060
20 20 20 20 20 20 20 20
20 20
只要利用 winhex 的 cut 功能把这段数据去掉就是一个能播放的 swf 文件了。
软件再利用 SWFToImage.DLL 文件把 swf 文件转换为 jpg 图片,最后使用 pdflib.dll 把这些 jpg 图
片制作成 pdf 文档。
当然后面还有将 swf 中的文字提取出来写入到 txt 文件中,
b_9a2feb165f0e7cd18425363a_1.dat_2.swf 的文字导出到
b_9a2feb165f0e7cd18425363a_1.dat_2.swf.txt 中。
代码在:
00407454| 50
| push
eax
00407455| E8 361F0000
| call
iDocDown.00409390
文本
0040745A| 8D5424 3C
| lea
edx,dword ptr ss:[esp+3C]
0040745E| 8D4424 20
| lea
eax,dword ptr ss:[esp+20]
00407462| 52
| push
edx
00407463| 68 4CF04400
| push
iDocDown.0044F04C
00407468| 50
| push
eax
|
|提取 txt
|
|
|
|%s
|
00407469| E8 72190300
| call
……
0040746E| 83C4 14
| add
esp,14
00407471| 8D4C24 18
| lea
ecx,dword ptr ss:[esp+18]
00407475| 51
| push
ecx
|
|
|
00407476| 8BCE
| mov
ecx,esi
00407478| E8 B3BBFFFF
| call
iDocDown.00403030
|UTF8->ANSI
0040747D| 8D5424 18
| lea
edx,dword ptr ss:[esp+18]
00407481| 8D4424 14
| lea
eax,dword ptr ss:[esp+14]
00407485| 52
00407486| 51
| push
edx
| push
ecx
00407487| 8BCC
| mov
ecx,esp
00407489| 896424 38
| mov
dword ptr ss:[esp+38],esp
0040748D| 50
| push
eax
|
|
|
|
|
|
|
|
0040748E| E8 F9180300
| call
|
00407493| 8BCE
| mov
ecx,esi
00407495| E8 B6060000
| call
iDocDown.00407B50
|
|写入 txt
至于如何提取的我没有具体跟进去,大致流程是:swf 文件是压缩过的,要先解压缩后提
取 txt 文本。
我直接从网上下载了一个“Flash 文本提取工具加强版(SWFTxtEx)”,我们在浏览器中输
入 http://ai.wenku.baidu.com/play/9a2feb165f0e7cd18425363a?pn=1&rn=1,
然后保存为 swf 文件,然后使用 winhex 去掉头部信息,便得到一个压缩的 swf 文件,然后
用“Flash 文本提取工具加强版(SWFTxtEx)”工具打开,便能提取出文本信息了:
而且也显示了该 swf 的一些其他信息,如下说明是经过压缩过的:
*********************************
文件基本信息:
文件名 C:\Documents and Settings\user\桌面\9a2feb165f0e7cd18425363a.swf
文件版本 9
经过压缩
宽:595 pixels
高:842 pixels
帧数:1 frame
帧率:0 fps
共提取文字: 397 个
总结: