使用C++读取docx的saltvalue

这是一个有趣的话题。
你把一个加密的docx的后缀改掉
1.docx> 1.zip
解压
看看会有什么

是不是出来了几个文件
看看那个
EncryptionInfo
里面有一些值可以用来破解密码(弱一点的口令如000-999)
在这里插入图片描述
让我们拖入notepad 可以发现有一堆这样的东西
在这里插入图片描述

好了 作为程序员 我们需要一个自动化工具提取saltValue

damn
规定只能用c/c++ windows系统
我的思路:

  1. 按照重命名的步骤 ->zip 然后解压 然后读文件 然后找到value 搞定
    我死在了解压上 不是代码没有 是docx变成zip后文件头不是正常的 常规代码解压不了 我一度陷入自闭 后知后觉 调了5个小时不懂 以为自己代码有问题
    2.摆脱自闭 我把文件后缀改成了txt 打开来也是有saltValue的 。。。
    那还用个P的zip!!!
    我尝试使用系统自带的命令搞出value 灵光一现! findstr 了解一下
    在这里插入图片描述

好了这道题就是个水题
而且其实可以不用重命名为txt的
findstr过于牛逼你直接docx即可 看我上面那个图
我写完博客之后想到了

#include <locale.h>
#include <fstream>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
string dupYin = "\"";//双引号
string solve(string ans) {
	string ret;
	for (int i = 0; i < ans.size(); ++i) {
		if (ans[i] == '\"') return ret;
		ret += ans[i];
	}
	return ret;
}
void rename(string name) {
	string temp = "REN " +dupYin + name + ".docx\" " + " " + dupYin + name + ".txt\"";
	cout << temp << endl;
	system(temp.c_str());
}
int main() {
	cout << "docx文件名:" << endl;
	string name;
	while (getline(cin,name)) {
		rename(name);
		string CMD = "findstr \"salt\" " + dupYin+ name + ".txt" + dupYin+ " >\"" + "key_" + name + ".txt\"";
		cout << CMD << endl;
		system(CMD.c_str());
		string target = "key_" + name + ".txt";
		FILE *fp = fopen(target.c_str(), "r");
		char ch;
		string ans;
		while (fscanf(fp, "%c", &ch) != EOF) {
			ans += ch;
		}
		int pos = ans.find("saltValue=") + 11;//找到位置加个偏移 刚开始为s的位置
		ans = ans.substr(pos);
		ans = solve(ans);
		cout << ans << endl;
	}
}

牛逼findstr

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值