Crackme033

Crackme032 的逆向分析 

1.程序观察

《Crackme033》

输入错误之后会出现弹窗
《Crackme033》
这个弹窗会出现两次,不知道是有什么毛病(后面会说出原因)。

2.简单查壳

《Crackme033》

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

3.程序分析

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

然后调用函数处理用户名
《Crackme033》

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

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

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

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

《Crackme033》

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

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;
}

《Crackme033》
《Crackme033》

相关文件在我的 Github

    原文作者:snow
    原文地址: https://segmentfault.com/a/1190000020782462
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