吐槽几句
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都放到根目录,把要解压的文件也一起放过去,改一下配置文件应该就行了