嵌入 HTML 里的 PDF 文件解密


前言

​ 今天弄到了一份奇怪的 PDF 文件,它是以 html 文件的形式存在的,似乎還加密了。

明明是 2020 年的文件,居然還有跨域問題,這作者也太……了吧

就因為這個跨域問題,導致我看不了里邊的內容,這怎么能忍?干他

嘗試分析

首先嘗試使用記事本打開,因為文件內容實在是太大了,記事本卡死,這招行不通。

然后,想到了我們強大的 Word

一樣,卡死,文件大就是可以為所欲為嗷。

然后百度搜索一堆東西,似乎有好多人分析過這種文件,試過了各種編輯器,全都是卡死。

然后,突然就有靈感了,既然卡死是因為文件過大,文件過大是因為里頭嵌入了超大的 PDF 文件本體,那我想辦法把 PDF 本體從 HTML 里剝離出來不就好了?

逐個擊破

雖然可以通過編程來實現字節讀取,可我並不知道 PDF 本體的偏移量。

這時就該祭出強大的 WinHex 了,打開文件后它長這樣

雖然界面丑了點,當還是能用的,也可以用其他 十六進制編輯器。這下就完全是不卡了,可以安心分析文件了。

抽離內嵌 PDF 與 HTML

隨手一拖就發現了大量的毫無規律的大寫字母區域,可以推斷出這應該就是被編碼后的 PDF 本體了

順着這條線索就能找到 PDF 偏移頭和 PDF 偏移尾了

文件頭

文件尾

因為這個巨大的字符串全是 大小寫字母+ 數字 還有 / 和 + 我們大膽推斷它應該是 Base64 編碼,這點后邊要用到

知道了偏移量,接下來要做的就是編程分離 PDF 和 HTML 了,這里我使用 Python 3(PY 永遠滴神!)

先抽出 PDF 本體,代碼如下

with open('end.html','rb')as f:
	# pdf 頭 0x209323
	# pdf 尾 0x2C87035
	with open('inner','wb+')as ff:
         f.seek(0x209323) # 跳轉文件指針到 PDF 頭的偏移量
         # 尾偏移 - 頭 偏移 得到文件尺寸
		ff.write(f.read(0x2A7DD12)) # 讀取 文件尺寸 大小的字節數,並寫入新文件

然后就是讀取 HTML 文件

with open('end.html','rb')as f:
	# pdf 頭 0x209323
	# pdf 尾 0x2C87035
	with open('a.html','wb+')as ff:
		ff.write(f.read(0x209323))
		f.seek(0x2C87035) # 跳過 pdf 主體
		ff.write(f.read())

代碼思路是這樣,可能存在偏差,僅供參考。

大膽猜測

還記得我們前邊說的 Base64 嗎?現在就是用到的時候了!

由於文件實在是太大了,而且也還是二進制文件(解碼后),因此十分不適合使用在線解碼方式。

在百度一周無果后,突然想到了 Linux (Linux 永遠滴神!)

別問為什么不自己寫程序,問就是懶!

Linux 下有個命令(實際也是程序啦) base64,因為我在用 git,就隨手開了個 git -bash(實在不想因為這事去開個虛擬機)

嘗試性的輸入了

base64 --help

果然是有的啊,(git 永遠滴神!),不光如此,它的參數還是接收一個文件!這不就是正合我意嘛!

輸入

base64 -d inner >> a.pdf

成功轉碼,看來就是 base64 編碼了,讓我們打開文件看看效果

不出所料,是有密碼的

爆破密碼

既然它是內嵌進 HTML 的,那我們可以嘗試在 HTML 里找一找蛛絲馬跡

在 PDF 文件本體后邊的 HTML 里有一些有意思的東西

這明顯是加密了的 JavaScript ,隨手搜了下在線解密網站

不多說了,懂得都懂(永遠滴神!),稍微格式化下代碼,繼續(永遠滴神!),找到一些有意思的字符串。

拿去碰碰運氣;第一個失敗了,第二個,直接密碼正確

到此為止,解密部分就結束了,但這種密碼我怎么可能會去記?

去除密碼

隨手百度了一個 PDF 密碼去除工具

一套操作后

沒問題了,成功去除密碼

小插曲

在調試過程中還發現這個網頁有個有意思的東西——反調試

打開控制台時,會進入無限 Debug,如果嘗試取消斷點,網頁還是會卡死

經過分析,這應該是第二個 加密的 js 干的,去掉之后就沒事了,具體代碼就不貼出來了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM