这篇文章只不过是之前 [教你绕过rar密码] 的高级应用,原理是一样的。
问题背景和之前也类似,就是稍微复杂一些。某bbs发布小型的彩票,论坛用户用自己的论坛货币购买压住,然后压中获奖。
总共五组号码,五组号码由数字1~12中产生,前四个号码不重复,第五个号码可以与前四个号码重复。
剩下的我想你如果看过之前的文章,我想你明白了,论坛发布彩票的管理员,将实现设置好的数字保存于txt文件中,加密压缩,等开奖的时候再公布密码。
因为涉及到一个还算有意思的排列组合,所以才写的这个,而这个实话说我自己没写出来,找人代劳了。
一段C代码,实现生成所有排列组合的文件,注意一定要生成到一个指定的文件夹,到桌面或者根目录,你电脑一定会卡死的。
#include <stdio.h>
#include <string.h>
#define N 200 //输出数 最大11880
int Check(int* numList)
{
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
{
if (i == j)
continue;
if (numList[i] == numList[j])
return 0;
}
return 1;
}
int main()
{
// FILE* fout;
char* list[12] = {"01", "02", "03", "04",
"05", "06", "07", "08",
"09", "10", "11", "12"};
char filePreName[100];
char fileName[100];
char filePreCon[200];
char fileCon[200];
int numList[5];
int i, j, k;
memset(numList, 0, sizeof(numList));
for (i = 0; i < N; i++)
{
memset(filePreName, 0, sizeof(filePreName));
memset(fileName, 0, sizeof(fileName));
memset(filePreCon, 0, sizeof(filePreCon));
memset(fileCon, 0, sizeof(fileCon));
while (!Check(numList))
{
numList[0]++;
for (j = 0; j < 4; j++)
{
if (numList[j] > 11)
{
numList[j] = 0;
numList[j+1]++;
}
}
}
for (j = 3; j >= 0; j--)
{
strcat(filePreName, list[numList[j]]);
strcat(filePreCon, list[numList[j]]);
if (j)
strcat(filePreCon, ",");
}
for (k = 0; k < 12; k++)
{
strcpy(fileName, filePreName);
strcat(fileName, list[k]);
strcat(fileName, ".txt");
strcpy(fileCon, filePreCon);
strcat(fileCon, "+");
strcat(fileCon, list[k]);
freopen(fileName, "w", stdout);
printf("%s\n", fileCon);
}
numList[0]++;
for (j = 0; j < 4; j++)
{
if (numList[j] > 11)
{
numList[j] = 0;
numList[j+1]++;
}
}
}
}
生成的文档内容为XX、XX、XX、XX+XX,然后文件名为XXXXXXXXXX.txt,也就是内容部分去掉标点和符号。
剩下的任务,当然少不了微软提供的CRC32利器: [微软CRC32命令行工具],具体用法就不说了 for命令用好,将结果输出到一个txt文件中,可能校核稍微时间长了点(前面那个写一万多个文件的速度也不快)。
再用校核得到的CRC32的值与winrar中显示的数值做对比就可以得到最终结果。
转载请注明:鸟儿博客 » 再试RAR密码破解(CRC32)