Добро пожаловать, гость ( Вход | Регистрация )
![]() ![]() |
| PavelDAS |
Jun 23 2026, 08:02
Сообщение
#1
|
|
Advanced Member ![]() ![]() ![]() Группа: Authorized Сообщений: 50 Регистрация: 21-September 25 Из: Minsk Пользователь №: 18,037 Спасибо сказали: 15 раз(а) |
Файлы для авторана собраны в контейнер, контейнер сжат, сжатый контейнер пошифрован.
Необходимо расшифровать (справился) --> разжать (провал... а ИИ мучать устал) --> распаковать (почти справился*) все алгоритмы брал в IDA, распакованный файл сдампил из IDA. https://wdfiles.ru/Pb8l * у картинок идёт дублирование файлов, и некоторые с каким-то префиксом) -------------------- |__--__|
***|*** ___|___ |
| -=CHE@TER=- |
Jun 23 2026, 10:46
Сообщение
#2
|
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,448 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 332 раз(а) |
Google AI смог с 7-го раза свернуть ассемблерный код. Ему просто нужно указывать на ошибки.
Алгоритм такой: 1. Выдираешь в отдельный файл весь код на ассемблере. 2. Убеждаешься, что он компилируется (т.е. ты его корректно выдернул). 3. Отдаёшь гуглу, просишь переписать на сях. 4. Если есть ошибки, то просишь поправить. 5. Дорабатываешь результат ручками, по необходимости (кое-какие вещи гугл, пока что, сворачивать не умеет). Для очень замороченных и сложных алгоритмов гугл, увы, пока что, справиться не может (особенно, где всякая низкоуровневая оптимизация). P.S. С кода расшифровки, где "*p ^= i ^ i ^...;" проорал. Уже которая программа, где погром-мист не понимает как битовая логика работает (key xor key (i ^ i) всегда ноль - это всё равно, что это выражение выкинуть). unfmadat.c: CODE #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #pragma pack(push, 1) typedef struct { uint32_t magic; /* "AP32" */ uint32_t hdlen; /* this header length */ uint32_t pklen; /* packed data length */ uint32_t pcsum; /* packed data CRC32 */ uint32_t unlen; /* unpacked data length */ uint32_t ucsum; /* unpacked data CRC32 */ } dat_head; typedef struct { uint32_t offs; /* relative */ uint32_t size; char name[1]; /* ASCIIZ */ } dat_item; #pragma pack(pop) void dumpdata(char *name, void *data, uint32_t size) { FILE *f; if (name) { f = fopen(name, "wb"); if (f) { if (data && size) { fwrite(data, size, 1, f); } fclose(f); } } } void readdata(FILE *fl, void *data, uint32_t size) { if (data && size) { memset(data, 0, size); if (fl) { fread(data, size, 1, fl); } } } void autorun_decrypt(uint8_t *p, uint32_t sz) { uint32_t i; if (p) { i = sz; while (i) { *p ^= sz ^ ((sz >> 8) & 0xFF) ^ 0x88; sz += i; p++; i--; } } } /* two files below from "aPLib-1.1.1.zip" https://ibsensoftware.com/download.html */ #include "depacks.h" #include "depacks.c" int main(int argc, char *argv[]) { uint32_t i, n, sz; dat_head *head; dat_item *item; uint8_t *p, *u; char s[260]; FILE *fl; printf( "Fantastic Media Autorun v2 .DAT decrypter v1.0\n" "© CTPAX-X Team 2026\n" "http://www.CTPAX-X.org/\n\n" ); if (argc != 2) { printf("Usage: unfmadat <filename.ext>\n\n"); return(1); } fl = fopen(argv[1], "rb"); if (!fl) { printf("Error: can't open input file.\n\n"); return(2); } fseek(fl, 0, SEEK_END); sz = ftell(fl); if (sz <= sizeof(head[0])) { fclose(fl); printf("Error: invalid input file format.\n\n"); return(3); } p = (uint8_t *) malloc(sz); if (!p) { fclose(fl); printf("Error: not enough memory for contents table.\n\n"); return(4); } fseek(fl, 0, SEEK_SET); readdata(fl, p, sz); fclose(fl); /* decrypt file */ autorun_decrypt(p, sz); head = (dat_head *) p; if ( (head->magic != 0x32335041) || (head->hdlen < sizeof(head[0])) || ((head->pklen + head->hdlen) != sz) ) { free(p); printf("Error: unknown/unsupported input file format.\n\n"); return(5); } u = (uint8_t *) malloc(head->unlen); if (!u) { free(p); printf("Error: not enough memory for unpacked buffer.\n\n"); return(6); } memset(u, 0, head->unlen); if (aP_depack_safe(&p[head->hdlen], head->pklen, u, head->unlen) != head->unlen) { free(u); free(p); printf("Error: unpacking error.\n\n"); return(7); } free(p); sz = *((uint32_t *) u); i = 4; n = 0; while (i < sz) { item = (dat_item *) &u[i]; i += sizeof(item[0]) + strlen(item->name); printf("%s\n", item->name); /* number required since there are file name duplicates */ n++; sprintf(s, "%03u_%s", n, item->name); dumpdata(s, &u[sz + item->offs], item->size); } free(u); printf("\ndone\n\n"); return(0); } Обновлено: Код распаковки заменён на стандартную библиотеку APLib. Спасибо сказали:
|
| PavelDAS |
Jun 23 2026, 12:44
Сообщение
#3
|
|
Advanced Member ![]() ![]() ![]() Группа: Authorized Сообщений: 50 Регистрация: 21-September 25 Из: Minsk Пользователь №: 18,037 Спасибо сказали: 15 раз(а) |
Скачал aPLib v0.36 и там сигнатура AP32. Вот чем пожали...
Твой вариант работает. Файлы-картинки только не совсем верно распаковывает. Там у первый раз встречающихся jpg некий 4b префикс. И jpg файл содержат в себе две картинки!, хотя размер указан для одного файла. CODE foreach ($arFileTable as $file) { fseek($f, $file['OFFSET'] + $fileDataOffset); if (str_contains($file['NAME'], '.jpg')) { if (file_exists($dir . '\\' . $file['NAME'])) $file['NAME'] .= '_'; else { $unknown = unpack('V', fread($f, 4))[1]; // пропускаем что-то для картинок echo $file['NAME'] . "\t" . sprintf('0x%08X (%d)', $unknown, $unknown) . "\n"; } } file_put_contents($dir . '\\' . $file['NAME'], fread($f, $file['SIZE'])); } -------------------- |__--__|
***|*** ___|___ |
| -=CHE@TER=- |
Jun 23 2026, 12:55
Сообщение
#4
|
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,448 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 332 раз(а) |
Скачал aPLib v0.36 и там сигнатура AP32. Вот чем пожали... Блин, точно. Что-то я не стал искать, тупо код дожал. Исходные коды есть на официальном сайте разработчика: https://ibsensoftware.com/download.htmlТвой вариант работает. Предположу, что 4 байта - это размер первого файла. Типа размер всего файла (item->size) минус эти 4 байта, вероятно, дадут размер второго файла.Файлы-картинки только не совсем верно распаковывает. Там у первый раз встречающихся jpg некий 4b префикс. И jpg файл содержат в себе две картинки!, хотя размер указан для одного файла. |
| PavelDAS |
Jun 23 2026, 14:11
Сообщение
#5
|
|
Advanced Member ![]() ![]() ![]() Группа: Authorized Сообщений: 50 Регистрация: 21-September 25 Из: Minsk Пользователь №: 18,037 Спасибо сказали: 15 раз(а) |
Предположу, что 4 байта - это размер первого файла. Типа размер всего файла (item->size) минус эти 4 байта, вероятно, дадут размер второго файла. Там размер-картинка + размер-картинка. И картинки, зачем-то повторяются. CODE foreach ($arFileTable as $file) { fseek($f, $file['OFFSET'] + $fileDataOffset); if (str_contains($file['NAME'], '.jpg')) { if (file_exists($dir . '\\' . $file['NAME'])) $file['NAME'] = str_replace('.jpg', '_v2.jpg', $file['NAME']); $sizePay1 = unpack('V', fread($f, 4))[1]; // размер картинки file_put_contents($dir . '\\' . $file['NAME'], fread($f, $sizePay1)); $file['NAME'] = str_replace('.jpg', '_pay2.jpg', $file['NAME']); $sizePay2 = unpack('V', fread($f, 4))[1]; // размер картинки file_put_contents($dir . '\\' . $file['NAME'], fread($f, $sizePay2)); } else file_put_contents($dir . '\\' . $file['NAME'], fread($f, $file['SIZE'])); } -------------------- |__--__|
***|*** ___|___ Спасибо сказали:
|
![]() ![]() |
| Упрощённая версия | Сейчас: 17th July 2026 - 23:16 |