IPB

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

> AZZA Games Installer [*.EXE]
PavelDAS
Jun 24 2026, 06:54
Сообщение #1


Advanced Member
***

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



Какой-то кастомный инсталлер на Visual C++ 6.0 или что-то стандартное?
https://wdfiles.ru/Pbmh (273Мб)

Смог найти только имена файлов в конце,
тип (?) папка / файл
имя
сжатый размер (?)
размер

ссылку на содержимое файлов не нашёл. И сжатие, скорее всего, есть.


--------------------
|__--__|
***|***
___|___
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов(1 - 4)
-=CHE@TER=-
Jun 24 2026, 13:42
Сообщение #2


Walter Sullivan
***

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



Каталог "[-AZZA-]" искусственный - туда сохраняются файлы установщика (отдельные блоки).
Файл "[-AZZA-]/testr43.dll" это файл логики установщика (некоторые ресурсы и строки в него зашиты).
То есть, после запуска установщика, извлекается файл "testr43.dll", оттуда запускается единственная экспортируемая функция a1() и вот в ней уже и идёт работа установщика, распаковка архива и всё прочее.
Сжатие такое же как и в прошлом установщике aPLib, поэтому я код распаковщика не прикладываю - можно взять исходные коды из официального дистрибутива.

unpkazza.c:
CODE

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <sys/stat.h>

/*#define DEBUG 1*/

#define MAGIC_1 0xFFAAFFAA
#define MAGIC_2 0xFFAAFFAB

#pragma pack(push, 1)
typedef struct {
uint32_t unlen;
uint32_t pklen;
uint32_t magic; /* MAGIC_1 */
} arc_tail;

typedef struct {
uint32_t unlen;
uint32_t pklen;
} arc_item;

typedef struct {
uint32_t magic; /* MAGIC_2 */
uint32_t count;
} arc_head;

typedef struct {
char name[256];
uint32_t pklen;
uint32_t unlen;
uint32_t flags;
} arc_file;
#pragma pack(pop)

/*
two files below from "aPLib-1.1.1.zip"
https://ibsensoftware.com/download.html
*/
#include "depacks.h"
#include "depacks.c"

char *basename(char *s) {
char *r;
if (s) {
for (r = s; *r; r++) {
if ((*r == ':') || (*r == '/') || (*r == '\\')) {
s = &r[1];
}
}
}
return(s);
}

void newext(char *name, char *ext) {
char *p;
if (name && ext) {
for (; (*name == '.'); name++);
for (p = NULL; *name; name++) {
if (*name == '.') {
p = name;
}
}
strcpy(p ? p : name, ext);
}
}

void makedirs(char *path) {
char *s;
if (path) {
for (s = path; *s; s++) {
if ((*s == '\\') || (*s == '/')) {
*s = 0;
mkdir(path, 0755);
*s = '/';
}
}
}
}

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 parse_block(FILE *fl, char *root) {
uint32_t i, sz, offs;
char s[260], *x;
arc_file *list;
uint8_t b, *p, *u;
arc_head head;
if (fl) {
offs = ftell(fl);
list = NULL;
strcpy(s, root);
do {
readdata(fl, &head, sizeof(head));
if ((head.magic != MAGIC_2) || (!head.count)) { break; }
i = head.count * sizeof(list[0]);
list = (arc_file *) malloc(i);
if (!list) { break; }
memset(list, 0, i);
/* read file table */
sz = 0;
for (i = 0; i < head.count; i++) {
list[4].flags = 0;
readdata(fl, &list[i].flags, 1);
/* 0x0A - create folder, go inside */
if (list[i].flags == 0x0A) {
readdata(fl, &b, 1);
readdata(fl, list[i].name, b);
}
/* 0x0B - create file in current folder */
if (list[i].flags == 0x0B) {
readdata(fl, &b, 1);
readdata(fl, list[i].name, b);
readdata(fl, &list[i].pklen, 4);
readdata(fl, &list[i].unlen, 4);
sz += list[i].pklen;
}
/* 0x0C - go up folder one level */
}
if (offs < sz) { break; }
fseek(fl, offs - sz, SEEK_SET);
/* unpack files */
for (i = 0; i < head.count; i++) {
/* 0x0A - create folder */
if (list[i].flags == 0x0A) {
strcat(s, "/");
strcat(s, list[i].name);
}
/* 0x0B - create file in current folder */
if (list[i].flags == 0x0B) {
strcat(s, "/");
strcat(s, list[i].name);
printf("%s\n", s);
sz = list[i].pklen;
p = (uint8_t *) malloc(sz + ((sz != list[i].unlen) ? list[i].unlen : 0));
if (p) {
u = p;
readdata(fl, p, sz);
/* packed file */
if (sz != list[i].unlen) {
u = &p[sz];
memset(u, 0, list[i].unlen);
aP_depack_safe(p, sz, u, list[i].unlen);
sz = list[i].unlen;
}
#ifndef DEBUG
makedirs(s);
dumpdata(s, u, sz);
#endif
free(p);
} else {
printf("Warning: not enough memory for file.\n");
fseek(fl, ftell(fl) + sz, SEEK_SET);
}
x = basename(s);
x[-1] = 0;
}
/* 0x0C - go back up one folder */
if (list[i].flags == 0x0C) {
x = basename(s);
if (x != s) {
x[-1] = 0;
}
}
}
} while (0);
fseek(fl, offs, SEEK_SET);
if (list) { free(list); }
}
}

