PDA

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


TrapMen
07.03.2008, 01:20
В общем, молчание по поводу реверса сабжа (http://www.wasm.ru/forum/viewtopic.php?id=25310), думаю, стоит понимать как полную капитуляцию реверсеров :(
Либо, как в том анекдоте про неуловимого Джо, который нах%#* никому не нужен ;)

В общем, попытаюсь более точно сформулировать задачу.
Есть оболочка под кодовым названием "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 получил более-менее вменяемые листинги некоторых интересных на мой взгляд функций:


//----- (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;
}


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

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

P.S.: Зарапидил исследуемые файлы и C-листинг, который выплюнул Hex-Rays: cronos_3_04_74_all_sn_reversed.rar (http://rapidshare.com/files/97575783/cronos_3_04_74_all_sn_reversed.rar)