010editor逆向过程

暴力破解nop

第一步我想先断住关于弹窗的API,再根据该API的调用去往上找到有关注册的关键逻辑。

但是我把createwindowsA/W都断住了,也没有阻止弹窗,有点奇怪。

这似乎是因为我曾经下载过破解版,注册表已被修改,所以这里我选择在虚拟机里进行调试。

但是。。。。很奇葩,改了时间后不知道为什么还是显示可用,但是刚改时间点开14的版本,就会显示试用期到期,再打开8的版本却不会,这时再打开14的版本也不会显示到期,怪。

那没办法力。。。虽然我不知道14的版本有没有很大改动。。。。

额。。重下了12的版本,改动时间,显示到期,那到期就行,开始正式逆向。

这里的话,在验证时,会有弹窗,所以建议在打开后附加到进程,再给可能的API下断点,然后追踪调用堆栈,向上追溯可能的判断逻辑点。

随便输一下,然后点check Licese,这里因为看过了别人的笔记,所以我知道这里调用的是createwindowExW API,所以成功断住,实际这一步只是为了更熟悉下xdbg,更聪明的办法是通过查找字符串找到逻辑点。

在调用堆栈这里可以找到我们当前断点的返回到地址,也就是调用它的地方,我们右键点击跟随目标,即可到目标地址。

可以发现在这里对createwindowExW进行了call指令。

我们把这句nop掉。

???为什么它还是弹出来了?

额。。这里是我nop没保存原因,但是这块处于一个dll文件,我打算替换的时候提示我没有权限,不过吧。。。nop这个弹窗也只能骗骗自己,骗不了程序。

所以这里正确做法是根据调用堆栈去找到判断的代码块。

当我们成功在创造窗口的函数那里停住以后,可以通过调用堆栈向上溯源调用关系,而弹窗函数必然和判断的代码块存在联系,所以这里可以通过这种方法试图去找到关键代码块。

右边的注释有提示该函数处于哪个模块,所以这些上面的系统函数我们不必去看了,我们从最下面的010editor开始。

我们点击check后从这个call开始单步走,

走了一会就发现和账号有关的字符串。然后在走就基本找到了弹窗的字符串,然后只要把会跳转过去的je nop掉即可,其他有影响的je同理。

上面的逻辑段明天再写。我们这里先用最简单的放法,搜索字符串,找到弹窗有关字符串所在地址。

这句的上面是句jmp指令,也就是说正常的运行这段是不会运行的。我们要往上找如何跳转到这里的。

这里可以对这条语句右键对地址查找引用,也可以直接把改下分辨率或显示大小(笑)。

找到后,我们只要把诸如此类跳转到弹出错误信息的跳转全部nop,就可以基本使用这个010editor了。

分析算法和逻辑

eax可能会用于存储函数返回值。

这里是从提示输入name,pass那里开始调的,感觉没有什么很好的方法可以直接捕捉这里。

在发生这个转向失败弹窗的极大的跳转前ebx最后被赋值的地方。

到算法这里我觉得xdbg的汇编我实在有点读不下去。。遂转战IDA。

在IDA中通过地址找到对应函数。

从IDA看这段判断时真的好轻松啊

这是判断name,pass正确时的判断式,只要找v17在何处会被赋值为219即可,也就是0xDB。

接着这不久找就会找到和xdbg里查找到的相同的函数。

想要让这个函数返回的值

这堆变量和密码是相关的

可以发现是把密码转化为相应的16进制,如1234->1234h

第一个判断点就是这个switch

根据switch对应的case有三种,分别对应注册码的三种版本,这里就不细说了,推荐这篇文章有详说[原创]010Editor破解(0xac版key注册算法分析)-软件逆向-看雪-安全社区|安全招聘|kanxue.com

我们需要的case是0x9C,也就是说第四对密码必定是0x9C。

重新输入密码后再次动调

这段判断第一次寄了。

这里手动patch了out,过了这个判断,走了几步后这里v16是name。

下面还有两个if判断才能最终走到返回值45.

