Работаем над CronosPlus 3.04.72 со скальпилем и молотком :)

Discussion in 'Реверсинг' started by TrapMen, 7 Mar 2008.

  1. TrapMen

    TrapMen New Member

    Joined:
    18 Feb 2008
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    В общем, молчание по поводу реверса сабжа, думаю, стоит понимать как полную капитуляцию реверсеров :(
    Либо, как в том анекдоте про неуловимого Джо, который нах%#* никому не нужен ;)

    В общем, попытаюсь более точно сформулировать задачу.
    Есть оболочка под кодовым названием "cronos_3_04_74_all_sn" :)
    Присутствуюет там такое файло:
    ; Generated by QuickSFV v2.35 on 2008-03-06 at 23:18:12
    ; http://www.QuickSFV.org
    ;
    ; 151668 01:00.36 2003-09-23 CroBugs.dll
    ; 17 04:46.46 2005-03-23 CroInfo
    ; 13047812 20:10.38 2008-03-01 Cronos.exe
    ; 1007 23:17.06 2008-03-06 CroSys.dat
    ; 32 23:17.06 2008-03-06 CroSys.tad
    CroBugs.dll E8CF38A4
    CroInfo CD67560B
    Cronos.exe F3DF3D98
    CroSys.dat 0234F80D
    CroSys.tad 9AC0E39B

    Над самим exeшником уже поработал некий "Evil Hacker", который основную муторную работу сделал:
    - распаковал exeшник
    - заNOPил сверку серийников банков

    За что ему большой респект. Теперь большинство пользователей, даже легально купленных версий юзают эту оболчку.

    Теперь осталось только немного довести до ума его труды :)
    Надо:
    1. раскопать формат хранения (структуру) файлов:
    а) Списка подключенных к системе банков (CroSys.dat, CroSys.tad)
    б) Самих банков данных (*.dat, *.tad, *.cpy)
    2. Научиться вскрывать защищенные паролем банки

    Для чего? Думаю, те, кто так или иначе сталкивался с этой системой меня поймут...
    Например, когду у вас есть куча банков, а вам надо сменить букву диска, то предстоит очень муторная работа...
    Как вариант, можно, конечно, написать навесок к этой оболочке, который будет вызывает участок кода, отвечающий за обработку диалога добавления банка, но как это грамотно реализовать я пока еще не придумал.

    Вот что мне уже удалось накопать:
    Заюзав Иду 5.2.0.908 и плаг Hey-Reys 1.0.071108 получил более-менее вменяемые листинги некоторых интересных на мой взгляд функций:

    [c]
    //----- (00557E40) --------------------------------------------------------
    signed int __userpurge sub_557E40<eax>(int a1<ecx>, int a2<ebp>, int a3, int a4, int a5, char a6)
    {
    int v6; // ebx@1
    unsigned int v7; // esi@1
    char *v8; // eax@3
    char *v9; // esi@3
    unsigned __int8 v10; // cf@4
    char v11; // cl@6
    int v12; // eax@8
    unsigned __int8 v13; // cf@11
    char v14; // zf@11
    int v15; // eax@11
    signed int v16; // ecx@11
    char *v17; // edi@11
    char *v18; // esi@11
    int v19; // edi@18
    int v20; // esi@18
    char v21; // bl@20
    signed int result; // eax@24
    unsigned __int8 v23; // bl@25
    int v24; // eax@29
    int v25; // esi@30
    int v26; // eax@31
    int v27; // eax@1
    int v28; // eax@2
    unsigned __int8 v29; // dl@6
    int v30; // ecx@18
    int v31; // eax@18
    unsigned __int8 v32; // bl@18
    int v33; // edx@18
    int v34; // eax@18
    int v35; // edx@18
    int v36; // eax@20
    int v37; // edx@20
    int *v38; // ecx@23
    int v39; // eax@25
    int v40; // edx@25
    LPVOID v41; // eax@30
    int v42; // eax@31
    int v43; // edx@31
    char v44; // cl@31
    char v45; // ST08_1@31
    char v46; // [sp+108h] [bp-13Ch]@1
    int v47; // [sp+0h] [bp-244h]@1
    int *v48; // [sp+234h] [bp-10h]@1
    int v49; // [sp+22Ch] [bp-18h]@1
    int v50; // [sp+112h] [bp-132h]@1
    char v51; // [sp+116h] [bp-12Eh]@1
    int v52; // [sp+230h] [bp-14h]@1
    _BYTE v53[237]; // [sp+11Bh] [bp-129h]@2
    int v54; // [sp+240h] [bp-4h]@3
    char v55; // [sp+Ch] [bp-238h]@3
    char v56; // [sp+19h] [bp-22Bh]@11
    int v57; // [sp+1Dh] [bp-227h]@18
    __int16 v58; // [sp+1Bh] [bp-229h]@18
    char v59; // [sp+21Ch] [bp-28h]@18
    int v60; // [sp+218h] [bp-2Ch]@18
    int v61; // [sp+214h] [bp-30h]@18
    int v62; // [sp+220h] [bp-24h]@21
    unsigned int v63; // [sp+224h] [bp-20h]@22
    __int16 v64; // [sp+117h] [bp-12Dh]@23
    __int16 v65; // [sp+119h] [bp-12Bh]@23
    int v66; // [sp+208h] [bp-3Ch]@33

    v6 = a1;
    strcpy(&v46, "CroFile");
    v48 = &v47;
    v49 = v6;
    v50 = dword_DADD14;
    v51 = byte_DADD18;
    v27 = sub_AF2365((int)&v52);
    sub_AF318E(v27);
    v7 = 0;
    do
    {
    v28 = sub_AF319B();
    v53[v7++] = ((unsigned int)((v28 << 8) + ((unsigned __int64)(-2147418109i64 * (v28 << 8)) >> 32)) >> 31)
    + (unsigned __int8)((signed int)((v28 << 8) + ((unsigned __int64)(-2147418109i64 * (v28 << 8)) >> 32)) >> 14);
    }
    while ( v7 < 0xE9 );
    v54 = 0;
    v52 = v6 + 10804;
    sub_53B100((int *)(v6 + 10804), (int)&v55, 252);
    v9 = &v46;
    v8 = &v55;
    while ( 1 )
    {
    v10 = *v8 < (unsigned __int8)*v9;
    if ( *v8 != *v9 )
    break;
    if ( !*v8 )
    goto LABEL_8;
    v29 = *(v8 + 1);
    v11 = *(v8 + 1);
    v10 = v29 < *(v9 + 1);
    if ( v29 != *(v9 + 1) )
    break;
    v8 += 2;
    v9 += 2;
    if ( !v11 )
    {
    LABEL_8:
    v12 = 0;
    goto LABEL_10;
    }
    }
    v12 = -v10 - (v10 - 1);
    LABEL_10:
    if ( v12 )
    goto LABEL_37;
    v16 = 2;
    v17 = (char *)&v50 + 3;
    v18 = &v56;
    v15 = 0;
    v13 = 0;
    v14 = 1;
    do
    {
    if ( !v16 )
    break;
    v13 = *v18 < (unsigned __int8)*v17;
    v14 = *v18++ == *v17++;
    --v16;
    }
    while ( v14 );
    if ( !v14 )
    v15 = -v13 - (v13 - 1);
    if ( v15 > 0 )
    {
    LABEL_37:
    v39 = sub_98EBB0((int)&v59, &v56, 2);
    LOBYTE(v54) = 4;
    v23 = sub_991D50(v39);
    v60 = v40;
    LOBYTE(v54) = 0;
    if ( (v59 & 0x5F) == 16 )
    {
    if ( v62 )
    sub_99BEF0((void **)&v62, v63, 0);
    }
    if ( v23 > 2u )
    {
    v24 = sub_904D50();
    if ( v24 )
    {
    v41 = sub_B1C78C(v24, 28);
    v25 = (int)v41;
    *(_DWORD *)&a6 = v41;
    LOBYTE(v54) = 5;
    if ( v41 )
    {
    v42 = sub_5F8C60(v52);
    v43 = *(_DWORD *)v42;
    v45 = v44;
    v52 = (int)&v45;
    (*(int (__thiscall **)(int, char *))(v43 + 4))(v42, &v45);
    v26 = sub_442780(v25, a2, 107, v45);
    }
    else
    {
    v26 = 0;
    }
    LOBYTE(v54) = 0;
    v66 = v26;
    sub_AF2183((int)&v66, (int)dword_CD5590);
    }
    }
    result = 0;
    }
    else
    {
    v20 = a3;
    v19 = a5;
    v30 = (unsigned __int16)v57;
    *(_WORD *)a3 = v58;
    *(_DWORD *)v19 = v30;
    *(_WORD *)(v6 + 20) = *(_WORD *)v20;
    *(_DWORD *)(v6 + 10808) = *(_DWORD *)v19;
    v31 = sub_98EBB0((int)&v59, &v56, 2);
    LOBYTE(v54) = 1;
    v32 = sub_991D50(v31);
    v60 = v33;
    LOBYTE(v54) = 0;
    sub_4242B0((int)&v59);
    *(_BYTE *)(v49 + 22) = v32;
    v34 = sub_98EBB0((int)&v59, (char *)&v50 + 3, 2);
    LOBYTE(v54) = 2;
    v61 = sub_991D50(v34);
    v60 = v35;
    LOBYTE(v54) = 0;
    sub_4242B0((int)&v59);
    if ( v32 < (_BYTE)v61 )
    {
    if ( a6 & 2 )
    {
    v36 = sub_98EBB0((int)&v59, (char *)&v50 + 3, 2);
    LOBYTE(v54) = 3;
    v21 = sub_991D50(v36);
    v60 = v37;
    LOBYTE(v54) = 0;
    if ( (v59 & 0x5F) == 16 )
    {
    if ( v62 )
    sub_99BEF0((void **)&v62, v63, 0);
    }
    v38 = (int *)v52;
    *(_BYTE *)(v49 + 22) = v21;
    v64 = *(_WORD *)v20;
    v65 = *(_DWORD *)v19;
    sub_53B120(v38, (int)&v46, 252);
    }
    }
    result = 1;
    }
    return result;
    }
    [/c]

    Присмотревшись к этой процедурке в OllyDbg и софт-айсе, мои догадки начали понемного подтверждаться - все ихние файлики данных унифицированы и открываются вроде как только через эту процедуру. Просто слишком они в ней что-то намудрили и я погряз в её анализе... :(

    В общем, предлагаю объединиться и вскрыть это дело.
    У кого еще есть какие дельные соображения по этому поводу?
    Если есть желание пообщаться в привате:
    ася 55-111-5
    trapmen гмаил.ком
    готов приобрести реальные наработки по этой теме...

    P.S.: Зарапидил исследуемые файлы и C-листинг, который выплюнул Hex-Rays: cronos_3_04_74_all_sn_reversed.rar
     
    #1 TrapMen, 7 Mar 2008
    Last edited: 7 Mar 2008