IDA逆向注册码算法
前言
异或运算
原理
逆运算
步骤
1.去花指令




2.IDA转C代码














3.VS逆算法求注册码

最后更新于



















最后更新于
int main(int argc, const char **argv, const char **envp)
{
char v4;
char Str1[136];
char Str[132];
sub_4011F0(); //输出信息函数,可以除掉
memset(Str, 0, 0x80u); //为字符串作初始化工作,可以除掉
memset(Str1, 0, 0x80u);
while ( 1 )
{
memset(Str, 0, 0x80u);
memset(Str1, 0, 0x80u);
printf(L"\n请输入注册码:", v4);
scanf("%s", Str);
sub_401000(Str, (int)Str1, 128); //将sub_401000重命名下看起来舒服点
if ( !strcmp(Str1, "((++**--,,//..QQPP") )
printf("\n\n注册成功\n\n", v4);
else
sub_401560(&unk_44259C); //这里ida没有识别成功,不过也能猜出是输出“注册失败”的printf函数
}
}
int __cdecl sub_401000(char *Str, char *a2, unsigned int a3)
{
signed int v4; // [esp+0h] [ebp-Ch]
size_t j; // [esp+4h] [ebp-8h]
signed int i; // [esp+8h] [ebp-4h]
__CheckForDebuggerJustMyCode(&unk_45A007); //JMC汇编检测代码,没啥用可以除掉
if ( !Str )
return -1;
if ( !a2 || !a3 )
return -1;
if ( strlen(Str) <= a3 ) //a3是字符串长度,重命名为len
v4 = strlen(Str);
else
v4 = a3;
for ( i = 0; i < v4; ++i )
{
for ( j = 0; j < strlen("bcdaren"); ++j )
a2[i] = byte_442198[j] ^ (Str[i] + 13); //这个byte_442198数组应该是对应上面代码的"bcdaren"
}
return 0;
}int main()
{
int checkkey(char *input_key, char *output_key, unsigned int len);
char input[] = "helloworld";
char output[30];
checkkey(input,output,10);
printf("%s", output);
if (!strcmp(output, "((++**--,,//..QQPP"))
printf("\n\n注册成功\n\n");
else
printf("\n\n注册失败\n\n");
}int checkkey(char *input_key, char *output_key, unsigned int len)
{
signed int v4;
size_t j;
signed int i;
char cmp_key[] = "bcdaren";
if (!input_key)
return -1;
if (!output_key || !len)
return -1;
if (strlen(input_key) <= len)
v4 = strlen(input_key); // v4为输入的字符串长度
else
v4 = len;
for (i = 0; i < v4; ++i)
{
output_key[i] = 'n' ^ (input_key[i] + 13); //^是异或运算操作符
}
return 0;
}int get_register() {
char output_key[] = "((++**--,,//..QQPP";
char input_key[100];
for (int i = 0; i < strlen(output_key); i++)
{
input_key[i] = (output_key[i] ^ 'n') - 13;
}
printf("%s", input_key);
return 0;
}