![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
PavelDAS |
![]()
Сообщение
#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 -------------------- |__--__|
***|*** ___|___ |
![]() ![]() |
PavelDAS |
![]()
Сообщение
#2
|
Newbie ![]() Группа: Authorized Сообщений: 6 Регистрация: 21-September 25 Из: Minsk Пользователь №: 18,037 Спасибо сказали: 0 раз(а) ![]() |
Работает. В начале и конце явно какие-то служебные символы.
Полезный блок начинается как раз с 0x457 Только конец файла не понятно, как вычислить, кроме как взять реальный размер. ![]() -------------------- |__--__|
***|*** ___|___ |
-=CHE@TER=- |
![]()
Сообщение
#3
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,388 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 322 раз(а) ![]() |
если попортить их -- пишет, что файл повреждён. Либо контрольная сумма, либо какие-то флаги, которые проверяются на возможные значения и выводится ошибка в случае, если они вне допустимых.Только конец файла не понятно, как вычислить, кроме как взять реальный размер. А так, скорее всего, и делается.Код расшифровщика, если, вдруг, нужно. 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); } Работает. В начале и конце явно какие-то служебные символы. В начале и конце блоков что ли? Там бинарная структура, не текстовая.Например, по смещению 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 виде и смотреть что совпадает у тех блоков, где, например, только имена файлов или только ключи реестра. Ну и так, собственно, весь файл и распарсиваем. |
![]() ![]() |
Упрощённая версия | Сейчас: 17th October 2025 - 06:28 |