这篇文章只不过是之前 [教你绕过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)