具体原理不是太懂,于是下载一些已经实现了的工具进行逆向一下,看看别人都是怎么实现的.
下载了一个"冰点文库下载"拖入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:"",totalPageNum:"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 | push 0 |
0041C0C4| 6A 00 | push 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 <jmp.&MFC42.#5207_?OpenURL@CInternetSession@@QAEPAVCStdioFile@@PBDKK0K@Z>……
堆栈参数:
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 |提取txt文本
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 |%s
00407468| 50 | push eax |
00407469| E8 72190300 | call <jmp.&MFC42.#2818_?Format@CString@@QAAXPBDZZ>……
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 | push edx |
00407486| 51 | 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 <jmp.&MFC42.#535_??0CString@@QAE@ABV0@@Z> |
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 个
总结:
分析完以后,我们便知道如何实现一个免登陆免积分下载百度文库的工具了。
1.根据文库网址获取文档的id,页数等信息(DOC_INFO)。
2.构造如下类似链接:http://ai.wenku.baidu.com/play/9a2feb165f0e7cd18425363a?pn=1&rn=1,下载文件。
3.将文件头部的信息去掉得到一个压缩过的swf文件。
4.将swf解压缩并提取其中的文本信息,可以得到txt,或者word文档。
5.使用SWFToImage.DLL将swf文件转换为jpg图片,参考:SWF To Image library - converting set of SWF into BMP in Visual C# using SWF TO Image library 。
6.将这些转换出来的图片使用pdflib.dll、iTextSharp 等三方库制作成pdf文件,参考:iTextSharp 使用详解&用C#制作PDF文件全攻略。
注:
SWFToImage.dll在64位下的使用参考“How to run and use SWF To Image on x64 Windows”,
大致意思是在vs工程中设置exe的目标平台为"x86“,为项目添加一个YourApplication.exe.manifest资源,内容为:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="SWFToImage.dll">
<typelib tlbid="{F52B2898-3CD9-4530-8F1E-2762A2783C33}" version="1.0" helpdir="C:\WINDOWS\system32\"/>
<comClass description="CLASS_SWFToImage" clsid="{479A1AAC-C148-40BB-9868-A9773DA66AF9}" progid="SWFToImage.SWFToImageObject" threadingModel="both" tlbid="{F52B2898-3CD9-4530-8F1E-2762A2783C33}" />
</file>
</assembly>
当然还要将SWFToImage.dll文件放到你的可执行文件目录下。
最后附上原文内容:
How to run and use SWF To Image on x64 Windows
Solution
The SWF To Image ActiveX library is made using managed Windows 32-bit code so as a result library (dll) can not be loaded into 64-bit application.
Solution is to build application for x86 platform so application will be operate in 32-bit mode (will work on both 32 and 64-bit OS)
To apply this in Visual Studio 2005 and higher:
- open project in Visual Studio 2005
- open project settings by pressing ALT+F7 (or via main menu: Project | Windows Application 1 Properties)
- select "Build" tab
- change "Platform Target" to "x86" option
- re-build project
Produced EXE application will work OK with registration-free scenario on Windows x64. To see how to add registration-free support into application see below:
For registration-free usage scenario for SWF To Image please use the following manifest file:
Content of YourApplication.exe.manifest file:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<file name="SWFToImage.dll">
<typelib tlbid="{F52B2898-3CD9-4530-8F1E-2762A2783C33}" version="1.0" helpdir="C:\WINDOWS\system32\"/>
<comClass description="CLASS_SWFToImage" clsid="{479A1AAC-C148-40BB-9868-A9773DA66AF9}" progid="SWFToImage.SWFToImageObject" threadingModel="both" tlbid="{F52B2898-3CD9-4530-8F1E-2762A2783C33}" />
</file>
</assembly>
Do not forget to put SWFToImage.dll into the same folder where YourApplication.exe is located