故事的开端
我们系统是对外系统,里面有表格上传功能,前几天有客户反馈,上传表格无法解析,远程后发现客户的电脑安装有文档加密系统,这种文档加密系统是为了
防止公司内部人员将公司机密的文档信息泄露出去而强制安装在公司内部的电脑上。
针对这种情况,领导安排我实现一个解密功能。
领导:小赵,实现一个解密上传功能,满足用户需求。
我: 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的角度来实现一个看似奇葩实则正常的需求。
我们在增加知识深度的同时,也不要忘记了宽度的增加,一门语言始终会有局限性,多一点知识储备,就多一种解题的思路。
奇淫巧计之所以会被称为奇淫巧计,并不是多复杂,而是更巧妙。
如有问题,欢迎评论区交流。
博客中标注原创的文章,版权归原作者 苦中作乐才是人生巅峰所有;转载或者引用本文内容请注明来源及原作者;