int main(int argc, char *argv[]) {
arc_tail tail;
arc_item item;
char s[260];
uint32_t sz;
uint8_t *p;
FILE *fl;
printf(
"AZZA Games Installer unpacker v1.0\n"
"© CTPAX-X Team 2026\n"
"http://www.CTPAX-X.org/\n\n"
);
if (argc != 2) {
printf("Usage: unpkazza <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);
fseek(fl, sz - sizeof(tail), SEEK_SET);
readdata(fl, &tail, sizeof(tail));
if ((tail.magic != MAGIC_1) || (!tail.pklen) || (!tail.unlen)) {
fclose(fl);
printf("Error: invalid input file format.\n\n");
return(3);
}
p = (uint8_t *) malloc(tail.pklen + tail.unlen);
if (!p) {
fclose(fl);
printf("Error: not enough memory for contents table.\n\n");
return(4);
}
/* === 01 === */
memset(p, 0, tail.pklen + tail.unlen);
fseek(fl, sz - sizeof(tail) - tail.pklen, SEEK_SET);
readdata(fl, p, tail.pklen);
aP_depack_safe(p, tail.pklen, &p[tail.pklen], tail.unlen);
strcpy(s, "[-AZZA-]/");
makedirs(s);
strcpy(s, "[-AZZA-]/testr43.dll");
dumpdata(s, &p[tail.pklen], tail.unlen);
free(p);
/* === 02 === */
fseek(fl, sz - tail.pklen - sizeof(tail) - sizeof(item), SEEK_SET);
readdata(fl, &item, sizeof(item));
/* printf("%08X %08X %08X\n", ftell(fl) - sizeof(item), item.unlen, item.pklen);*/
fseek(fl, ftell(fl) - item.pklen - sizeof(item), SEEK_SET);
p = (uint8_t *) malloc(item.pklen + item.unlen);
if (p) {
memset(p, 0, item.pklen + item.unlen);
readdata(fl, p, item.pklen);
aP_depack_safe(p, item.pklen, &p[item.pklen], item.unlen);
strcpy(s, "[-AZZA-]/license.txt");
dumpdata(s, &p[item.pklen], item.unlen);
free(p);
fseek(fl, ftell(fl) - item.pklen - sizeof(item), SEEK_SET);
} else {
fseek(fl, ftell(fl) - sizeof(item), SEEK_SET);
}
/* === 03 === */
readdata(fl, &item, sizeof(item));
/* printf("%08X %08X %08X\n", ftell(fl) - sizeof(item), item.unlen, item.pklen);*/
sz = ftell(fl) - item.pklen - sizeof(item);
fseek(fl, ftell(fl) - item.unlen - sizeof(item), SEEK_SET);
/* printf("%08X\n", ftell(fl));*/
parse_block(fl, "[-AZZA-]");
/* === 04 === */
fseek(fl, sz, SEEK_SET);
readdata(fl, &sz, 4);
/* printf("%08X %08X\n", ftell(fl) - 4, sz);*/
fseek(fl, ftell(fl) - 4 - sz, SEEK_SET);
parse_block(fl, ".");
fclose(fl);
printf("\ndone\n\n");
return(0);
}


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
PavelDAS
Jun 24 2026, 14:39
Сообщение #3


Advanced Member
***

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



Отлично.
Ради оригинальных файлов и нужны распаковщики.
В install.log есть упоминание protect.dll, но в данном релизе его нет.
Переводчики собирали сетап из своей же установленной версии. Такое иногда встречается.
Тут три варианта:
1) Это второй релиз, и StarForce убрали
2) StarForce убрали после тестов
3) StarForce был в иностранном релизе и его убрали.
пришлось немного поправить код:
CODE
        #ifdef __linux__
        mkdir(path, 0755);
        #else
        mkdir(path);
        #endif


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


