这个程序是加了花指令的,首先去除花指令
定位到花指令位置
给他nop掉
接下来保存下来就行了
我们将去除花指令的程序拖到ida中
这是我们的main函数
我们对main函数和算法进行一些重命名修改
这个算法就是将我们输入的字符串转换为一个新的字符串,在与 ((++**–,//…QQPP 这个字符串对比
char key[] = "bcdaren";
int __cdecl Algorithm(char* inputkey, char* outputkey, int a3)
{
signed int v4; // [esp+0h] [ebp-Ch]
size_t j; // [esp+4h] [ebp-8h]
signed int i; // [esp+8h] [ebp-4h]
if (!inputkey)
{
return -1;
}
if (!outputkey || !a3)
{
return -1;
}
if (strlen(inputkey) <= a3)
{
v4 = strlen(inputkey);
}
else
{
v4 = a3;
}
for (i = 0; i < v4; ++i)
{
for (j = 0; j < strlen("bcdaren"); ++j)
{
outputkey[i] = key[j] ^ (inputkey[i] + 13);
}
}
return 0;
}
这就是关键算法了
for (j = 0; j < strlen("bcdaren"); ++j)
{
outputkey[i] = key[j] ^ (inputkey[i] + 13);
}
先分析一下这一个for循环
每次跳出循环都是key最后一个字符n参与了运算
所以可以将for循环删掉,
只留下这一句
outputkey[i] ='n' ^ (inputkey[i] + 13);
我们的注册码是先将输入的字符+13后在和n异或运算
那么反过来就可以得到我们应该输入的注册码
先将比较的字符串((++**–,//…QQPP
先异或在减去13,就能得到正确的注册码
可以这样写代码
char comkey[] = "((++**--,,//..QQPP";
char corkey[128] = { 0 };
for (int i = 0; i < strlen("((++**--,,//..QQPP"); i++)
{
corkey[i] = ('n' ^ comkey[i]) - 13;
}
puts(corkey);
注册成功
**