写不下去了。。。直接看关键截图吧。。。

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include <windows.h>
#include <time.h>
int j = 0;
int S[310] = { 0x39CB44B8, 0x23754F67, 0x5F017211, 0x3EBB24DA, 0x351707C6, 0x63F9774B, 0x17827288, 0x0FE74821,
    0x5B5F670F, 0x48315AE8, 0x785B7769, 0x2B7A1547, 0x38D11292, 0x42A11B32, 0x35332244, 0x77437B60,
    0x1EAB3B10, 0x53810000, 0x1D0212AE, 0x6F0377A8, 0x43C03092, 0x2D3C0A8E, 0x62950CBF, 0x30F06FFA,
    0x34F710E0, 0x28F417FB, 0x350D2F95, 0x5A361D5A, 0x15CC060B, 0x0AFD13CC, 0x28603BCF, 0x3371066B,
    0x30CD14E4, 0x175D3A67, 0x6DD66A13, 0x2D3409F9, 0x581E7B82, 0x76526B99, 0x5C8D5188, 0x2C857971,
    0x15F51FC0, 0x68CC0D11, 0x49F55E5C, 0x275E4364, 0x2D1E0DBC, 0x4CEE7CE3, 0x32555840, 0x112E2E08,
    0x6978065A, 0x72921406, 0x314578E7, 0x175621B7, 0x40771DBF, 0x3FC238D6, 0x4A31128A, 0x2DAD036E,
    0x41A069D6, 0x25400192, 0x00DD4667, 0x6AFC1F4F, 0x571040CE, 0x62FE66DF, 0x41DB4B3E, 0x3582231F,
    0x55F6079A, 0x1CA70644, 0x1B1643D2, 0x3F7228C9, 0x5F141070, 0x3E1474AB, 0x444B256E, 0x537050D9,
    0x0F42094B, 0x2FD820E6, 0x778B2E5E, 0x71176D02, 0x7FEA7A69, 0x5BB54628, 0x19BA6C71, 0x39763A99,
    0x178D54CD, 0x01246E88, 0x3313537E, 0x2B8E2D17, 0x2A3D10BE, 0x59D10582, 0x37A163DB, 0x30D6489A,
    0x6A215C46, 0x0E1C7A76, 0x1FC760E7, 0x79B80C65, 0x27F459B4, 0x799A7326, 0x50BA1782, 0x2A116D5C,
    0x63866E1B, 0x3F920E3C, 0x55023490, 0x55B56089, 0x2C391FD1, 0x2F8035C2, 0x64FD2B7A, 0x4CE8759A,
    0x518504F0, 0x799501A8, 0x3F5B2CAD, 0x38E60160, 0x637641D8, 0x33352A42, 0x51A22C19, 0x085C5851,
    0x032917AB, 0x2B770AC7, 0x30AC77B3, 0x2BEC1907, 0x035202D0, 0x0FA933D3, 0x61255DF3, 0x22AD06BF,
    0x58B86971, 0x5FCA0DE5, 0x700D6456, 0x56A973DB, 0x5AB759FD, 0x330E0BE2, 0x5B3C0DDD, 0x495D3C60,
    0x53BD59A6, 0x4C5E6D91, 0x49D9318D, 0x103D5079, 0x61CE42E3, 0x7ED5121D, 0x14E160ED, 0x212D4EF2,
    0x270133F0, 0x62435A96, 0x1FA75E8B, 0x6F092FBE, 0x4A000D49, 0x57AE1C70, 0x004E2477, 0x561E7E72,
    0x468C0033, 0x5DCC2402, 0x78507AC6, 0x58AF24C7, 0x0DF62D34, 0x358A4708, 0x3CFB1E11, 0x2B71451C,
    0x77A75295, 0x56890721, 0x0FEF75F3, 0x120F24F1, 0x01990AE7, 0x339C4452, 0x27A15B8E, 0x0BA7276D,
    0x60DC1B7B, 0x4F4B7F82, 0x67DB7007, 0x4F4A57D9, 0x621252E8, 0x20532CFC, 0x6A390306, 0x18800423,
    0x19F3778A, 0x462316F0, 0x56AE0937, 0x43C2675C, 0x65CA45FD, 0x0D604FF2, 0x0BFD22CB, 0x3AFE643B,
    0x3BF67FA6, 0x44623579, 0x184031F8, 0x32174F97, 0x4C6A092A, 0x5FB50261, 0x01650174, 0x33634AF1,
    0x712D18F4, 0x6E997169, 0x5DAB7AFE, 0x7C2B2EE8, 0x6EDB75B4, 0x5F836FB6, 0x3C2A6DD6, 0x292D05C2,
    0x052244DB, 0x149A5F4F, 0x5D486540, 0x331D15EA, 0x4F456920, 0x483A699F, 0x3B450F05, 0x3B207C6C,
    0x749D70FE, 0x417461F6, 0x62B031F1, 0x2750577B, 0x29131533, 0x588C3808, 0x1AEF3456, 0x0F3C00EC,
    0x7DA74742, 0x4B797A6C, 0x5EBB3287, 0x786558B8, 0x00ED4FF2, 0x6269691E, 0x24A2255F, 0x62C11F7E,
    0x2F8A7DCD, 0x643B17FE, 0x778318B8, 0x253B60FE, 0x34BB63A3, 0x5B03214F, 0x5F1571F4, 0x1A316E9F,
    0x7ACF2704, 0x28896838, 0x18614677, 0x1BF569EB, 0x0BA85EC9, 0x6ACA6B46, 0x1E43422A, 0x514D5F0E,
    0x413E018C, 0x307626E9, 0x01ED1DFA, 0x49F46F5A, 0x461B642B, 0x7D7007F2, 0x13652657, 0x6B160BC5,
    0x65E04849, 0x1F526E1C, 0x5A0251B6, 0x2BD73F69, 0x2DBF7ACD, 0x51E63E80, 0x5CF2670F, 0x21CD0A03,
    0x5CFF0261, 0x33AE061E, 0x3BB6345F, 0x5D814A75, 0x257B5DF4, 0x0A5C2C5B, 0x16A45527, 0x16F23945,
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x00000000 };
int main()
{
    printf("请输入你想要的password对应的name:\n");
    char name[36] = { 0 };
    scanf("%s", name);
    int len = strlen(name);
    srand(time(NULL));//使用srand是为了方便后面的爆破
    int r[] = { 0x11,0x22,0x33,0x9C,0x55,0x66,0x77,0x88 };//这里必须得是int,char后续运算会丢失数据,里面数据目前为填充用
    int v23;
    v23赋值
    //int v1 = ((r[5] ^ r[2] + ((r[7] ^ r[1]) << 8)) ^ 0x7892 + 19760) ^ 0x3421;
    //if (v1 % 0xB)
    //   v23 = 0;
    //else {
    //    v23 = v1 / 0xB;
    //}
    //v29赋值
    int a1 = (r[6] ^ r[0]) + ((r[5] ^ r[9]) << 16) + ((r[8] ^ r[4]) << 8);//这段中v29必须要大于0x49C7
    int a2 = 0x5b8c27;
    int v2 = (((a2 ^ a1 ^ 0x22C078) - 180597) ^ 0xFFE53167) & 0xFFFFFF;
    int v29 = 0;
    if (v2 % 0x11 == 0)
        v29 = v2 / 0x11;
    //name加密和v25
    __int64 v25 = enname(name, 1, 0, 100);//这里的0和100都是随意取的,但是有一定范围要求
    r[3] = 0x9C;
    r[4] = v25 & 0xFF;
    r[5] = (v25 >> 8) & 0xFF;
    r[6] = (v25 >> 16) & 0xFF;
    r[7] = (v25 >> 24) & 0xFF;

    while (1)
    {
        r[0] = rand() % 0xff;
        if ((((r[0] ^ r[6] ^ 0x18) + 0x3d) ^ 0xa7) != 0) {
            break;
        }
    }
    while (1)
    {
        r[2] = rand() % 0xff;
        r[1] = rand() % 0xff;
        DWORD tmp = (0x100 * (r[1] ^ r[7] & 0xFF) + r[2] ^ r[5] & 0xff) & 0xFFFF;
        DWORD times = (((tmp ^ 0x7892) + 0x4d30) ^ 0x3421) & 0xFFFF;
        if (times % 0xB == 0 && (times / 0xB) == 100)//后面这个条件似乎是保证使用时间为最大情况,需要和上面的ennanme第四个参数相同
            break;
        printf("运行次数:%d\n", j++);
    }
    for (int i = 0; i < 8; i++)
    {
        printf("%02x", r[i] & 0xFF);

    }
}
int  enname(char* a1, int a2, char a3, char a4)//对用户名进行加密,name,1,官方服务有效期,注册码可使用次数
{
    unsigned int v5; // ebp
    __int64 v6; // rax
    __int64 v7; // r13
    __int64 v8; // rbx
    unsigned __int8 v9; // r14
    unsigned __int8 v10; // si
    unsigned __int8 v11; // r15
    unsigned __int8 v12; // di
    int v13; // eax
    int* v14; // r9
    unsigned int v15; // r11d
    int* v16; // r10
    int v17; // ebp
    __int64 v18; // rcx
    __int64 v19; // rax
    int i = 0;
    v5 = 0;
    v6 = -1i64;
    do
        ++v6;
    while (a1[v6]);
    v7 = v6;
    if (v6 > 0)
    {
        v8 = 0i64;
        v9 = 0;
        v10 = 15 * a4;
        v11 = 0;
        v12 = 17 * a3;
        do
        {
            v13 = toupper(a1[v8]);
            v14 = &S[v12];
            v15 = v5 + S[v13];
            v16 = &S[v10];
            if (a2)
            {
                v17 = S[(v13 + 13)];
                v18 = (v13 + 47);
                v19 = v9;
            }
            else
            {
                v17 = S[(v13 + 63)];
                v18 = (v13 + 23);
                v19 = v11;
            }
            v12 += 9;
            v10 += 13;
            v9 += 19;
            v11 += 7;
            ++v8;
            v5 = *v16 + *v14 + S[v19] + S[v18] * (v15 ^ v17);
            printf("%d\n", j++);
        } while (v8 < v7);
    }
    return v5;
}

