selph
selph
发布于 2022-08-30 / 179 阅读
0
0

新160个CrackMe练习:059-Dope2112.1

算法难度:⭐⭐⭐(跳转表)

爆破难度:⭐

信息收集

运行情况:

image

查壳与脱壳:

image

调试分析

老版本delphi程序

输入错误信息,看提示:

image

通过x86dbg去搜索字符串,找到这个校验函数:sub_421B84,去IDA里搜索这个位置,然后同时用DelphiDecompiler打开这个程序辅助分析

首先是处理一下输入,用户名需要大于等于6字符,然后全部变成小写

image

然后是进入循环了,取一个字节,减去’a’,然后以此为索引去跳转,这就是switch-case语句的跳转表的形式,每个分支都有不同的处理

image

跳转分支里的内容是赋值,然后出来之后就是把赋值的值累加到1字节里,总共循环6次

image

再往下就是常规的字符串拼接和对比了:

image

注册机

注册码生成算法:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
    string  name="";
    string serial="";
    int len;

    std::cin >> name;
    len = name.length();
    transform(name.begin(), name.end(), name.begin(), ::tolower);

    uint8_t dl;
    uint8_t bl=0;
    for (int i = 0; i != 6; ++i)
    {
        switch (name[i])
        {
        case 'a':
            dl = 24;
            break;
        case 'b':
            dl = 37;
            break;
        case 'c':
            dl = 66;
            break;
        case 'd':
            dl = 12;
            break;
        case 'e':
            dl = 13;
            break;
        case 'f':
            dl = 6;
            break;
        case 'g':
            dl = 54;
            break;
        case 'h':
            dl = 43;
            break;
        case 'i':
            dl = 23;
            break;
        case 'j':
            dl = 47;
            break;
        case 'k':
            dl = 19;
            break;
        case 'l':
            dl = -126;
            break;
        case 'm':
            dl = -101;
            break;
        case 'n':
            dl = -110;
            break;
        case 'o':
            dl = 3;
            break;
        case 'p':
            dl = 99;
            break;
        case 'q':
            dl = 33;
            break;
        case 'r':
            dl = 66;
            break;
        case 's':
            dl = 92;
            break;
        case 't':
            dl = 41;
            break;
        case 'u':
            dl = -57;
            break;
        case 'v':
            dl = 102;
            break;
        case 'w':
            dl = 88;
            break;
        case 'x':
            dl = 10;
            break;
        case 'y':
            dl = 40;
            break;
        case 'z':
            dl = 80;
            break;
        default:
            dl = 93;
            break;
        }
        bl += dl;
    }
    cout << (int)bl << "-" << len * 0x4a7e;
}

效果:

image


评论