简单的凯撒加密并手动去除花指令
这个程序是加了花指令的,首先去除花指令
定位到花指令位置
给他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);
注册成功
**