AC版本号

AC版本号以我的拙见实在爆不出来。。。所以借鉴了其他人的代码,这个作者的数学好强。

[原创]010Editor破解(0xac版key注册算法分析)-软件逆向-看雪-安全社区|安全招聘|kanxue.com

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include <windows.h>
#include <time.h>
int j = 0;
int S[310] = { 0x39CB44B8, 0x23754F67, 0x5F017211, 0x3EBB24DA, 0x351707C6, 0x63F9774B, 0x17827288, 0x0FE74821,
    0x5B5F670F, 0x48315AE8, 0x785B7769, 0x2B7A1547, 0x38D11292, 0x42A11B32, 0x35332244, 0x77437B60,
    0x1EAB3B10, 0x53810000, 0x1D0212AE, 0x6F0377A8, 0x43C03092, 0x2D3C0A8E, 0x62950CBF, 0x30F06FFA,
    0x34F710E0, 0x28F417FB, 0x350D2F95, 0x5A361D5A, 0x15CC060B, 0x0AFD13CC, 0x28603BCF, 0x3371066B,
    0x30CD14E4, 0x175D3A67, 0x6DD66A13, 0x2D3409F9, 0x581E7B82, 0x76526B99, 0x5C8D5188, 0x2C857971,
    0x15F51FC0, 0x68CC0D11, 0x49F55E5C, 0x275E4364, 0x2D1E0DBC, 0x4CEE7CE3, 0x32555840, 0x112E2E08,
    0x6978065A, 0x72921406, 0x314578E7, 0x175621B7, 0x40771DBF, 0x3FC238D6, 0x4A31128A, 0x2DAD036E,
    0x41A069D6, 0x25400192, 0x00DD4667, 0x6AFC1F4F, 0x571040CE, 0x62FE66DF, 0x41DB4B3E, 0x3582231F,
    0x55F6079A, 0x1CA70644, 0x1B1643D2, 0x3F7228C9, 0x5F141070, 0x3E1474AB, 0x444B256E, 0x537050D9,
    0x0F42094B, 0x2FD820E6, 0x778B2E5E, 0x71176D02, 0x7FEA7A69, 0x5BB54628, 0x19BA6C71, 0x39763A99,
    0x178D54CD, 0x01246E88, 0x3313537E, 0x2B8E2D17, 0x2A3D10BE, 0x59D10582, 0x37A163DB, 0x30D6489A,
    0x6A215C46, 0x0E1C7A76, 0x1FC760E7, 0x79B80C65, 0x27F459B4, 0x799A7326, 0x50BA1782, 0x2A116D5C,
    0x63866E1B, 0x3F920E3C, 0x55023490, 0x55B56089, 0x2C391FD1, 0x2F8035C2, 0x64FD2B7A, 0x4CE8759A,
    0x518504F0, 0x799501A8, 0x3F5B2CAD, 0x38E60160, 0x637641D8, 0x33352A42, 0x51A22C19, 0x085C5851,
    0x032917AB, 0x2B770AC7, 0x30AC77B3, 0x2BEC1907, 0x035202D0, 0x0FA933D3, 0x61255DF3, 0x22AD06BF,
    0x58B86971, 0x5FCA0DE5, 0x700D6456, 0x56A973DB, 0x5AB759FD, 0x330E0BE2, 0x5B3C0DDD, 0x495D3C60,
    0x53BD59A6, 0x4C5E6D91, 0x49D9318D, 0x103D5079, 0x61CE42E3, 0x7ED5121D, 0x14E160ED, 0x212D4EF2,
    0x270133F0, 0x62435A96, 0x1FA75E8B, 0x6F092FBE, 0x4A000D49, 0x57AE1C70, 0x004E2477, 0x561E7E72,
    0x468C0033, 0x5DCC2402, 0x78507AC6, 0x58AF24C7, 0x0DF62D34, 0x358A4708, 0x3CFB1E11, 0x2B71451C,
    0x77A75295, 0x56890721, 0x0FEF75F3, 0x120F24F1, 0x01990AE7, 0x339C4452, 0x27A15B8E, 0x0BA7276D,
    0x60DC1B7B, 0x4F4B7F82, 0x67DB7007, 0x4F4A57D9, 0x621252E8, 0x20532CFC, 0x6A390306, 0x18800423,
    0x19F3778A, 0x462316F0, 0x56AE0937, 0x43C2675C, 0x65CA45FD, 0x0D604FF2, 0x0BFD22CB, 0x3AFE643B,
    0x3BF67FA6, 0x44623579, 0x184031F8, 0x32174F97, 0x4C6A092A, 0x5FB50261, 0x01650174, 0x33634AF1,
    0x712D18F4, 0x6E997169, 0x5DAB7AFE, 0x7C2B2EE8, 0x6EDB75B4, 0x5F836FB6, 0x3C2A6DD6, 0x292D05C2,
    0x052244DB, 0x149A5F4F, 0x5D486540, 0x331D15EA, 0x4F456920, 0x483A699F, 0x3B450F05, 0x3B207C6C,
    0x749D70FE, 0x417461F6, 0x62B031F1, 0x2750577B, 0x29131533, 0x588C3808, 0x1AEF3456, 0x0F3C00EC,
    0x7DA74742, 0x4B797A6C, 0x5EBB3287, 0x786558B8, 0x00ED4FF2, 0x6269691E, 0x24A2255F, 0x62C11F7E,
    0x2F8A7DCD, 0x643B17FE, 0x778318B8, 0x253B60FE, 0x34BB63A3, 0x5B03214F, 0x5F1571F4, 0x1A316E9F,
    0x7ACF2704, 0x28896838, 0x18614677, 0x1BF569EB, 0x0BA85EC9, 0x6ACA6B46, 0x1E43422A, 0x514D5F0E,
    0x413E018C, 0x307626E9, 0x01ED1DFA, 0x49F46F5A, 0x461B642B, 0x7D7007F2, 0x13652657, 0x6B160BC5,
    0x65E04849, 0x1F526E1C, 0x5A0251B6, 0x2BD73F69, 0x2DBF7ACD, 0x51E63E80, 0x5CF2670F, 0x21CD0A03,
    0x5CFF0261, 0x33AE061E, 0x3BB6345F, 0x5D814A75, 0x257B5DF4, 0x0A5C2C5B, 0x16A45527, 0x16F23945,
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
    0x00000000, 0x00000000, 0x00000000, 0x00000000 };