Walter Sullivan
***

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



QUOTE(PavelDAS @ Jun 24 2026, 14:39) *
пришлось немного поправить код:
Чем комиплировал? У меня GCC 3.2:
gcc -Os -s -Wall -ansi -pedantic unpkazza.c -o unpkazza.exe C:\Dev-Cpp\lib\CRT_noglob.o
Предупреждение выкидывает по поводу mkdir(), но собирается и работает без проблем.
Я просто так задолбался с этими каталогами - в Windows они так создаются, в Linux эдак.
Кто-то выкладывает мой код в Интернете и переписывает под Linux это место, кто-то под Windows.
Я, как бы, и не против, но сделайте уже одним каким-нибудь способом, который везде пашет, и работайте с ним.
Я проверял - текущий способ должен работать под Linux и он у меня собирается и работает под Windows. Возможно, ключ "-ansi" важен для компиляции и работы.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
PavelDAS
Jun 25 2026, 06:48
Сообщение #5


Advanced Member
***

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



QUOTE(-=CHE@TER=- @ Jun 24 2026, 16:02) *

Чем комиплировал? У меня GCC 3.2:
gcc -Os -s -Wall -ansi -pedantic unpkazza.c -o unpkazza.exe C:\Dev-Cpp\lib\CRT_noglob.o
Предупреждение выкидывает по поводу mkdir(), но собирается и работает без проблем.
Я просто так задолбался с этими каталогами - в Windows они так создаются, в Linux эдак.
Кто-то выкладывает мой код в Интернете и переписывает под Linux это место, кто-то под Windows.
Я, как бы, и не против, но сделайте уже одним каким-нибудь способом, который везде пашет, и работайте с ним.
Я проверял - текущий способ должен работать под Linux и он у меня собирается и работает под Windows. Возможно, ключ "-ansi" важен для компиляции и работы.


CODE

-------------- Build: Release in AZZA Games Installer unpacker (compiler: GNU GCC MinGW Compiler)---------------

gcc.exe -Os -fno-exceptions -nostdlib -fno-builtin -IC:\mingw\include -c "D:\WorkCPP\AZZA Games Installer unpacker\depacks.c" -o obj\Release\depacks.o
gcc.exe -Os -fno-exceptions -nostdlib -fno-builtin -IC:\mingw\include -c "D:\WorkCPP\AZZA Games Installer unpacker\main.c" -o obj\Release\main.o
gcc.exe -LC:\mingw\lib -o "bin\Release\AZZA Games Installer unpacker.exe" obj\Release\depacks.o obj\Release\main.o  -s  
D:\WorkCPP\AZZA Games Installer unpacker\main.c: In function 'makedirs':
D:\WorkCPP\AZZA Games Installer unpacker\main.c:78:9: error: too many arguments to function 'mkdir'
   78 |         mkdir(path, 0755);
      |         ^~~~~
In file included from C:/MinGW/x86_64-w64-mingw32/include/sys/stat.h:14,
                 from D:\WorkCPP\AZZA Games Installer unpacker\main.c:6:
C:/MinGW/x86_64-w64-mingw32/include/io.h:282:15: note: declared here
  282 |   int __cdecl mkdir (const char *) __MINGW_ATTRIB_DEPRECATED_MSVC2005;
      |               ^~~~~


Stack Overflow подсказал решение.

Более-менее рабочую среду удалось реализовать через Code::Blocks
В exe добавляются строки: GCC: (GNU) 13.2.0


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


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

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

 



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