24.10.2014, 09:24
|
#3
|
Заинтересовавшийся
Регистрация: 20.10.2014
Адрес: Урал
Возраст: 35
Сообщений: 21
Отблагодарили 6 раз(а)
Рейтинг мнений:
|
Re: Archlord2
Кин 1
Кин 2
Обзор от чела
Добавлено через 3 часа 11 минут
Нашел как распаковываются apk файлы.
Формат заголовка (все по 4 байта):
0xEBED - идентификатор файла
0x00010001 - не знаю
len - размер запакованного файла
num - количество файлов в архиве -1 (пока предположительно)
start - смещение в файле до data
hz - не знаю. обычно не сильно отличается от размера файла.
далее идут архивы без доп. информации между ними. По этому оптимальным решением для меня стало смещаться по файлу отталкиваясь от значения total_in в структуре z_stream;
Свернуть ↑
Код:
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 ))))
Последний раз редактировалось Tahoma; 25.10.2014 в 09:12.
Причина: Добавлено сообщение
|
|
|