-
-
[原创]公务员之路5.1题库再次解密!
-
发表于:
2006-6-5 14:48
3840
-
上篇地址:
http://bbs.pediy.com/showthread.php?s=&threadid=26729
上次跟出算法后。老兄又说,这套算法只能解出没注册的题库。哦,真的是这样吗?
让我们看看。
在数据库里有一个字段REG,G代表未注册的题目。
ANDG代表注册后的题目。
解密CALL中也没发现注册后转用其它算法,
那唯一的解释就是:
两种题目的密钥是不同的。
在上篇中
0557634 /$ 55 PUSH EBP
00557635 |. 8BEC MOV EBP,ESP
00557637 |. 6A 00 PUSH 0
00557639 |. 53 PUSH EBX
0055763A |. 56 PUSH ESI
0055763B |. 57 PUSH EDI
0055763C |. 8BF1 MOV ESI,ECX***ECX中就是密钥
未注册的密钥是$3039
那注册的是多少呢.
破解找注册码?为了题库这也太麻烦了吧.
反正这个密钥也只有一个word长.来个穷举吧.
word最长也只有FFFF,也就是十进制的65535
OK.写个程序,一个for循环.结果保存在文本文件里.
65535行,一个一个找是不行的,是要头昏的.
公务员考试考点什么呢,无非是马列.
关键字:马克斯....未找到.
列宁...未找到.
社会.....OK,找到.密钥出来了,$4F93
总结一下.
现在的计算机就是快,穷举也只用了2分多钟.
未注册,也就是数据库里REG字段是G的密钥是$3039
注册后,也就是数据库里REG字段是ANDG的密钥是$4F93.
解密函数改一下,优化是没什么时间了.
function TForm1.decrypt(key:word;str: string): string;
var
i: integer;
j, tt, tt2: word;
tmp: string;
tmpword: array of word;
begin
tt2 := key; //$3039 or $4F93
setlength(tmpword, length(str) div 2);
for i := 0 to length(tmpword) - 1 do
begin
tmpword[i] := strtoint('$' + str[i * 2 + 1] + str[i * 2 + 2]);
end;
for i := 0 to length(tmpword) - 1 do
begin
tt := tt2;
tt := tt shr 8;
j := tmpword[i] xor tt;
if j > 0 then
begin
tmp := tmp + char(j);
tt := tt2 + tmpword[i];
j := tt * $0B;
j := j + $0C;
tt2 := j;
end
else
begin
j := tmpword[i];
tmp := tmp+char(j);
j := tt2 * $0B;
j := j + $0C;
tt2 := j;
end;
end;
result := tmp;
end;
这下,老兄满意了吧.
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课