借助7Z.exe 实现RAR压缩包密码暴力破解 C语言实现

吐槽几句

rar压缩包暴力破解这种软件 , 原理上挺简单的其实 , 就是不断的用字符去碰 , 指不定啥时候能碰上 , 爆破破解不就是这么回事嘛 , 之前下载个学习资料 , 说好的童叟无欺, 结果却给我加了个解压密码 , 上网寻思查个破解软件吧 , 要么带病毒 , 要么不能用 , 要么收费 . 学软件工程就这点好 ,了不起 , 自己写一个…

源码

#include<iostream>
#include<fstream>
#include<string>
#include <stdlib.h>
using namespace std; 
typedef struct Config{
	char unrarFile[256];
	char targetFile[256]; 
	int minLength;
	int maxLength;
	char charSet[256];
	int charSetSize;
}Config; 

//获取配置文件 
Config getConfig(){
	Config c;
	ifstream fin("config.txt");
	if(!fin.is_open())
	{cout<<"配置文件加载失败"<<endl;exit(1);} 
	while(!fin.eof()){
		char cbuf[256]; 
		fin.getline(cbuf,255);
		string sbuf = cbuf;
		if(sbuf=="[解压引擎地址]")
		{
			fin.getline(c.unrarFile,255);
		}
		else if(sbuf=="[目标文件地址]")
		{
			fin.getline(c.targetFile,255);
		}
		else if(sbuf=="[最小密码长度]")
		{
			fin.getline(cbuf,255);
			c.minLength = atoi(cbuf);
		}
		else if(sbuf=="[最大密码长度]")
		{
			fin.getline(cbuf,255);
			c.maxLength = atoi(cbuf);
		}
		else if(sbuf=="[密码字符集]")
		{
			fin.getline(c.charSet,255);
			sbuf = c.charSet;
			c.charSetSize = sbuf.length();
		} 
		else{
			cout<<"配置文件内容有误:"<<endl;
			cout<<sbuf<<endl; 
			exit(1); 
		}
	} 
	fin.close(); 
	return c; 
} 

//测试压缩包 
bool test(string targetFile,string password,string unrarFile){
	string cmd = unrarFile+ " t -P"+password+" "+targetFile+" >log.txt"; 
	if(system(cmd.c_str()) == 0 )
		return true; 
	return false; 
} 

//递归函数 
void func(Config *c,string password,int current,int target) {
	if(current==target){
		system("cls");
		cout<<"当前尝试长度: "<<target<<endl; 
		cout<<"当前尝试密码: "<<password<<endl<<endl; 
		cout<<"---------------------"<<endl<<endl;
		if(test(c->targetFile,password,c->unrarFile)){
			system("cls");
			cout<<"破解成功:"<<password<<endl;
			system("pause"); 
			exit(0); 
		}
		return; 
	} 
	for(int i=0;i<c->charSetSize;i++){
		string newPassword = password + c->charSet[i]; 
		func(c,newPassword,current+1,target); 
	} 
} 

//开始破解 
void start(Config c){
	system("cls"); 
	cout<<"开始破解.."<<endl; 
	string password="";
	for(int i=c.minLength;i<=c.maxLength;i++){
		func(&c,password,0,i); 
	} 
} 

int main(){
	cout<<"正在装载配置文件..."<<endl; 
	Config c = getConfig();
	system("cls"); 
	cout<<"配置文件装载成功....." <<endl<<endl 
		<<"引擎地址: "<<c.unrarFile<<endl
		<<"目标地址: "<<c.targetFile<<endl
		<<"最大长度: "<<c.maxLength<<endl
		<<"最小长度: "<<c.minLength<<endl
		<<"字 符 集: "<<c.charSet<<endl<<endl; 
	cout<<"是否开始破解?<Y/N>";
	char i='N'; 
	cin>>i;
	if(i=='Y')
		start(c); 
	cout<<"破解失败,请尝试扩展字符集或增加密码长度"<<endl; 
	system("pause"); 
} 

C++写的 , 直接编译就能用 , 讲道理已经好久没用过C++了 , 基本学的知识都还给老师了, 软件的思路是 , 利用 7z 的压缩引擎 (winrar 7z 都有个这么个玩意 , 是一个执行文件 , 可以用命令行执行 7z 的速度快一些 ,不知道叫什么 , 姑且叫引擎?) 然后用C++调用命令行去执行 7z 的引擎 .

效率方面嘛

效率挺差的 , 首先暴力破解嘛 , 在我的认知里暴力和效率挺不搭边的 , 再就是调用的是人家的程序 , 我说白了就是搭了个壳然后不断试探密码 主要影响密码尝试效率的还是人家 7z (7z是真的比winrar快好多,不知道他们技术怎么实现的,确实厉害)

这里写图片描述

这里写图片描述

配置文件

[解压引擎地址]
7z
[目标文件地址]
学习资料.rar
[最小密码长度]
4
[最大密码长度]
4
[密码字符集]
abcdefghijklmnopqrstuvwxyz

注意:7Z.exe其实是从F:\Program Files\7-Zip复制过来的,所以没有安装7Z的电脑可能不好用,去下载一个7-zip,到7-zip的根目录去寻找7z.exe,然后去把要解压的文件和7z.exe都放到根目录,把要解压的文件也一起放过去,改一下配置文件应该就行了

  • 24
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值