Сейчас на форуме: johnniewalker, NIKOLA (+6 невидимых)

 eXeL@B —› Крэки, обсуждения —› Реверсинг CronosPlus 3.04.x
Посл.ответ Сообщение

Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 18 февраля 2008 15:32
· Личное сообщение · #1

Кто занимался реверсингом сабжа, поделитесь опытом...

1. Хочу раскопать формат хранения файлов банков и списка банков CroSys.dat и CroSys.tad.
Пока ничего внятнее sergsv.narod.ru/cronos.htm я не видел. Но это уже не актуально.
2. Снять проверку защиты банков и убрать дебильное сообщение "неверный системный пароль системы"

Если есть интересные наработки, готов обсудить в личке.



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 06 марта 2008 23:52
· Личное сообщение · #2

В общем, молчание, думаю, стоит понимать как полную капитуляцию здешних обитателей к реверсингу данного продукта
Либо, как в том анекдоте про неуловимого Джо, который нах%#* никому не нужен ;)

В общем, попытаюсь более точно сформулировать задачу.
Есть оболочка под кодовым названием "cronos_3_04_74_all_sn"
Присутствуюет там такое файло:
; Generated by QuickSFV v2.35 on 2008-03-06 at 23:18:12
; 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:rapidshare.com/files/97575783/cronos_3_04_74_all_sn_reversed.rar




Ранг: 105.9 (ветеран)
Активность: 0.060
Статус: Участник

Создано: 07 марта 2008 09:31 · Поправил: seeq
· Личное сообщение · #3

trapmen пишет:
Заюзав Иду 5.2.0.908 и плаг Hey-Reys 1.0.071108 получил более-менее вменяемые листинги

если ты считаешь, что этот листинг вменяемый, так в чем тогда проблема?



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 марта 2008 14:17
· Личное сообщение · #4

seeq пишет:
если ты считаешь, что этот листинг вменяемый, так в чем тогда проблема?

Насчет вменяемости, конечно перегнул, это точно

seeq пишет:
Молчание стоит понимать, как нежелание передавать опыт первому встречному. На коммерческой основе на руборде тебе все сделают. А рассказывать что да как, врядли кто-то будет.

Очень хотелось бы лишиться побыстрее титула "первый встречный" ;)

Может просто кто-нибудь подскажет в каком направлении дальше копать...




Ранг: 279.1 (наставник)
Активность: 0.160
Статус: Участник
wizard

Создано: 08 марта 2008 09:18
· Личное сообщение · #5

trapmen выложи CroSys.dat и CroSys.tad - посмотрим

-----
Что один человек сделал , другой всегда сломать может...




Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 марта 2008 11:25
· Личное сообщение · #6

MACKLIA Зачем CroSys.* ? Там храниться список подключенных банков и еще кое-что, я их уже выложил во втором посте вместе с оболочкой...



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 марта 2008 11:29
· Личное сообщение · #7

Кстати, есть такая интересная программка Архивариус-3000 http://www.likasoft.com/ru/document-search/ , в ней появилась поддержка чтения банков Кроноса...
На днях постараюсь её расковырять, думаю там мусора должно быть меньше, и попробую оттуда дёрнуть формат файлов...



Ранг: 0.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 18 августа 2017 20:08 · Поправил: zenbooster
· Личное сообщение · #8

Тоже реверсил эту функцию. По сути она проверяет только наличие сигнатуры "CroFile" и младший номер версии в заголовке. Вообщем частично удалось декодировать данные. В коде была найдена функция, которая кодирует / декодирует данные с помощью таблицы подстановок. Но в неё каждый раз передаётся разное смещение (отдельный параметр по сути являющийся ключом). Откуда берётся смещение пока не ясно.
Структура 12 байтного элемента .tad файла, описанная по ссылке верна только на половину. Смещение ofs2 у меня указывало за пределы файла. Тут надо отдельно пореверсить.
Пока что написал скрипт на питоне, который открывает файлы crostruc.tad и .dat, и декодирует первую часть первой записи, причём смещение-ключ пришлось подбирать вручную. На выходе получил бинарщину со списком названий полей в кодировке cp1251.
Там ещё странные объекты-контейнеры встречаются на каждом шагу. Типо если размер <= 8, поле буфер (char[8]) содержит эти данные а поле маска = 0x40 + размер, иначе первая половина буфера это адрес нового блока выделенного под эти данные, 2-я половина - размер, а маска = 0x10.
Это ведь что то стандартное? Сорян что без картинок и исходников, я с телефона и в отпуске =)



Ранг: 33.4 (посетитель), 24thx
Активность: 0.020
Статус: Участник

Создано: 19 августа 2017 01:24 · Поправил: redlord
· Личное сообщение · #9

что-то ты в отпуске задержался




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 19 августа 2017 05:42
· Личное сообщение · #10

trapmen

Code:
  1. v36 = sub_98EBB0((int)&v59, (char *)&v50 + 3, 2);
  2.  LOBYTE(v54) = 3;
  3.  v21 = sub_991D50(v36);
  4.  v60 = v37;
  5.  LOBYTE(v54) = 0;
  6.  if ( (v59 & 0x5F) == 16 ) 
  7.  { 
  8.  if ( v62 ) 
  9.  sub_99BEF0((void **)&v62, v63, 0);
  10.  } 


- не используйте декомпилятор. Его выхлоп предназначен для машинной обработки, автоматики. Он не для человека.
При хорошем знании асма всё становится ясно за минуты, вы не сможите разобрать выхлоп дк да и обычно апп декомпилить невозможно, так как код формируется в динамике.

-----
vx




Ранг: 0.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 августа 2017 17:26
· Личное сообщение · #11

Декомпилятор в иде достаточно удобная штука. Можно давать имена переменным, указывать их типы, объявлять структуры и даже таблицы виртуальных методов. Просто надо уметь им пользоваться. Реверсить достаточно сложный проект с большим количеством разнообразных объектов и не воспользоваться декомпилятором было бы странно




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 19 августа 2017 17:42 · Поправил: difexacaw
· Личное сообщение · #12

zenbooster

Есчо с древних времён используются методы защиты, загрузка в динамике, морф, обфускация и виртуализация. Ваш декомпиль может сработать только на стандартном пэйнте или блокноте. И даже этот выхлоп понять будет сложнее, чем исходный дасм код.
Такое как вы утверждать может человек, вообще не имеющий понятия и опыта.

-----
vx




Ранг: 0.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 августа 2017 23:22
· Личное сообщение · #13

difexacaw, а что я таково утверждал? Вы просто не умеете его готовить Мне часто хватало декомпилятора иды для выполнения поставленных задач. Конечно, бывают ситуации, когда надо лезть непосредственно в ассемблерный листинг, но лично у меня они были редки Попробуйте его освоить, он клёвый


 eXeL@B —› Крэки, обсуждения —› Реверсинг CronosPlus 3.04.x
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати