Сообщений: 21
Тем: 5
Зарегистрирован: Oct 2014
Репутация:
12
10-23-2014, 05:09 PM
(Сообщение последний раз редактировалось: 10-24-2014, 04:31 PM Tahoma.)
Доброго времени суток.
Намечается проект на создание сервера под игру Archlord2.
Игра защищена только жучком.
Некоторые файлы я уже разобрал. Сейчас из дизасм пытаюсь узнать криптовку пакетов.
Есть у кого интерес из программеров?
Офф: http://archlord2.webzen.com/main
DI; HALT; RET ))))
Сообщений: 2,125
Тем: 84
Зарегистрирован: Jul 2010
Репутация:
3,419
А есть презенташка по игре и собственно о чём она?
Сообщений: 21
Тем: 5
Зарегистрирован: Oct 2014
Репутация:
12
10-24-2014, 09:24 AM
(Сообщение последний раз редактировалось: 10-25-2014, 09:12 AM Tahoma.)
Кин 1
Кин 2
Обзор от чела
Добавлено через 3 часа 11 минут
Нашел как распаковываются apk файлы.
Формат заголовка (все по 4 байта):
0xEBED - идентификатор файла
0x00010001 - не знаю
len - размер запакованного файла
num - количество файлов в архиве -1 (пока предположительно)
start - смещение в файле до data
hz - не знаю. обычно не сильно отличается от размера файла.
далее идут архивы без доп. информации между ними. По этому оптимальным решением для меня стало смещаться по файлу отталкиваясь от значения total_in в структуре z_stream;
CODE
Код: char arg[] = ".\\apk\\Table.apk";
int rs;
FILE* fapk;
FILE* hNew_Filename;
uLongf size_buf;
char new_filename[128];
fapk = fopen(arg, "rb");
fseek(fapk, 0, SEEK_END);
int apk_file_size = ftell(fapk);
fseek(fapk, 0, SEEK_SET);
char* load_buf = (char*)malloc(apk_file_size);
char* load_buf2 = (char*)malloc(apk_file_size);
int get_sz = fread(load_buf, 1, apk_file_size, fapk);
fclose(fapk);
z_stream infstream;
int next_arch = 0;
int aaa;
int num_file = 1;
while (true)
{
memset(load_buf2, 0, apk_file_size);
memset(&infstream, 0, sizeof(z_stream));
infstream.avail_in = (uInt)apk_file_size - 0x18 - next_arch;
infstream.next_in = (Bytef *)load_buf + 0x18 + next_arch;
infstream.avail_out = (uInt)apk_file_size;
infstream.next_out = (Bytef *)load_buf2;
inflateInit(&infstream);
aaa = inflate(&infstream, Z_NO_FLUSH);
next_arch += infstream.total_in;
if (aaa == Z_STREAM_END)
{
sprintf(new_filename, ".\\unp\\%d.txt", num_file);
hNew_Filename = fopen(new_filename, "wb");
fwrite(load_buf2, infstream.total_out, 1, hNew_Filename);
fclose(hNew_Filename);
}
else
{
inflateEnd(&infstream);
break;
}
++num_file;
inflateEnd(&infstream);
}
return 0;
p.s.: lzi файлы кодируются обычной ксоркой на 0xA1
Добавлено через 5 часов 46 минут
https://yadi.sk/d/_E95bsvscFtJm - Программка для распаковки APK файлов.
https://yadi.sk/d/P94ylxaQcFwn8 - конвертирует LZI файлы
Добавлено через 23 часа 47 минут
Убрал XIGNCODE3. https://yadi.sk/d/CmJGnVIWcGctF
Как делается
В IDA ищем XingCode:
Код: .rdata:00E43C9C aXigncode: ; DATA XREF: .data:off_EEE2D4o
.rdata:00E43C9C unicode 0, <XignCode>,0
Получаем функцию запуска:
Код: .text:00555564 loc_555564: ; CODE XREF: XignCode_proc+2Bj
.text:00555564 lea eax, [ebp+Buffer]
.text:0055556A push eax ; lpBuffer
.text:0055556B push 104h ; nBufferLength
.text:00555570 call ds:GetCurrentDirectoryW
.text:00555576 lea ecx, [ebp+Buffer]
.text:0055557C push ecx
.text:0055557D lea ecx, [ebp+var_28]
.text:00555580 call ds:??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_W@Z ; std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>(wchar_t const *)
.text:00555586 mov [ebp+var_4], 0
.text:0055558D push offset asc_E43CB0 ; "\\"
.text:00555592 lea ecx, [ebp+var_28]
.text:00555595 call ds:??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@PB_W@Z ; std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>::operator+=(wchar_t const *)
.text:0055559B mov edx, ofsXignCode
.text:005555A1 push edx
.text:005555A2 lea ecx, [ebp+var_28]
.text:005555A5 call ds:??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@PB_W@Z ; std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>::operator+=(wchar_t const *)
.text:005555AB push 0 ; int
.text:005555AD mov eax, ofsXignCode
.text:005555B2 push eax ; Str
.text:005555B3 mov ecx, ifsCodeXC3
.text:005555B9 push ecx ; int
.text:005555BA call sub_555D00
.text:005555BF test eax, eax
.text:005555C1 jnz short loc_5555E2
.text:005555C3 mov [ebp+var_235], 0
.text:005555CA mov [ebp+var_4], 0FFFFFFFFh
.text:005555D1 lea ecx, [ebp+var_28] ; void *
.text:005555D4 call ds:__imp_??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ ; std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>::~basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>(void)
.text:005555DA mov al, [ebp+var_235]
.text:005555E0 jmp short loc_55560B
Ищем откуда взялась:
Код: .text:00401E0B call sub_4A8480
.text:00401E10 mov ecx, [ebp+var_8]
.text:00401E13 call sub_402190
.text:00401E18 mov ecx, eax
.text:00401E1A call XignCode_proc
.text:00401E1F movzx eax, al
.text:00401E22 test eax, eax
.text:00401E24 jnz short loc_401E46
Запускаем Hiew32 и меняем строки:
Код: .text:00401E1A call XignCode_proc
.text:00401E1F movzx eax, al
на
Все... Теперь вылавливатель жучков не запускается, а игра работает.
DI; HALT; RET ))))
Сообщений: 21
Тем: 5
Зарегистрирован: Oct 2014
Репутация:
12
После долгих мучений нашел все же нужный код.
Код: /* encrypt code
ecx = buffer
esi = 0x11cfd
edi = 0
.text:01411800 loc_1411800: ; CODE XREF: Encrypt1+42j
.text:01411800 mov al, [edi+ecx] ; ecx = buffer
.text:01411803 mov edx, esi
.text:01411805 sar edx, 8
.text:01411808 xor al, dl
.text:0141180A mov [ecx], al
.text:0141180C movzx eax, al
.text:0141180F add eax, esi
.text:01411811 imul eax, 0CE6Dh
.text:01411817 add eax, 58BFh
.text:0141181C inc ecx
.text:0141181D sub ebp, 1
.text:01411820 mov esi, eax
.text:01411822 jnz short loc_1411800 ; ecx = buffer
*/
DI; HALT; RET ))))
Сообщений: 21
Тем: 5
Зарегистрирован: Oct 2014
Репутация:
12
Вот. Сделал небольшой сниффер. С багами конечно. Пока не придумал, как большие пакеты совместить. Но работает: https://yadi.sk/d/bFZRD3OicLyhV
DI; HALT; RET ))))
Сообщений: 21
Тем: 5
Зарегистрирован: Oct 2014
Репутация:
12
10-29-2014, 07:32 PM
(Сообщение последний раз редактировалось: 10-29-2014, 08:07 PM Tahoma.)
Расшифровал передаваемый параметр при запуске игры:
Код: buf_unbase64 = decrypt_base64_openssl((unsigned char*)base64_str, &size);
char ccc[] = "wzlAUnchEr";
int step = 0;
for (int i = 0; i < size; i++)
{
buf_unbase64 [i] ^= ccc[step];
++step;
if (step > (strlen(ccc)-1))
step = 0;
}
Добавлено через 35 минут
Смотрю никто не заинтересован проектом.
Тему можно закрывать
DI; HALT; RET ))))
Сообщений: 41
Тем: 2
Зарегистрирован: Jul 2010
Репутация:
0
Игра не интересна думаю. Есть другой проект где ваши знания пригодятся. В ЛС.
Сообщений: 103
Тем: 2
Зарегистрирован: Dec 2013
Репутация:
213
Разбирали бы вы с таким энтузиазмом - Icarus Online, я с удовольствием принял бы участие. Так как Dungeon Striker тоже оказалась не столь подающей надежды на будущее.
Сообщений: 21
Тем: 5
Зарегистрирован: Oct 2014
Репутация:
12
trixiejack Написал:Разбирали бы вы с таким энтузиазмом - Icarus Online, я с удовольствием принял бы участие. Так как Dungeon Striker тоже оказалась не столь подающей надежды на будущее.
Не вижу способа зарегистрироваться без KMC. Дайте регистрацию на офе и можно поглядеть чего и с чем там все
DI; HALT; RET ))))
Сообщений: 103
Тем: 2
Зарегистрирован: Dec 2013
Репутация:
213
Tahoma Написал:Не вижу способа зарегистрироваться без KMC. Дайте регистрацию на офе и можно поглядеть чего и с чем там все
Единственный способ - через покупку. Поэтому напишу в ЛС skype и дам данные от аккаунта.
|