IPB

Добро пожаловать, гость ( Вход | Регистрация )

 
Reply to this topicStart new topic
> Fantastic Media Autorun v2 (*.DAT)
PavelDAS
Jun 23 2026, 08:02
Сообщение #1


Advanced Member
***

Группа: Authorized
Сообщений: 50
Регистрация: 21-September 25
Из: Minsk
Пользователь №: 18,037
Спасибо сказали: 15 раз(а)



Файлы для авторана собраны в контейнер, контейнер сжат, сжатый контейнер пошифрован.
Необходимо расшифровать (справился) --> разжать (провал... а ИИ мучать устал) --> распаковать (почти справился*)
все алгоритмы брал в IDA, распакованный файл сдампил из IDA.

https://wdfiles.ru/Pb8l

* у картинок идёт дублирование файлов, и некоторые с каким-то префиксом)


--------------------
|__--__|
***|***
___|___
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=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.


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
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']));
}


--------------------
|__--__|
***|***
___|___
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jun 23 2026, 12:55
Сообщение #4


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,448
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 332 раз(а)



QUOTE(PavelDAS @ Jun 23 2026, 12:32) *
Скачал aPLib v0.36 и там сигнатура AP32. Вот чем пожали...
Блин, точно. Что-то я не стал искать, тупо код дожал. Исходные коды есть на официальном сайте разработчика: https://ibsensoftware.com/download.html

QUOTE(PavelDAS @ Jun 23 2026, 12:44) *
Твой вариант работает.
Файлы-картинки только не совсем верно распаковывает. Там у первый раз встречающихся jpg некий 4b префикс. И jpg файл содержат в себе две картинки!, хотя размер указан для одного файла.
Предположу, что 4 байта - это размер первого файла. Типа размер всего файла (item->size) минус эти 4 байта, вероятно, дадут размер второго файла.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
PavelDAS
Jun 23 2026, 14:11
Сообщение #5


Advanced Member
***

Группа: Authorized
Сообщений: 50
Регистрация: 21-September 25
Из: Minsk
Пользователь №: 18,037
Спасибо сказали: 15 раз(а)



QUOTE(-=CHE@TER=- @ Jun 23 2026, 12:55) *

Предположу, что 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']));
}


--------------------
|__--__|
***|***
___|___


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 17th July 2026 - 23:16