故事的開端
我們系統是對外系統,裡面有表格上傳功能,前幾天有客戶回報,上傳表格無法解析,遠端後發現客戶的電腦安裝有文檔加密系統,這種文檔加密系統是為了
防止公司内部人員将公司機密的文檔資訊洩露出去而強制安裝在公司内部的電腦上。
針對這種情況,上司安排我實作一個解密功能。
上司:小趙,實作一個解密上傳功能,滿足使用者需求。
我: what?(這不是故意刁難我?)
上司:實作不了的話可以直接拎包走人。
我: easy,保證完成任務。(先答應,本着活一天是一天的原則)
破解
針對加密文檔,我們切記不要往解密這個方向走。
破解的難度很大很大很大,首先解密規則人家百分之百不可能告訴你,而且裡面涉及到了大量的安全方面的知識,實作解密的難度非常之大。
結論:
我們必須另辟蹊徑
技巧一,僞裝
原理:
首先客戶電腦能正常打開,客戶自己能看到,就說明一點,文檔在磁盤是加密的,記憶體是解密的。我們首先去百度了解下文檔加密系統的原理(關鍵詞透明加解密)
經過我看資料得出結論,文檔加密系統多數是攔截了系統對于磁盤的讀取和寫入操作,在核心層根據應用的資訊,判斷是否是白名單程式,是的話執行解密,然後傳回解密後的文檔
如果是非白名單的程式,則傳回加密的文檔。
切入點:白名單
從客戶自己打開能看到解密後的内容得出一個結論,微軟的excel程式是白名單程式。
- 我們粗略的先将EXCEL.exe改名為TEST.exe,然後打開這個程式,打開一個文檔看是否能打開,重命名後客戶打開報錯,說明程式名是判定白名單的一個校驗
- 我們将浏覽器的chrome.exe改名為EXCEL.exe,然後上傳檔案,服務端正常解析,說明改名後的浏覽器竟然騙過了文檔加密系統。
實作:
編寫一個簡單的c++用戶端程式,命名為EXCEL.exe,通過ifstream的read函數讀取加密的excel文檔,欺騙文檔加密系統将解密後的流檔案給到程式,然後調用ofstream的write将流檔案寫入
磁盤(千萬不要将檔案字尾設定為xlsx之類的關鍵詞,如果這樣設定又會經過文檔加密系統的自動加密流程,設定.xxx可以繞過),然後調用rename将檔案名重命名為.xlsx之類的字尾即可。
驗證:
說實話我是懵逼的,我發現将我寫的程式命名為EXCEL.exe之後,文檔加密系統依然不認為我是白名單,可能存在以下原因
1.浏覽器是白名單?不科學,浏覽器不改名上傳的是加密文檔
2.文檔加密系統判斷白名單不僅僅是通過程式名?(這個挺真實,程式名,程式路徑,程式版本和描述資訊,程式所引入的動态連結庫,程式自身的hash值等等)
結論:
我覺得繼續走下去是個無底洞,既然浏覽器改名字已經能實作了,那就簡單多了。(有興趣的同學可以嘗試程序僞裝的方式繼續我的驗證)
寫一個bat檔案,複制原本的浏覽器啟動程式,将複制出來的啟動程式名改為EXCEl.exe,然後在桌面建立一個快捷方式,改成谷歌浏覽器之類的正常名字即可。
技巧二,利用vb曲線救國
很簡單,寫一個帶宏的excel文檔發給客戶
實作:
利用excel的vb指令ActiveWorkbook.SaveCopyAs直接可以将目前記憶體中的解密資料另存為其他地方,切記,檔案字尾不能是excel正常的字尾,可以是abc,xxx之類的
- 建立一個按鈕在excel功能區
-
點選後觸發ActiveWorkbook.SaveCopyAs,然後利用MsgBox告訴使用者,文檔已成功轉存為xxx,請手動重命名為.xlsx字尾後導入
(我們也可以不需要使用者去更改字尾,隻需要字尾寫死,然後在服務端将這種字尾視為excel文檔即可)
驗證:
親測可行
結論:
vb宏可以解決很多excel相關的問題。需要各位看官去發掘。
結束語
本文通過c++和vb的角度來實作一個看似奇葩實則正常的需求。
我們在增加知識深度的同時,也不要忘記了寬度的增加,一門語言始終會有局限性,多一點知識儲備,就多一種解題的思路。
奇淫巧計之是以會被稱為奇淫巧計,并不是多複雜,而是更巧妙。
如有問題,歡迎評論區交流。
部落格中标注原創的文章,版權歸原作者 苦中作樂才是人生巅峰所有;轉載或者引用本文内容請注明來源及原作者;