涛之雨 发表于 2021-3-7 01:58

记一次有限制的网页pdf破解

本帖最后由 涛之雨 于 2021-3-7 14:56 编辑

作者:涛之雨

> 其他分会场(内容完全一样,随手多发一处。。。)
> cnblogs : https://www.cnblogs.com/taozhiyu/p/14493476.html

# 记一次有限制的网页pdf破解

## 起因


(文件附在文末)

## 初步分析

首先用`chrome`浏览器打开,查看效果


点击确定,`F12`打开控制台(我怎么打不开)

那就`ctrl`+`shift`+`I`打开控制台(打开了)

那肯定是`js`搞的鬼,随手翻一下`js`就看到

(有什么用。。。可以有不下于5种方法绕过)

> 列举一下一瞬间想到的(欢迎补充)
>
> 1. 最简单的就是本地`js`啊!直接打开编辑。。。
>2. 上述的`ctrl`+`shift`+`I`
> 3. 菜单$\to$更多工具$\to$开发者工具
>4. `ctrl`+`shift`+`C`(这是快速打开UI布局分析工具,就是这个小按钮)
>   
>5. `fd`自动转发(针对服务器返回的数据,保存到本地然后转发)
> 6. 先打开控制台,再打开网页(斜眼笑)

大胆猜测一下,一个`HTML`30多M,说明数据都在本地,这个弹窗应该是服务器验证之类的

所以内容所占最多的部分就是PDF文件的主体。

使用`010 Editor`打开网页(因为我电脑问题。。。sublime打开直接就卡死了。。。汗-_-||),

向下随便翻翻,就找到一大堆的内容(如下图所示)

大致可以猜测为base64。

当然有没有加密啥的都不知道,只知道最后一步应该是base64。

然后向下看,有好几个`script`标签。

不得不说,这个作者还是挺有心的,下面三个`eval`的加密,上面一个号称耶稣也还原不了的加密。

唔,先不解密吧,(肯定这块就有猫腻了)

刷新一下页面,在弹窗的时候按下暂停键,(注:在`source`标签里)


点确定后就断下来了


稍作格式化,有alert出现


向上翻一下,找到`else`所在判断的另一个分支。。。这灵魂判断。。。


不管38妇女节(虽然还没到)

复制粘贴直接运行。(有点慢。。。)




这不就运行出来了么:




好了这就是主要的代码了,拿出来解密再重命名一下就是:

```javascript
var DEFAULT_URL = '';
var pdfUrl = document.location.search.substring(1);
if (null == pdfUrl || '' == pdfUrl) {
    var BASE64_MARKER = ";base64,";
    var preFileId = '';
    var pdfAsDataUri = "data:application/pdf;base64," + PDFData;
    var pdfAsArray = convertDataURIToBinary(pdfAsDataUri);
    DEFAULT_URL = pdfAsArray;
    function convertDataURIToBinary(data) {
      var point = data.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
      var b64 = data.substring(point).replace(/[\n\r]/g, '');
      var raw = window.atob(b64);
      var rawlength = raw.length;
      var U8array = new Uint8Array(new ArrayBuffer(rawlength));
      for (i = 0; i < rawlength; i++) {
            U8array = raw.charCodeAt(i) & 255;
      }
      return U8array;
    }
}
```

明显的的看到了,协议是`application/pdf`,编码是`base64`。

## 尝试下载

base64解码后直接保存16进制不就好了,随手写了`python`解密保存

> 温馨提示,文件有点大,我是直接用`010 Editor`把前后都删掉,然后添加前后部分的

```python
import base64
PDFData = "JVBERi0xLjYKJb/3***********这里是完整的base64,30多m,直接base64后放出来估计要被h大打死(暴筋)**********8mCjMyMzIxMjkwCiUlRU9GCg=="
with open('temp.pdf', 'wb') as f:
f.write(base64.b64decode(PDFData))
```

先喝杯咖啡。。。等待时间有点长


打开。


还有密码。。。我大意了,没有密码!

## 找出密码

原网页中可以打开,肯定是有保存了密码的,向下翻一下


### 解密JS法

又是一段“最强”加密的`js`,很少,直接看都能看出来


密码是`_0x4c77('0x2', 'V%DS')`的结果,直接运行即可出结果


### 劫持事件法

上面有个`输入密码以打开此 PDF 文件。`下面有个确定,在确定按钮下断点。


点击下方的格式化按钮


在监听提醒的位置下断点(如果找不到在哪里了就切换到元素界面,再点一次)


