众所周知,最近由于某些特殊原因,pandownload关闭了默认搜索功能,一直使用畅快的我感到了前所未有的掣肘感。但很感谢pandownload的作者提供了这么好用的功能,希望事情过去后仍然可以把功能开放一下。本文仅供学习研究使用,禁止用作非法用途,如有不妥之处请告之,本人会在第一时间修改删除。

这篇文章主要是对pandownload(下面简称PD)两大功能的挖掘:

  1. 默认搜索功能

  2. 提取码搜索功能

软件环境:

  1. Visual Studio 2012
  2. WireShark
  3. WinHex
  4. Navicat
  5. unluac_2015_06_13.jar(https://sourceforge.net/projects/unluac/)
  6. lua53(http://www.lua.org/ftp/lua-5.3.5.tar.gz)
  7. Pandownload v2.1.3

默认搜索功能

一直在用PD的朋友都应该知道,自从2019年8月30日开始,PD不再提供强大的默认搜索功能。而大家可以在PD的目录中看到,一些如盘多多之类的插件,都是通过lua脚本来实现的,这时我们可以很容易就联想,会不会默认搜索也是同样适用lua来实现呢?答案其实是肯定的,并且因为PD自身使用lua5.3的原因,我们可以通过修改lua53.dll的一些函数就可以把默认搜索的lua脚本提取出来,但因为搜索功能已经关闭,其实PD已不再加载相关的脚本,这个我们可以通过wireshark抓包知道。

首先我们打开WireShark,设置过滤器为http,再打开PD,我们可以看到,PD会先访问一个初始化的地址,然后会通过访问

http://pandownload.com/api/script/list?clienttype=0&referral=&t=1567735359&version=2.1.3

来获取脚本的配置信息,如下图:

这个脚本配置是个JSON文本,目前是这样的:

{"scripts": [{"name": "search_pandown.lua","remove": true},{"name": "search_ncckl.lua","remove": true},{"name": "search_quzhuanpan.lua","remove": true},{"name": "anime_01.lua","remove": true},{"name": "anime_02.lua","id": 1000,"url": "http://static.pandownload.com/scripts/anime_agefans_0.0.5.lua","md5": "2d5d32f3294e7617bb0e5f0d942b29c9"},{"name": "anime_dilidili.lua","id": 1001,"url": "http://pandownload.com/static/scripts/anime/anime_dilidili_0.0.4.lua","md5": "197927c0ad7098f59c2c8674fd7054a8"},{"name": "s","id": 2,"url": "http://pandownload.com/static/scripts/s005","md5": "93c6666f6b10c40ac6d55771ddb98367"},{"name": "anime","id": 3,"url": "http://static.pandownload.com/scripts/anime_0.0.2","md5": "5fd63dc5bf617225ebfb3b16413879cb"},{"name": "default","id": 0,"url": "http://pandownload.com/static/scripts/default_0.3.6","md5": "ebaf5c5fb32fd9013029eb945b6e0e19","key": "453a9b1975b47473513cf4a3d94efd37"}],"code": 0,"message": "success"
}

我们可以看到,search_pandown.lua就是默认搜索的脚本,而它的remove状态现在已经是true,所以PD不会从服务器里下载下来,那怎么才能知道默认搜索的功能实现呢?

其实一般软件的开发都是迭代进行的,旧版本的PD或许还留有一些BUG之类的可以供我们去发掘,这时我们可以考虑下载旧版本的PD进行研究。我们从PD的官网更新日志得知,从2.0.3版本开始,PD便加入了搜索功能,可以通过https://pandownload.com/2.0.3这个链接下载v2.0.3版本,但解压后会发现这个版本并不包含默认搜索功能,可能是作者当时还没弄好本地数据库的原因吧。我们可以继续下载更新的版本,一直到v2.0.6,解压之后你可以看到里面就有一个search_pandown.lua。但打开后会发现这个文件其实是已经编译过的luac格式的文件,我们可以使用工具进行反编译(如果反编译出现错误,需要用WinHex把文件打开,把所有的0D0A字节替换成0A,后面操作雷同):

java -jar unluac_2015_06_13.jar search_pandown.lua > C:\search_pandown.lua

这时可以看到,这个版本的脚本访问的搜索URL并没有附加sign字段,可能是之前PD作者没考虑到会被盗链。

但本人很有幸,在PD作者关闭默认搜索脚本功能之前就已经把最新版本的代码dump了下来。dump脚本的方法很简单,我们可以在lua的官网上下载一份lua53的源码,使用VS编译出修改后的dll并替换掉原来的,那便可以为所欲为了!这里我自己修改了lua_loadbufferex函数:

LUALIB_API int luaL_loadbufferx (lua_State *L, const char *buff, size_t size, const char *name, const char *mode) {FILE* f = NULL;char fn[50];LoadS ls;ls.s = buff;ls.size = size;sprintf(fn, "D:\\%d.luac", rand() * 100000);f = fopen(fn, "w");fwrite(buff, size, 1, f);fclose(f);return lua_load(L, getS, &ls, name, mode);
}

生成并替换掉原来的DLL后,打开PD,随便搜索一些东西再关闭PD,我们可以看到D:盘下生成了许多“数字.luac”文件。我们再次使用unluac将它们逐一反编译,可以看到一份源码是这样的(由于边幅过长,我去掉了一些与本文无关紧要的代码):

local L1_1
L0_0 = require
L1_1 = "lcurl.safe"
L0_0 = L0_0(L1_1)
L1_1 = require
L1_1 = L1_1("cjson.safe")
script_info = {title = "默认",description = "",version = "0.0.5"
}
function onSearch(A0_2, A1_3)local L2_4, L3_5L2_4 = osL2_4 = L2_4.timeL2_4 = L2_4()L3_5 = "http://search.pandown.cn/api/query?clienttype=0&highlight=1&key="L3_5 = L3_5 .. pd.urlEncode(A0_2) .. "&page=" .. A1_3 .. "&timestamp=" .. L2_4 .. "&sign=" .. e(A0_2, A1_3, L2_4)return parse(get(L3_5))
end
function onItemClick(A0_6)
...
end
function get(A0_9)
...
end
function parse(A0_13)
...
end
function replace(A0_22, A1_23)
...
end
function getIcon(A0_25, A1_26)
...
end
function e(A0_33, A1_34, A2_35)local L3_36L3_36 = ""if pd.makeSign thenL3_36 = pd.makeSign(A0_33 .. "_" .. A1_34 .. "_" .. A2_35)endreturn L3_36
end

这时我们可以清晰地看到,PD的默认搜索其实就是访问了一个URL,然后解析返回的内容再以列表的形式展示出来:

http://search.pandown.cn/api/query?clienttype=0&highlight=1&key=编码后的关键字&page=页码&timestamp=当前时间&sign=pd.makeSign(原关键字 + "_" + 页码 + "_" + 当前时间)

这里的pd.makeSign其实是一个PD使用C/C++写的内置函数,并不是脚本实现,所以很可惜我并不能知道这个函数的实现细节。这个函数可以用两种方法来获取在内存中的地址,一种是修改lua,比如PanData\script\default\rename_01.lua,增加以下代码:

for k, v in pairs(pd) doif "makeSign" == k thenpd.logInfo(k .. "|" .. tostring(v))end
end

在PD启动时就会把makeSign函数的地址写入PanData\log\xxx.log日志文件里,这时直接用OD/VS/CheatEngine之类的调试器直接附加到PD,然后跳转到日志里的地址就可以进行反汇编。

另外还有一种方法就是跟踪lua_pushstring和lua_pushcclosure两个函数,PD在启动时会调用这两个函数生成pd表格对象,可以对lua_pushstring下个条件断点,然后也能找到makeSign函数的真实地址。虽然找到了makeSign的实现汇编代码,但由于能力所及我并不知道这个函数的实现原理。

看到这里,聪明的读者是不是想到,虽然我们并不知道pd.makeSign的实现方法,但是既然我们已经知道了默认搜索的实现脚本,而PD又支持插件功能,自己照样画葫芦再写一个相同功能的脚本不就同样可以实现默认搜索的功能?但是很遗憾的是,PD的作者在服务器端也将此功能关闭了,目前访问这个URL,得到的回复都只会是{"code":-1,"message":"服务器维护中"},所以一切只能等PD的作者恢复默认搜索功能才能愉快地玩耍了。

提取码搜索功能

我觉得PD之所以如此受大众喜爱,除了突破了某种限制,还有强大得无人能敌的默认搜索功能,最重要的我觉得就是网盘提取码的搜索功能。这个功能的发掘相对简单,使用WireShark即可。按之前的方法,我们先打开WireShark,设置http过滤器,打开PD,然后复制一个网盘分享链接(比如:https://pan.baidu.com/s/1GmaGU1FmZ5uwMtE8lUWKOA),这时PD会访问一个网址来搜索提取码:

我们可以看到,PD通过访问这个URL来获取提取码:

http://search.pandown.cn/api/query?clienttype=0&referral=&surl=1naiIOD7m8gZSrVk-Zr30dg&t=1567738781&version=2.1.3

其中,surl参数是网盘链接/s/后面的那段路径,t是当前时间,其他参数固定。返回的内容也是JSON格式的文本,如果找不到提取码,会返回以下内容:

{"code": 0,"message": "success","total": 0,"data": []
}

如果找到了提取码,就会返回这样的格式:

{"code": 0,"message": "success","total": 1,"data": [{"id": "3Nzk91","password": "mj8d","title": "彩虹岛","ctime": "1567679677","expired": "0","isdir": "1"}
}

同时,PD还内置了SQLite数据库,如果在找不到提取码的情况下,PD还允许用户自行输入提取码。

当提取码正确的时候,PD会把提取码记录到PanData\share.db文件里面,下次用户再访问同一个分享链接便不需要再向服务器请求提取码。这个文件可以使用Navicat之类的SQLite数据库管理器直接打开,除了这个数据库外还有下载任务列表数据库(PanData\task.db),看着像是用户数据库(PanData\user.db),但用户库文件由于进行了加密,并不能正常打开,有时间再研究打开这个数据库的密码吧。

关于Pandownload一些功能的挖掘相关推荐

  1. 如何通过SPSS的计算新变量功能,挖掘新洞察

    IBM SPSS Statistics的计算新变量功能,可通过为现有变量创建数字表达式来获得新的计算变量,从而挖掘到更深层次的洞察内容.比如通过构建单价与数量的数字表达式,获得一个新的总价计算变量. ...

  2. 关于pandownload源码的一般性研究与挖掘

    转载自: [https://blog.csdn.net/tzwsoho/article/details/100653341](https://blog.csdn.net/tzwsoho/article ...

  3. PanDownload复活了!速度60MB/s!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 自从 ...

  4. 这个网盘下载60MB/s!PanDownload复活了!

    (软件下载方式在文末) 自从 PanDownload 被处理之后 一直没有超越它的可替代的应用出来 但是最近,竟然有人接盘了!重新制作上线 推出了更加强劲的复活版! 放张图,大家先感受下 60MB/s ...

  5. pandownload 卢本伟_PanDownload复活了!60MB/s!附下载地址

    最近几天,听说PanDownload 复活了 有人接盘了,重新制作上线 推出了更加强劲的复活版! 但是笔者去下载了一下,发现并不能使用 于是经过百般搜寻,发现被人提供的已经是旧版了 于是,我找到了最新 ...

  6. 《深入浅出DPDK》读书笔记(十):硬件加速与功能卸载(VLAN、IEEE1588、IP TCP/UDP/SCTP checksum、Tunnel)

    Table of Contents 109.硬件卸载简介 110.网卡硬件卸载功能 111.DPDK软件接口 接收侧: 发送侧: 112.硬件与软件功能实现 113.VLAN硬件卸载 1. 收包时VL ...

  7. 基于功能的差异化战略

    ·文章原创:何晓磊 ·关注泰泽,实现高利润企业 基于功能的差异化战略 -哈佛商学院最受欢迎的营销课读后感- 因为上海疫情被困家中,这也成了读书的好时间.年前入手了一套全球知名商业院经典系列课程,其中最 ...

  8. 三星s4流量显示无服务器,揭开隐藏功能的面纱 GALAXY S4使用指南

    2013-7-29 11:19 [天极网手机频道]自4月份全球上市以来就备受关注的三星GALAXY S4,凭借其出色的人性化体验俘获了全球消费者的倾心.5.0英寸全高清Super AMOLED屏幕为用 ...

  9. 三星s4流量显示无服务器,三星s4有什么隐藏功能

    三星Galaxy S4有什么隐藏功能 备受关注的三星GALAXY S4,凭借其出色的人性化体验俘获了全球消费者的倾心.5.0英寸全高清Super AMOLED屏幕为用户带来绝佳视觉盛宴.1300万像素 ...

  10. PanDownload 复活了!60MB/s!附下载地址

    点击上方"逆锋起笔",公众号回复 pdf 领取大佬们推荐的学习资料 软件来源:kurukurumi.tk 软件来自互联网,使用需谨慎 最近几天,听说PanDownload 复活了 ...

最新文章

  1. 为什么AI的翻译水平还远不能和人类相比?
  2. 硬核!我的导师手写129页毕业论文,堪比打印!
  3. 部署SCCM2012之先决条件准备
  4. 英国伯明翰大学首席教授姚新:人工智能研究应从三个问题重新考虑
  5. IQ推理:红眼睛和蓝眼睛
  6. Objective-C 运行AppleScript脚本
  7. java多维数组按照某一列排序,PHP实现二维数组按某列进行排序的方法
  8. 利用pyinstaller打包python3程序
  9. 服务器上不安装anaconda而拥有两个环境
  10. linux中python进程,如何检查进程在python中运行(在linux中)?
  11. 为什么中国企业海外营销都选择Facebook?
  12. LINUX中信号量的使用
  13. java歌词解析器_设计模式学习(四):基于Builder模式的歌词解析器
  14. md5加密?什么是不可逆?
  15. 联想thinkpad E430C硬盘位换为固态,硬盘放于光驱位(win7+win10+ubuntu三系统安装教程)
  16. 心智与认知(1): 反馈循环(Feedback loop)
  17. P8462 「REOI-1」奶油蛋糕
  18. 马王堆汉墓帛书‧老子乙本——道经
  19. 【Luogu P1151】子数整数
  20. WKWebView设置UserAgent踩坑

热门文章

  1. MicroDicom viewer(Dicom格式看图软件) v3.4.7官方版
  2. 《每日一荐月刊》2019-11
  3. 软考高级系统架构设计师总结
  4. 计算机中xp系统中qq文件,从做完xp系统怎样恢复qq文?
  5. 杨森翔的书法:二月二;四条屏
  6. ArcGIS中高风险地区热力图制作
  7. 项目经理必备的基本职责
  8. HikariCP连接池
  9. 台式计算机模拟软件,全国计算机一级Office2010+win7版考试模拟软件
  10. 数值计算之第三期:直接法解线性方程组