起因:
R语言老师发了一个压缩包,压缩包内有两个HTML格式的文件,解压出来打开HTML文件,却发现内容是以PDF形式展示的,而且在右上角还有着授权码,剩余阅读次数,看着这些玩意儿,我陷入了沉思,原来PDF也能加密了吗?!
自己尝试搞:
既然是老师发的东西,肯定是好多人都一起用的,这限制了阅读次数,那还让不让人看了,我这边看十次,别人不都看不了了,不行,得想办法整一下。
第一次
第一个想到的方法是直接HTML转PDF,用各种转换器如:福昕高级PDF编辑器,PDFCandy,网页在线转换。
- 福昕高级PDF编辑器:error
- PDFCandy:转换出来的PDF只有1KB,打开无内容
- 在线HTML转PDF:超过文件大小限制
结果:全灭
第二次
第二个想到的方法是PDF去密码工具,然后反应过来,我这现在还是HTML格式,没法用。
第三次
第三个方法:网络搜索! 抱着试一试的心态先去 吾爱破解论坛 搜了一下,好家伙,还真有,可怜巴巴的两个搜索结果正好有一个符合我的需求,这里链接奉上:
跟随大佬帖子进行操作
帖子里只是记录了大佬的破解过程,看了下大概,我觉得我也可以重现!
初步分析
首先是打开控制台,F12没用,ctrl+shift+i
或者直接从浏览器选项的更多工具里都能打开,估计是js里把F12禁用了吧,用VSCode打开这个网页文件,前面代码还真是这样
直接用浏览器打开这玩意儿,显示的是这样(自己作死想试试剩余阅读次数为0次时会发生什么,然后就把阅读次数消耗完)
一个html却有40多M,数据肯定都在本地,这点大佬的帖子里指出来了,而且直接猜测是base64。
直接往后看,看到了三个
eval()
,这个玩意儿当时在学js的时候看到过,但没看懂到底该咋用
接受一个参数,如果eval()被调用时,会将参数解释为实际的ECMAScript语句,然后插入当前位置,通过eval()执行的语句属于调用位置的上下文
算了还是跟着大佬继续往下看,在弹窗出现时断点,然后点确定,断到后,格式化下代码,发现了一些东西
往下翻一下,同样找到了这玩意儿,果然,,我这份PDF和大佬那份是同一个类型的限制,虽然大佬在文章里吐槽过一次这个判断,我也想再吐槽一次,这特么,直接摆明了呗。
之后两种方式来去除限制
先把
msg == 'true'
时,里面的代码复制一下
第一种
在打开文件后,网页弹窗 “您阅读时间已经到期…………” 时,点一次确定,然后刷新,这次弹窗后先别点确定,ctrl+shift+i
打开开发人员工具,找到控制台,把复制到的东西直接粘贴到输入栏,点回车,然后会发现没反应,控制台的东西压根就没发出去,就像自己没点到回车一样,这都是正常的,再点一下弹窗的确定,会发现已经能正常阅读了,控制台的代码也发出去成功运行了。这也是帖子中大佬的操作,个人感觉每次打开都要搞一遍挺烦的,直接看第二种方法吧。
这里大佬进行了一步代码解密,无奈我实在太菜,重现不了大佬这一步,但是对之后的操作没有影响
第二种
到这里后,用vscode打开这个HTML,找到这个地方,if里面的东西剪切出来,然后把判断给删掉保存,就完事了,虽然不是PDF格式,但没了阅读限制,正常使用是没问题了,也能发给别人用了。
提取密码,保存为PDF
在通过上一步第一种方法时,能看到一瞬间的密码输入框,翻了翻帖子发现,之后PDF提取出来后,PDF是含有密码的。
大佬列出了两种方法,无奈看不懂JS解密法,还是滚回去看劫持事件法吧。
劫持事件法
在开发者工具里的Element中,找到那一瞬间的密码输入框在html中的位置,给确定按钮加一个断点
然后刷新页面,点击弹窗里的确定,这时候开发者工具会自动跳出来
格式化代码
点击3的位置,定位到修改代码的地方,给这里加上断点,
this.input.value
指的应该就是输入框里的密码了之后的操作震惊到我了,原来还可以这样!
加上断点后刷新页面
恢复执行,然后格式化代码,鼠标放在
this.input.value
上,密码便出现了,就是%qwerASDF.+
,这个密码就是PDF文档的密码下载PDF
把下面代码复制到控制台,执行,便能得到PDF文件,PDF的密码就是上一步的密码
var bstr = atob(PDFData)//atob()方法将base64数据解码
var leng = bstr.length//获取文件长度
var u8arr = new Uint8Array(leng)//新建Uint8数组存放字节
while(leng--){
u8arr[leng] = bstr.charCodeAt(leng)//转Unicode编码
}
const blob = new Blob([u8arr], {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);//执行下载操作
总结
虽然我几乎是跟着大佬完全来了一遍,但成功将PDF整出来的成就感还是满满的,吾爱论坛注册三年了,第一次成功跟着大佬完成了破解,泪目,老白嫖怪了。
网友评论