百度文库免积分免费下载工具的原理与实现

来源:互联网 发布:mysql explain括号 编辑:程序博客网 时间:2024/05/16 06:55

百度文库免积分免费下载工具的原理与实现

百度文库免登陆免积分下载工具大揭秘!

 

具体原理不是太懂,于是下载一些已经实现了的工具进行逆向一下,看看别人都是怎么实现的.

下载了一个"冰点文库下载"拖入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 WindowsSolutionThe 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 projectProduced 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    
复制代码





 


原创粉丝点击