int main()
{
    printf("请输入你想要的password对应的name:\n");
    char name[36] = { 0 };
    scanf("%s", name);
    int len = strlen(name);
    srand(time(NULL));//使用srand是为了方便后面的爆破
    int dwRet = 0x3E8;
    int r[] = { 0x11,0x22,0x33,0x9C,0x55,0x66,0x77,0x88,0x99,0x00 };//这里必须得是int,char后续运算会丢失数据,里面数据目前为填充用
    int v23;
    v23赋值
    //int v1 = ((r[5] ^ r[2] + ((r[7] ^ r[1]) << 8)) ^ 0x7892 + 19760) ^ 0x3421;
    //if (v1 % 0xB)
    //   v23 = 0;
    //else {
    //    v23 = v1 / 0xB;
    //}
    //v29赋值
    int a1 = (r[6] ^ r[0]) + ((r[5] ^ r[9]) << 16) + ((r[8] ^ r[4]) << 8);//这段中v29必须要大于0x49C7
    int a2 = 0x5b8c27;
    int v2 = (((a2 ^ a1 ^ 0x22C078) - 180597) ^ 0xFFE53167) & 0xFFFFFF;
    int v29 = 0;
    if (v2 % 0x11 == 0)
        v29 = v2 / 0x11;
    //name加密和v25
    __int64 v25 = enname(name, 1, 0xafff,0x98);
    r[3] = 0xAC;
    r[4] = v25 & 0xFF;
    r[5] = (v25 >> 8) & 0xFF;
    r[6] = (v25 >> 16) & 0xFF;
    r[7] = (v25 >> 24) & 0xFF;

 
    r[3] = 0xac;
    int a1_48 = 0x98 * 0xb;
    int v15 = ((a1_48 ^ 0x3421) - 19760) ^ 0x7892;
    r[2] = (v15 & 0xff) ^ r[5];
    r[1] = ((v15 >> 8) & 0xff) ^ r[7];
   int v6 = ((((0xafff * 0x11) ^ 0xffe53167) + 180597) ^ 0x22c078 ^ 0x5b8c27) & 0xffffff;
    r[0] = (v6 & 0xff) ^ r[6];
    r[8] = ((v6 >> 8) & 0xff) ^ r[4];
    r[9] = ((v6 >> 16) & 0xff) ^ r[5];
    for (int i = 0; i < 10; i++)
    {
        printf("%x", r[i] & 0xFF);

    }
}
int  enname(char* a1, int a2, char a3, char a4)//对用户名进行加密,其中一个判断,这三个参数分别是name,1,官方服务有效期,注册码可使用次数
{
    unsigned int v5; // ebp
    __int64 v6; // rax
    __int64 v7; // r13
    __int64 v8; // rbx
    unsigned __int8 v9; // r14
    unsigned __int8 v10; // si
    unsigned __int8 v11; // r15
    unsigned __int8 v12; // di
    int v13; // eax
    int* v14; // r9
    unsigned int v15; // r11d
    int* v16; // r10
    int v17; // ebp
    __int64 v18; // rcx
    __int64 v19; // rax
    int i = 0;
    v5 = 0;
    v6 = -1i64;
    do
        ++v6;
    while (a1[v6]);
    v7 = v6;
    if (v6 > 0)
    {
        v8 = 0i64;
        v9 = 0;
        v10 = 15 * a4;
        v11 = 0;
        v12 = 17 * a3;
        do
        {
            v13 = toupper(a1[v8]);
            v14 = &S[v12];
            v15 = v5 + S[v13];
            v16 = &S[v10];
            if (a2)
            {
                v17 = S[(v13 + 13)];
                v18 = (v13 + 47);
                v19 = v9;
            }
            else
            {
                v17 = S[(v13 + 63)];
                v18 = (v13 + 23);
                v19 = v11;
            }
            v12 += 9;
            v10 += 13;
            v9 += 19;
            v11 += 7;
            ++v8;
            v5 = *v16 + *v14 + S[v19] + S[v18] * (v15 ^ v17);
            printf("%d\n", j++);
        } while (v8 < v7);
    }
    return v5;
}

总的来说提及几个其中遇到的问题和见解好了。

首先关键还是得把整个走向成功的代码流向搞懂,把握住关键的跳转点,然后对这些跳转点进行爆破或其他处理。

然后就是下载过破解版的好像会导致注册表有点问题,所以要在虚拟机里进行注册。

这个点的关键赋值点是这个v19.

我也不太清楚这个函数在干啥。。。

  • 47
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值