刷新页面即可断下,鼠标放到`value`即可看到密码。


## 下载PLUS

至此解密完ch。。。啥?没有安装python?


既然他利用`application/pdf`协议生成的PDF,那我也可以直接用blob协议下载PDF,代码如下:

```javascript
var bstr = atob(PDFData)//atob()方法将base64数据解码
var leng = bstr.length//获取文件长度
var u8arr = new Uint8Array(leng)//新建Uint8数组存放字节
while(leng--){
    u8arr =bstr.charCodeAt(leng)//转Unicode编码
}
const blob = new Blob(, {type:'application/pdf'});//新建blob协议
const fileName = `jiemipdf.pdf`;//文件名
const link = document.createElement('a');//新建a链接标签
link.href = window.URL.createObjectURL(blob);//添加下载地址
link.download = fileName;//文件名
link.click();//模拟点击事件
window.URL.revokeObjectURL(link.href);//执行下载操作
```

复制粘贴到console里,(如果`PDFData`变量名变了记得重命名)

回车,弹出下载框!


(搞不懂为啥比python解码还快。。。)

至此结束。

如果不想要密码,可以到咱们吾爱随便搜索一下,找个去除密码的软件即可。

## 附录

>内含:
>
> 1. HTML原文件
> 2. 本文PDF(不包含附录链接)
> 3. 下载后的PDF

下载链接:https://taozhiyu.lanzouj.com/ind9nmmm3mb
密码:3xoq

压缩包解压密码:**52pojie.cn**

Yancy-Lan 发表于 2021-3-7 02:17

会爬虫是真的强!我现在在学习中,,,期待你有更多的实践交流分享!辛苦了

涛之雨 发表于 2021-5-18 19:36

the_black 发表于 2021-5-18 17:02
大佬您好,我查看了你的“记一次有限制的网页pdf破解”文章,无奈自己是小白,不会技术,希望您能研究研究 ...

F12打开控制台,输入PDFViewerApplication.save()即可下载

想你的月 发表于 2021-3-7 02:25

虽然啥也不懂,但还是认真的看完了!

涛之雨 发表于 2021-8-6 20:46

金城侠客 发表于 2021-8-6 20:44
大侠,您好,还是无法下载啊,请问是这么回事,谢谢

具体情况具体分析。。。你这直接报个错谁知道什么情况

涛之雨 发表于 2021-3-7 10:14

我是不会改名的 发表于 2021-3-7 09:28
有服务器咋办呢,https://ws28.cn/f/4vkmubbrnag
以前有阅读器,后面出版社把服务器关了,有账号也登不 ...
那没办法了,实在不行就爆破吧。一般来说密码都是大小写数字和特殊字符
(或是没有特殊字符,密码特别长)
爆破尝试一下?
像抑郁云阅读本地缓存就是文件名加盐MD5
经济学人的客户端也是差不多
客户端可以发一下?说不定算法是本地的呢(心存侥幸)

涛之雨 发表于 2021-3-7 02:06

本帖最后由 涛之雨 于 2021-3-7 02:10 编辑

好久没发帖了,
自古楼主坐沙发
PS:该网页用的是开源的PDFjs(http://mozilla.github.io/pdf.js/)

liu6tot 发表于 2021-9-10 00:12

代码中PDF=“*****”过长,会造成像pycharm等IDE 卡死, 这代码有点不能忍。
import base64
with open("input.txt", "r") as f:
    PDFData = f.read().encode("ascii")
with open('temp.pdf', 'wb') as f:
f.write(base64.b64decode(PDFData))

liu6tot 发表于 2021-9-11 00:25

本帖最后由 liu6tot 于 2021-9-11 00:26 编辑

js代码配个quicker的"剪库"动作脚本,还要什么自行车?谢谢斑竹的好思路,一大波书库向我走来
.

winddyj 发表于 2021-3-7 02:19

思路清晰,分析到位,过程写的尤为生动,赞一个

xzhlife 发表于 2021-3-7 02:40

学习一下,感觉挺难的

PrincessSnow 发表于 2021-3-7 02:45

谢谢大佬的思路跟方法学习中

quhus 发表于 2021-3-7 03:23

大佬的思路跟方法学习,很有理念,慢慢思考中。

tyy2020 发表于 2021-3-7 05:13

看不懂,但过程耐心看完了。

whc2001 发表于 2021-3-7 06:38

学习了,开发者工具竟然还有这么多玩法
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 记一次有限制的网页pdf破解