1

Crackme032 的逆向分析 


1.程序观察

20191023163049.png

这个程序打开之后,就只有这一个弹窗,点击确定就会退出,什么都没有。

2.简单查壳

20191023163556.png

可以看到是 Delphi的程序,但加了 UPX 的壳。
使用 UPX 脱壳工具可以很简单的就脱了壳。

3.程序分析

这个程序不可能就简单的只有一个弹窗,我们使用 IDR 加载程序,可以看到程序是有3个窗口的
20191023165234.png

想要找到这三个窗口有2个办法,一个是根据弹窗提示建立一个叫做 Reg.dat 的文件,另一个是直接修改代码逻辑,我们选择直接修改代码逻辑,如图
20191023165513.png

运行程序,找到注册界面,可以看到 OK 按钮是灰色的,看来只有输入正确的序列号才能点击 OK 按钮
20191023171902.png

20191023172146.png
20191023172151.png
20191023172157.png
20191023172202.png
在输入序列号的时候,一定会调用到函数 00437D1C的,所以我们到该函数处看一看

根据序列号输入的位数的不同,会跳转到不同的代码处
20191023172555.png

但进行的操作是一样,得到该位输入的序列号,然后作为参数调用函数437BD8
20191023172708.png

函数 437BD8首先会获取输入的用户名和长度,如果长度小于5就跳转
20191023172950.png

然后程序会依次取得输入的用户名,分别使用 name[0]、name[2]、name[3]、name[4] 除以 0xA,然后将商值保存在地址 437A2C - 437A38 处
20191023173204.png

然后检查商的长度,如果长度大于1,则再次除以0xA
20191023174217.png

然后将4个商相对应的和序列号的4位做比较,如果都相同,则 OK 按钮变量
20191023174342.png

4.注册机
#include <stdio.h>
#include <string.h>
#include <Windows.h>

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

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

    for (int i = 0x0; i < 5; i++)
    {
        if (i != 1)
        {
            Result = szName[i] / 0xA;
            if (Result > 9)
            {
                Result = Result / 0xA;
            }
            printf("%I64d", Result);
        }
    }

    return 0;
}

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

20191023191357.png
20191023191444.png

相关文件在我的 Github


snow
4 声望0 粉丝

多么美好!


« 上一篇
Crackme031
下一篇 »
Crackme033