1

Crackme034 的逆向分析 


1.程序观察

20191024084644.png

因为这个程序使用的是 Keyfile 的保护方式,所以并没有什么输入序列号的地方。

2.简单查壳

20191024084656.png

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

3.程序分析

使用 OD 载入程序,在代码入口的就可以看到 CreateFileA、ReadFile 这两个函数

首先使用 CreateFileA 函数打开文件,从参数中可以看到文件名叫做 CRACKME3.key
20191024085255.png
如果打开失败,就会调用一个函数,然后跳转走。

如果打开成功,程序会读取此文件,读取 18 字节的数据到内存 402008 处
20191024090318.png
如果读取的数据不够 18 字节,也会跳转走

然后将读取的数据压栈,调用一个处理函数
20191024090527.png

处理函数会建立一个循环,循环次数为 0x14。在循环中,程序依次读取 serial[i],将其和 0x41+i 进行异或运算,然后每次的结果累加保存在内存 4020F9 处
20191024091005.png

然后将累加的结果和 0x12345678 进行异或,还保存在 4020F9 处
20191024091055.png

再次将 serial 压栈,获取剩下未处理的 4字节
20191024091128.png

将剩下的 4字节和 4020F9 处的值进行比较,看是否相等。如果相等,则弹窗提示成功
20191024091243.png

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("请输入14字节值:");
    scanf_s("%s", szSerial, 20);
    NameLen = strlen(szSerial);
    if (NameLen != 14)
    {
        printf("不是十四字节! %d", NameLen);
        return 0;
    }

    for (int i = 0; i < 14; i++)
    {
        szSerial[i] ^= (0x41 + i);
        Result += szSerial[i];
    }
    
    Result ^= 0x12345678;
    char* serial = (char*)&Result;
    
    for (int i = 0; i < 4; i++)
    {
        printf("%c", serial[i]);
    }

    return 0;
}

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

20191024144700.png
20191024144755.png

相关文件在我的 Github


snow
4 声望0 粉丝

多么美好!


« 上一篇
Crackme033
下一篇 »
Crackme035