Creckme_Andrnalin.4

运行一下程序

程序的界面还是很简单的,用按钮输入serial,在旁边的status栏则可以看到serial是否正确。

然后用die查一下:

还是VB,无壳。

尽然是vb,那我们还是使用一下VB的静态工具:

这里我们看到这个控件还是蛮多的,但是大概浏览一下我们可以发现,有重要信息的只有那四个事件控件:

点进这四个控件分别查看,可以发现其中的一些规律:

每一段代码都是相似的,除了这个一长串的字符串,看来这些字符串就是密钥了,那么这么多字符串,怎么才能判断哪个才是密钥呢?

我们看到上面代码的逻辑:

这里表示,我们输入的码,要变成十六进制,那么我们看到下面的密钥,必须也是十六进制呀,所以这样我么就可以排除一些了。

最后我们找到了一个满足十六进制的密钥:

然后我们进入OD查看详细的serial注册过程:

00406EDC   > /85C0          test eax,eax
00406EDE   . |0F84 29010000 je Andréna.0040700D
00406EE4   . |8D4D BC       lea ecx,dword ptr ss:[ebp-0x44]
00406EE7   . |6A 02         push 0x2
00406EE9   . |8D55 8C       lea edx,dword ptr ss:[ebp-0x74]
00406EEC   . |51            push ecx
00406EED   . |52            push edx
00406EEE   . |FFD3          call ebx                                    ;  msvbvm60.rtcLeftCharVar
00406EF0   . |8D45 8C       lea eax,dword ptr ss:[ebp-0x74]
00406EF3   . |8D4D B0       lea ecx,dword ptr ss:[ebp-0x50]
00406EF6   . |50            push eax
00406EF7   . |51            push ecx
00406EF8   . |FFD6          call esi                                    ;  取假码的前两位
00406EFA   . |50            push eax
00406EFB   . |FF15 D8104000 call dword ptr ds:[<&MSVBVM60.#rtcR8ValFrom>;  变为浮点型
00406F01   . |DD9D 34FFFFFF fstp qword ptr ss:[ebp-0xCC]
00406F07   . |8D55 9C       lea edx,dword ptr ss:[ebp-0x64]
00406F0A   . |8D45 DC       lea eax,dword ptr ss:[ebp-0x24]
00406F0D   . |52            push edx
00406F0E   . |50            push eax
00406F0F   . |C745 A4 01000>mov dword ptr ss:[ebp-0x5C],0x1
00406F16   . |C745 9C 02000>mov dword ptr ss:[ebp-0x64],0x2
00406F1D   . |FF15 AC104000 call dword ptr ds:[<&MSVBVM60.__vbaI4Var>]  ;  msvbvm60.__vbaI4Var
00406F23   . |8D4D BC       lea ecx,dword ptr ss:[ebp-0x44]
00406F26   . |50            push eax
00406F27   . |8D55 B8       lea edx,dword ptr ss:[ebp-0x48]
00406F2A   . |51            push ecx
00406F2B   . |52            push edx
00406F2C   . |FFD6          call esi                                    ;  msvbvm60.__vbaStrVarVal
00406F2E   . |50            push eax
00406F2F   . |FF15 4C104000 call dword ptr ds:[<&MSVBVM60.#rtcMidCharBs>;  取第i位
00406F35   . |8BD0          mov edx,eax
00406F37   . |8D4D B4       lea ecx,dword ptr ss:[ebp-0x4C]
00406F3A   . |FF15 BC104000 call dword ptr ds:[<&MSVBVM60.__vbaStrMove>>;  msvbvm60.__vbaStrMove
00406F40   . |50            push eax                                    ; /String = 00000001 ???
00406F41   . |FF15 20104000 call dword ptr ds:[<&MSVBVM60.#rtcAnsiValue>; \取ascii码
00406F47   . |0FBFC0        movsx eax,ax                                ;  将ascii码当做十六进制储存
00406F4A   . |8985 F0FCFFFF mov dword ptr ss:[ebp-0x310],eax
00406F50   . |8D8D 7CFFFFFF lea ecx,dword ptr ss:[ebp-0x84]
00406F56   . |DB85 F0FCFFFF fild dword ptr ss:[ebp-0x310]               ;  变为十进制
00406F5C   . |51            push ecx
00406F5D   . |C785 7CFFFFFF>mov dword ptr ss:[ebp-0x84],0x5
00406F67   . |DD9D E8FCFFFF fstp qword ptr ss:[ebp-0x318]
00406F6D   . |DD85 E8FCFFFF fld qword ptr ss:[ebp-0x318]
00406F73   . |DC85 34FFFFFF fadd qword ptr ss:[ebp-0xCC]                ;  第i位加上前两位
00406F79   . |DD5D 84       fstp qword ptr ss:[ebp-0x7C]
00406F7C   . |DFE0          fstsw ax
00406F7E   . |A8 0D         test al,0xD
00406F80   . |0F85 D61D0000 jnz Andréna.00408D5C
00406F86   . |FF15 94104000 call dword ptr ds:[<&MSVBVM60.#rtcHexBstrFr>;  变为十六进制
00406F8C   . |8985 74FFFFFF mov dword ptr ss:[ebp-0x8C],eax
00406F92   . |8D55 CC       lea edx,dword ptr ss:[ebp-0x34]
00406F95   . |8D85 6CFFFFFF lea eax,dword ptr ss:[ebp-0x94]
00406F9B   . |52            push edx
00406F9C   . |8D8D 5CFFFFFF lea ecx,dword ptr ss:[ebp-0xA4]
00406FA2   . |50            push eax
00406FA3   . |51            push ecx
00406FA4   . |C785 6CFFFFFF>mov dword ptr ss:[ebp-0x94],0x8
00406FAE   . |FF15 84104000 call dword ptr ds:[<&MSVBVM60.__vbaVarCat>] ;  链接字符串
00406FB4   . |8BD0          mov edx,eax
00406FB6   . |8D4D CC       lea ecx,dword ptr ss:[ebp-0x34]
00406FB9   . |FFD7          call edi                                    ;  msvbvm60.__vbaVarMove
00406FBB   . |8D55 B0       lea edx,dword ptr ss:[ebp-0x50]
00406FBE   . |8D45 B4       lea eax,dword ptr ss:[ebp-0x4C]
00406FC1   . |52            push edx
00406FC2   . |8D4D B8       lea ecx,dword ptr ss:[ebp-0x48]
00406FC5   . |50            push eax
00406FC6   . |51            push ecx
00406FC7   . |6A 03         push 0x3
00406FC9   . |FF15 9C104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeStrL>;  msvbvm60.__vbaFreeStrList
00406FCF   . |8D95 6CFFFFFF lea edx,dword ptr ss:[ebp-0x94]
00406FD5   . |8D85 7CFFFFFF lea eax,dword ptr ss:[ebp-0x84]
00406FDB   . |52            push edx
00406FDC   . |8D4D 8C       lea ecx,dword ptr ss:[ebp-0x74]
00406FDF   . |50            push eax
00406FE0   . |8D55 9C       lea edx,dword ptr ss:[ebp-0x64]
00406FE3   . |51            push ecx
00406FE4   . |52            push edx
00406FE5   . |6A 04         push 0x4
00406FE7   . |FF15 14104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeVarL>;  msvbvm60.__vbaFreeVarList
00406FED   . |83C4 24       add esp,0x24
00406FF0   . |8D85 E8FEFFFF lea eax,dword ptr ss:[ebp-0x118]
00406FF6   . |50            push eax                                    ; /TMPend8 = 00000001
00406FF7   . |8D8D F8FEFFFF lea ecx,dword ptr ss:[ebp-0x108]            ; |
00406FFD   . |8D55 DC       lea edx,dword ptr ss:[ebp-0x24]             ; |
00407000   . |51            push ecx                                    ; |TMPstep8 = 00000003
00407001   . |52            push edx                                    ; |Counter8 = 00000006
00407002   . |FF15 C8104000 call dword ptr ds:[<&MSVBVM60.__vbaVarForNe>; \__vbaVarForNext
00407008   .^\E9 CFFEFFFF   jmp Andréna.00406EDC

这个注册机大概的流程就是:

先取输入的字符串的前两位组成一个数字,然后把输入的字符串的每一位的ascii码当作十六进制转化为十进制,然后加上这个数字,把最后的结果转化为十六进制,最后拼接到一起后,在最前面加上0.

比如我输入的(123456789),然后程序会取前两位(12),然后取第一位(1)的ascii当作十六进制存储(0x31),然后再变为十进制(0x31=49),加上前两位变为十六进制(49+12=61=0x3D),然后进行循环,最后把十六进制组成一个新的字符串,再和

0817E747D7A7D7C7F82836D74747A7F7E7G7C7D826D817E7B7

进行比较。

#include <iostream>
#include <sstream>

using namespace std;

string kb = "0123456789*#";
int kb_dec[] = { 48,49,50,51,52,53,54,55,56,57,42,35 };
int kb_hex[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
string hexlist = "0123456789ABCDEF";
int key_num = 2;
string key = "0817E747D7A7D7C7F82836D74747A7F7E7B7C7D826D817E7B7C";

int hexstr_to_dec(const string s) //转16进制两位字符到十进制数
{
    int a, b;
    a = hexlist.find(s[0]);
    b = hexlist.find(s[1]);
    return a * 16 + b;
}
void main()
{
    int key_value;
    int base_value;
    string psword;
    char p;
    string key_str = key.substr(1, 2);  //取Key的二、三位
    key_value = hexstr_to_dec(key_str);

    for (int x = 1; x <= 9; x++)                //确定公共值base_value                 
    {
        for (int y = 0; y <= 9; y++)
        {
            if (y + x * 10 + kb_dec[x] == key_value)
            {
                base_value = x * 10 + y;
                break;
            }
        }
    }
    cout << "公共值:" << base_value << endl;
    for (int x = 1; x < key.length(); x += 2)          /*计算 注册码 部分*/
    {
        key_str = key.substr(x, 2);
        key_value = hexstr_to_dec(key_str);
        p = (char)(key_value - base_value);
        psword = psword + p;
    }
    cout << "password:" << psword << endl;
    system("pause");
    }

这是一个大佬的代码,咱就偷偷懒直接拿来用了0v0

posted @ 2020-07-17 15:34  Kylimi  阅读(180)  评论(0编辑  收藏  举报