乐趣区

Crackme033

Crackme032 的逆向分析 


1. 程序观察

输入错误之后会出现弹窗

这个弹窗会出现两次,不知道是有什么毛病(后面会说出原因)。

2. 简单查壳

程序使用汇编语言编写的。

3. 程序分析

程序首先获取输入的 name 和 serial

然后调用函数处理用户名

在函数内部,首先会检查用户名是否为字母,如果不是字母就会报错,如果是小写字母就转化为大写字母(这里已经发现当初为什么会报两次错了,当用户名不是字母的时候弹一次窗,序列号错误的时候又弹一次。)

检查完毕之后,会调用地址 4013C2 处的函数,该函数会将 name[i] 依次相加

然后再将相加的结果和 0x5678 进行异或

用户名处理完毕之后,程序会调用函数处理 serial

最后,程序会比较处理过后的用户名和序列号,如果相等,就提示正确;不想等则错误。

4. 注册机

#include <stdio.h>
#include <string.h>
#include <Windows.h>


int Keygen()
{char szName[20] = {0};
    char szSerial[20] = {0};
    int NameLen = 0;
    __int64 Result = 0;


    printf("请输入用户名:");
    scanf_s("%s", szName, 20);
    NameLen = strlen(szName);

    for (int i = 0x0; i < NameLen; i++)
    {if (szName[i] < 0x41 || szName[i] > 0x5A)
        {printf("错误!请输入大写字母。\n");
            return 0;
        }
        Result += szName[i];

    }
    
    Result ^= (0x5678 ^ 0x1234);
    sprintf(szSerial, "%I64d", Result);

    printf("%s\n", szSerial);

    return 0;
}

int main(int argc, char* argv[])
{Keygen();
    return 0;
}


相关文件在我的 Github

退出移动版