> 文档中心 > 简单的凯撒加密并手动去除花指令

简单的凯撒加密并手动去除花指令

这个程序是加了花指令的,首先去除花指令

定位到花指令位置

在这里插入图片描述

给他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);

注册成功

在这里插入图片描述

**