IPB

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

> InstallShield расшифровка Uninst.isu
PavelDAS
Oct 9 2025, 09:00
Сообщение #1


Newbie
*

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



Необходима помощь в расшифровке файлов InstallShield: Uninst.isu
Там должны храниться пути установки, реестр, ...

Пробовал как-то через IDA 9 подсмотреть, как идёт расшифровка, но не понял...

https://wdfiles.ru/2Qijh

Запуск на выполнение:
ISUninst_5_51_138.exe -fUninst.isu

Сейчас приходится использовать песочнику+отслеживать обращений, чтобы узнать что он пытается удалить.

Реестр: HKCU\SOFTWARE\Infogrames
Каталоги:
C:\Program Files\Infogrames\Bugs Bunny & Taz - Time Buster
C:\WINDOWS\Главное меню\Программы\Infogrames\Bugs Bunny & Taz - Time Busters


--------------------
|__--__|
***|***
___|___
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
PavelDAS
Oct 9 2025, 21:01
Сообщение #2


Newbie
*

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



Работает. В начале и конце явно какие-то служебные символы.
Полезный блок начинается как раз с 0x457

Только конец файла не понятно, как вычислить, кроме как взять реальный размер.



--------------------
|__--__|
***|***
___|___
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Oct 10 2025, 07:32
Сообщение #3


Walter Sullivan
***

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



QUOTE(PavelDAS @ Oct 9 2025, 13:30) *
если попортить их -- пишет, что файл повреждён.
Либо контрольная сумма, либо какие-то флаги, которые проверяются на возможные значения и выводится ошибка в случае, если они вне допустимых.

QUOTE(PavelDAS @ Oct 9 2025, 21:01) *
Только конец файла не понятно, как вычислить, кроме как взять реальный размер.
А так, скорее всего, и делается.

Код расшифровщика, если, вдруг, нужно.
isudcrpt.c:
CODE
#include <stdio.h>
#include <string.h>
#include <windows.h>

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);
}
}

// ISUninst_5_51_138.exe at virtual address .40A0D8:
void IS_Decrypt(void *b, DWORD size, DWORD key) {
DWORD i, *d;
BYTE *p, *k;
size = (size > 65000) ? 65000 : size;
d = (DWORD *) b;
for (i = 0; i < (size / 4); i++) {
*d -= (((i + 1) * 7) % 191) + key + 0x1429314E;
d++;
}
p = (BYTE *) b;
k = (BYTE *) &key;
for (i = 0; i < (size % 4); i++) {
p[size - 1 - i] -= k[i];
}
}

static char q[0x10000U];

int main(int argc, char *argv[]) {
FILE *fl, *f;
char s[260];
DWORD i, sz;
WORD w;
printf(
"InstallShield uninstall .ISU script decrypter v1.0\n"
"© CTPAX-X Team 2025\nhttp://www.CTPAX-X.org/\n\n"
);
if (argc != 2) {
printf("Usage: isudcrpt <filename.isu>\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, 0, SEEK_SET);

fread(&w, 2, 1, fl);
fread(&i, 4, 1, fl);
if ((w != 0xA871) || (i > 0x2010000)) {
fclose(fl);
printf("Error: invalid input file format.\n\n");
return(3);
}

strcpy(s, basename(argv[1]));
printf("%s -> ", s);
newext(s, ".bin");
printf("%s\n", s);
f = fopen(s, "wb");
if (!f) {
fclose(fl);
printf("Error: can't create output file.\n\n");
return(3);
}
fwrite(&w, 2, 1, f);
fwrite(&i, 4, 1, f);

fread(&i, 4, 1, fl);
fwrite(&i, 4, 1, f);

fread(&w, 2, 1, fl);
fread(q, w, 1, fl);
fwrite(&w, 2, 1, f);
fwrite(q, w, 1, f);

for (i = 0; i < 2; i++) {
fread(&w, 2, 1, fl);
fread(q, w, 1, fl);
IS_Decrypt(q, w, 0x12A39F87/*0xAF325DE9*/);
fwrite(&w, 2, 1, f);
fwrite(q, w, 1, f);
}

fread(q, 712, 1, fl);
fwrite(q, 712, 1, f);

while (ftell(fl) < sz) {
fread(&w, 2, 1, fl);
fread(q, w, 1, fl);
IS_Decrypt(q, w, 0x12A39F87/*0xAF325DE9*/);
fwrite(&w, 2, 1, f);
fwrite(q, w, 1, f);
}

fclose(f);
fclose(fl);
printf("\ndone\n\n");
return(0);
}


QUOTE(PavelDAS @ Oct 9 2025, 21:01) *
Работает. В начале и конце явно какие-то служебные символы.
В начале и конце блоков что ли? Там бинарная структура, не текстовая.
Например, по смещению 0x457 того файла что выложен был:
25 00 | BA 04 00 00 64 00 01 00 | 1B 00 | "C:\Program Files\Infogrames"
0x0025 - размер блока (все данные далее зашифрованы)
0x001B - размер блока со строкой "C:\Program Files\Infogrames"
Остальные данные - это служебные байты определяющие тип блока и дополнительные данные.
Так как в "Uninst.isu" хранятся следующие сущности:
1. Имя файла.
2. Ключ реестра.
3. Ярлык в меню "Пуск".
И так далее, то программе нужно как-то различать их. Вот эти данные служебные для этого и предназначены. Тут нужно просто статистику набрать: выводить такие данные на экран в hex виде и смотреть что совпадает у тех блоков, где, например, только имена файлов или только ключи реестра. Ну и так, собственно, весь файл и распарсиваем.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщения в этой теме


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

 



Упрощённая версия Сейчас: 17th October 2025 - 06:28