160CM-010
1.破解过程
这道题看难度提示为“★★★”,以为会是一道难题,结果VB Decompiler打开一看,发现和009基本相同,只是算法不同。爆破就不搞了,分析了一下算法,也比较简单,就是输入的字符串每个字符ASCII码加10后的字符串与“kXy^rO|yXom\kMuOn*+”比较,相同就成功,完全没有三星的难度。
VS中开搞,码入代码:
#include "stdafx.h"
#include <Windows.h>
#include<stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
char key[30] = "kXy^rO|*yXo*m\kMuOn*+";
char code[30] = "";
int i;
for (i=0;i<strlen(key);i++)
{
code[i] = key[i] - 10;
}
printf("字符串为:%s \n",key);
printf("注册码为:%s \n",code);
system("pause");
return 0;
}
运行后,得到结果如下:
输入文本框,点击OK,发现居然没成功。然后,OD调试、VB Decompiler重新反编译。。。一顿操作猛如虎,结果还是没发现问题出在哪里,算法看起来没有任何问题,一度怀疑vbaVarTstEq函数是不是不光比较字符串内容,还要变量体的数据类型代码完全相同,因为一个是08,一个是8008,但是程序代码里面根本没有修改变量体数据类型的其他操作。
瞎忙活了半天,结果还是在打印出来的字符串中发现了问题,因为打印出来的字符和输入到程序代码里面的字符"kXy^rO|yXom\kMuOn*+"相比,少了一个“\”。呃……,这才想起“\”在C语言好像是有特殊含义的转义符。
在字符串中增加一个“\”,新的算法代码如下:
#include "stdafx.h"
#include <Windows.h>
#include<stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
char key[30] = "kXy^rO|*yXo*m\kMuOn*+";
char code[30] = "";
int i;
for (i=0;i<strlen(key);i++)
{
code[i] = key[i] - 10;
}
printf("字符串为:%s \n",key);
printf("注册码为:%s \n",code);
system("pause");
return 0;
}
编译,运行。
复制注册码输入文本框,确定,成功!
2.总结
这道题实际感觉应该比009还简单一些,但因为粗心大意,碰到一个比较SB的问题,也花费了不少时间。
- C语言中,单引号、双引号、反斜杠都是特殊的字符,不能直接表示,需要在前面加一个反斜杠。
|