IPB

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

История благодарностей участнику -=CHE@TER=- ::: Спасибо сказали: 286 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
Dec 14 2018, 16:20 MP3
Я тут что подумал - Grom PE лет 10 назад давал ссылку на MP3packer.
См. там файл "mp3packer.html" - это основная страница, ибо сайт уже неживой.
Есть зеркало тут.
Чем это программа хороша (цитата с зеркала): "Provides the ability to losslessly turn VBR files into larger CBR files to humor players which can't handle VBR". Я очень давно последний раз её запускал - вполне возможно, что она может и обычный CBR поднять losslessly с 56 до 128. Понимаю, что место сожрёт, но, во-первых, твой установщик со звуковыми файлами не будет больше занимать (конвертируешь при установке перевода), а, во-вторых, качество не пострадает.
Потому что судя по постфиксу "-ttv-" разработчики игры эти библиотеки с какой-то зависимостью (я так понимаю) компилировали и их так просто, наверное, хрен заменишь. К тому же это вряд ли проблема именно LAME кодека - он должен нормально работать. Скорее всего, действительно, они продолжительность от битрейта считают (рукалицо - HD переиздание такое переиздание), поэтому если даже ты её найдёшь и исправишь чтобы русские файлы работали, то отвалятся все остальные - звуки, музыка и что там ещё есть.
Как-то так попробуй (mp3packer будет в пустое место свои копирайты строкой шарашить):
mp3packer.exe -b 128 b1a.mp3
Siberian GRemlin,
Nov 4 2018, 23:21 No-CD для Little Bill Thinks Big
Я долго ломал мозг пользуясь вот этой ссылкой: Lingo bytecode.

1) Копируешь всё с CD диска в каталог.
2) Через subst Z: <каталог> создаёшь виртуальный диск.
3) Меняешь в реестре букву диска на Z.
4) После этого патчишь:
Joy.cxt
0001D046: 0F 0E
0001D088: 10 0E
Теперь оно будет работать без CD. Проверка отломана не очень красиво, ибо она меняет код "если CD-ROM" на "если не CD-ROM", а также "свободного места на диске больше нуля" на "свободного места не ноль".

Хочешь чтобы работало без проверки CD и без виртуального диска тупо из каталога? Кури доки по ссылке выше и ковыряй байт-код. Меня откровенно ломает в этом рыться.

CODE
4C 05; local
44 0E; push local literal to stack (0E="type")
43 02; arg(2)
57 B1; call
44 0F; push local literal to stack (0F="CD-ROM")
0F  ; a = b
95 00 13 (jmp1 if false)

<...>

4C 06; local var
44 10; push local literal to stack (10="size")
43 02; arg(2)
57 B1; call
03  ; push 0
10  ; a > b (size > 0)
95 00 41; jmp2 if false


Индексы строк проверки, если, вдруг, понадобятся (ищи по 44 XX, где XX номер литерала для складывания на стек):
CODE
00=Projector
01=You need to insert the Little Bill Thinks BIG CD-ROM to play!
02=Windows
03=DirectSound
04=windows
05=Animal Joy
06=SOFTWARE\Scholastic Inc\Little Bill Things BIG
07=CDLet
08=Error
09=HKEY_LOCAL_MACHINE
0A=:\DATA\LB_MAIN.DXR
0B=:\DATA\CASTS
0C=:\DATA\VIDS
0D=:\DATA\TALKING
0E=type
0F=CD-ROM
10=size
11=FileXtra4
12=Little Bill Thinks Big:DATA:LB_MAIN.DXR
13=Little Bill Thinks Big:DATA:CASTS
14=Little Bill Thinks Big:DATA:VIDS
15=Little Bill Thinks Big:DATA:TALKING
Siberian GRemlin,
Oct 6 2018, 14:06 Работа с отладчиком
Несколько корректировок.

QUOTE(-=CHE@TER=- @ Jun 14 2018, 17:15) [snapback]4362[/snapback]
5) Т.к. ты брезгуешь нормальными системами, то запускаешь Ольку от имени Администратора, плюс помни, что первый вылет в ней будет не на OEP, а где-то в дебрях системы, ибо Windows Vista и выше - гоумно. Так что делай сразу F9, чтобы оно до OEP дошло.
Это можно обойти, чтобы сразу на OEP вставало, если в опциях выбрать игнорировать последнее исключение (Debugging Options - Exceptions - Add last exception, не забыть галку на Ignore also following custom exception or ranges чтобы список работал).

QUOTE(-=CHE@TER=- @ Jun 21 2018, 20:03) [snapback]4366[/snapback]
А ещё F8 на инструкции loop сразу пройдёт весь цикл, в то время как F7 будет переходить на начало при каждом шаге.
Спутал с отладчиком DOSBox. Во всяком случае в классической Ольке это не работает так.

QUOTE(-=CHE@TER=- @ Jun 21 2018, 20:03) [snapback]4366[/snapback]
Если файл не изменялся, то при перезапуске бряки не будут пропадать, кроме случаев когда бряк стоит на памяти которая была динамически выделена или внутри .DLL.
x64dbg допилили, так что там бряки внутри .DLL не пропадают - удобно. Вроде бы, даже файл на диске изменять можно. Насчёт остального не проверял.

А ещё, рассказываю, как и обещал когда-то, одно ноу-хау, о том как можно быстро найти код распаковки/расшифровки чего-либо, если отлаживать с самого начала программу очень долго и муторно.

Чтение файлов в Windows, как правило, идёт через CreateFile + ReadFile. Исключение - когда файл мапится в память (тогда придётся перехватывать ещё mapping-функции и высчитывать адрес нужного блока памяти для смены прав). Поэтому можно поступить так:
1) Делаем wrapper-оболочку-прослойку между игрой и системной kernel32.dll:
game.exe -> kernelxx.dll -> kernel32.dll
2) В kernelxx перехватываем работу с CreateFile и сравниваем с именем файла, который нам нужен. Если наш - сохраняем дескриптор открытого файла.
3) В ReadFile смотрим какой файл читается - если нужный (сравнили с дескриптором), то ставим (после того как оригинальная функция отработала!) на весь буфер бряк программно - запрещаем обращение к этой памяти:
VirtualProtect(lpBuffer, nNumberOfBytesToRead, PAGE_NOACCESS, @tmp);
4) Теперь если где-то программа обратится к этому куску памяти, то отладчик сразу остановится на этом месте, т.к. выбьет ошибку. Можно вместо этого вызвать DebugBreak(); тогда в этом месте управление передастся отладчику и можно будет дальше смотреть кто и что с этим буфером делает (это если с ним сразу работают, а не через 10 минут после загрузки, когда понадобился).
5) Обращаю внимание, что изменить в отладчике права на обращения к памяти нельзя, а т.к. код распаковки будет постоянно это делать, то будут постоянно лезть ошибки - т.е. нашли адрес кода распаковки, bp <адрес> и перекомпилили библиотеку, чтобы больше запрета на обращение к памяти не было. Тут можно попробовать, наверное, PAGE_GUARD (см. документацию - оно как раз один раз срабатывает и возвращает старые права на память после этого), вместо PAGE_NOACCESS, но я уже не помню почему от PAGE_GUARD отказался (не срабатывало, вроде бы).

Вот пример такой библиотеки (я его слегка поменял и уменьшил, чтобы было нагляднее, но не тестировал, так что возможны ошибки в работе, хотя всё и компилируется без проблем под Delphi 7):
[codebox]library KERNELXX;

uses Windows;

const
MyFileName = 'filename.ext';

var
MyHandle: THandle = INVALID_HANDLE_VALUE;

function CreateFileA(
lpFileName: PAnsiChar; dwDesiredAccess, dwShareMode: DWORD;
lpSecurityAttributes: PSecurityAttributes;
dwCreationDisposition, dwFlagsAndAttributes: DWORD;
hTemplateFile: THandle
): THandle; stdcall;
var s: ansistring;
begin
result:=Windows.CreateFileA(
lpFileName, dwDesiredAccess, dwShareMode,
lpSecurityAttributes, dwCreationDisposition,
dwFlagsAndAttributes, hTemplateFile
);
s:=lpFileName;
if (
(result <> INVALID_HANDLE_VALUE) and (Length(s) >= Length(MyFileName)) and
(Windows.lstrcmpiA(PAnsiChar(Copy(s, Length(s) - Length(MyFileName) + 1,
Length(MyFileName))), PAnsiChar(MyFileName)) = 0)
) then
begin
MyHandle:=result;
end;
end;

function ReadFile(hFile: THandle; Var Buffer; nNumberOfBytesToRead: DWORD;
var lpNumberOfBytesRead: DWORD; lpOverlapped: POverlapped): BOOL; stdcall;
var
d: DWORD;
p: pointer;
begin
result:=Windows.ReadFile(
hFile, Buffer, nNumberOfBytesToRead,
lpNumberOfBytesRead, lpOverlapped
);
if (result = true) then
begin
if (hFile = MyHandle) then
begin
p:=@Buffer;
Windows.VirtualProtect(p, nNumberOfBytesToRead, PAGE_NOACCESS, @d);
// DebugBreak();
end;
end;
end;

function CloseHandle(hObject: THandle): BOOL; stdcall;
begin
result:=Windows.CloseHandle(hObject);
if (hObject = MyHandle) then MyHandle:=INVALID_HANDLE_VALUE;
end;

procedure RtlUnwind; stdcall; external 'kernel32.dll' name 'RtlUnwind';

exports
CreateFileA,
ReadFile,
CloseHandle,
SetFilePointer,
GetFileSize,
CreateDirectoryA,
GetCommandLineA,
RtlUnwind,
GetVersion;

end.[/codebox]
Обращаю внимание на несколько важных вещей связанных с этим кодом:
1) В exports должны быть все функции, которые экспортирует игра/программа, иначе она тупо не запустится.
2) Блок exports обязательно должен идти после перехваченных функций, иначе перехватчики не будут работать (будет вызов оригинальных функций напрямую).
3) Если нужно вызвать оригинальный код из kernel32 (или другого юнита), то это нужно делать добавив имя такого юнита перед именем функции, как у объекта класса:
Windows.CreateFileA(...)
Потому что вызов:
CreateFileA(...)
создаст бесконечную рекурсию.
4) Ну и, конечно, не забудьте заменить в исполняемом файле игры/программы все строки "KERNEL32.DLL" на "KERNELXX.DLL", чтобы использовалась эта библиотека.
5) Можно не только работу с файлами перехватывать, но и работу с памятью, сетью, реестром (advapi32.dll - я обычно это делаю, чтобы при отладки игры мне в реестр не гадили) и так далее.

Мне идея такой библиотеки пришла в голову в 2015 году (обычные wrapper-то я ещё раньше делал - в старой версии патча для Турка) и безумно выручила - я как раз по заказу писал конвертер графики для какой-то игры (уже не помню точно для какой, но на сайте конвертер есть) и не мог никак до функции конвертирования добраться - в меню загружались обычные .BMP, а мне нужен был собственный формат игры, который только в игре загружался и только в определённый момент (когда этот объект был виден на экране). Там проблема, если правильно помню, была в том, что если ставить бряк на обращение к памяти (memory on access), то Олька почему-то начинает о-о-очень медленно работать, так что было практически невозможно дойти с момента загрузки до момента, когда нужный спрайт появлялся на экране (декодировался - шло обращение к памяти).
Siberian GRemlin,
Oct 5 2018, 19:44 The Settlers (все части)
Проверил. Закинул твой файл в демку, меню стало на русском, прошёл первое обучение, там тоже всё на русском, проблем не заметил. Русский Windows XP SP3 + все дополнения (официальные, POS Ready не ставил).
Может на другом ПК что-то перекосило, вот русский шрифт и не грузится?
А ещё заглянул в упомянутый тобой guiengine2.dll от demo в IDA, там в IGuiEngine::Init такой код:
CODE
<...>
  nCharSet = 0; // ANSI_CHARSET
  switch (a7) {
    case 16:
      nCharSet = 204; // RUSSIAN_CHARSET
      break;
    case 5:
    case 11:
    case 13:
      nCharSet = 238; // EASTEUROPE_CHARSET
      break;
    default:
      break;
  }
  v9 = &h;
  pFntData = (BYTE *)&unk_18809900;
  do {
    if (*v9) { DeleteObject(*v9); }
    v11 = CreateFontA(
            *((_DWORD *)pFntData - 8),
            *((_DWORD *)pFntData - 7),
            0,
            0,
            *((_DWORD *)pFntData - 6),
            0,
            0,
            0,
            nCharSet,
            0,
            0,
            *pFntData != 0 ? 4 : 0,
            0,
            (LPCSTR)pFntData + 2);
    *v9 = v11;
    if (!v11) { BBSupportTracePrintF(0, aGuiEngineCan_2); }
    pFntData += 84;
    v9++;
  } while ( (signed int)pFntData < (signed int)&unk_18809F3C );
<...>

Как я понимаю ANSI_CHARSET = RUSSIAN_CHARSET, если в системе установлен русский язык.
Можно попробовать либо 238 на 204 заменить, либо сделать так, чтобы всегда 204 было.
А ещё можно посмотреть откуда лезет параметр a7 входной со значениями 5, 11 или 13 - может в ресурсах где-то язык задаётся, а потом этот номер в эту функцию уходит.
Siberian GRemlin,
Oct 3 2018, 18:31 The Settlers (все части)
Там, действительно, какая-то модификация LZW, пришлось на ассемблере выдирать.
unlibs4.zip
Я так задолбался выдирая распаковку (там же ср@ные классы, где регистр ecx указывает на структуру, в которой хрен пойми что лежит - т.е. ты не можешь вот так просто взять и выдрать код распаковки), что на расшифровку забил. В demo ничего не шифровали, так что сделай при распаковке перенаправление вывода в файл (unlibs4.exe filename.lib > output.txt) и смотри, есть ли там "Warning: encrypted file, but decryption not supported - saving as is." и, если есть, то выложи куда-нибудь самый мелкий такой архив посмотреть.

[codebox]#pragma pack(push, 1)
typedef struct {
DWORD headsize; // размер заголовка со всеми таблицами
DWORD revision; // должно быть равно 0x1000 иначе игра считает архив битым
DWORD dnamelen; // длина блока с именами директорий
DWORD dcounter; // количество директорий в блоке
DWORD fnamelen; // длина блока с именами файлов
DWORD fcounter; // количество файлов
} headinfo;

// после этого идут char[dnamelen] и char[fnamelen]
// затем описание файлов fcounter раз:

typedef struct {
DWORD floffs; // смещение файла, минимальное 1 (.LIB всегда должен начинаться с нулевого байта)
DWORD pksize; // упакованный размер
DWORD unsize; // распакованный размер (0 если не упакован)
DWORD dindex; // номер директории в массиве строк выше
DWORD xflags; // флаги: 1 - упакован; 2 - зашифрован (расшифровывать, ПЕРЕД, распаковкой)
DWORD crcsum; // контрольная сумма (16 бит), может быть ноль (только для запакованных?)
} fileinfo;
#pragma pack(pop)[/codebox]Распаковка идёт так:
1) Проверка контрольной суммы, если она не ноль.
2) Если контрольная сумма совпала или ноль, то расшировать если (xflags & 2).
3) Если задан флаг (xflags & 1), то распаковать.
В принципе, игра не использует файлы из архива, если нужные уже есть на диске в соответствующем подкаталоге - т.е. достаточно распаковать и всё, можно переводить.

P.S. Как экзамен-то сдал? (*улыбается*)
P.P.S. Если не сложно, можешь чего-нибудь на копилку закинуть - мы на этой неделе как раз оплачивать хостинг будем. Спасибо.
Siberian GRemlin,
Aug 9 2018, 15:43 Работа с отладчиком
Ещё добавлю - Олька в оригинале устарела (но для начала и обучения азам - самое-то, ибо ещё не сильно навороченная).

А после можно смело переходить на вот это: x64dbg.

Пусть не смущает название - там и x32 отладчик есть. Выглядит точь-в-точь как Олька, только функций больше и их по разным местам растащили (например, задавать командную строку запускаемой программе теперь нужно в меню "File", заместо "Debug"), там даже command bar уже встроен (правда пара команд изменилась, ибо что-то я сходу не нашёл как там AT (перейти на адрес кода в дизассемблере) делается).
Так что можно даже x64 приложения дебажить - всё что изменится, это название регистров.
На примере регистра eax:
CODE
(=============================== 64 bit =======================) - rax
                             (============== 32 bit ===========) - eax
                                               (=== 16 bit ====) - ax
                                               ( 8 bit | 8 bit ) - ah | al
Такая же фигня с ebx, ecx и edx - они теперь все будут с "r" начинаться и размером в 64 бита. А, ну и всякие "push 0" положат на стек уже не 4 байта (32 бита), а 8 (64 бита). Короче, думаю, разобраться что к чему не сложно будет.

И ещё, меня тут в личке спрашивали что делать с играми, у которых оконного режима нет.
Есть три варианта:
1) Запустить игру в окне при помощи D3DWindower, DxWnd или подобных утилит.
2) Если есть дополнительный выход на видеокарте и возможность (в наличии второй монитор) - подключить второй монитор и вытащить окно отладчика туда.
3) Запусть игру под отладчиком и подцепиться к отладчику с другого компьютера (удалённо). Сразу скажу, что я такого никогда не делал, хотя знаю что можно (может, конечно, не все отладчики такое поддерживают), так что помочь не смогу если кто совета спросит - гугл в помощь.

P.S. Перетащу-ка я эту тему в подфорум "Статьи" - там ей самое место.
Siberian GRemlin,
Aug 9 2018, 15:23 Kaitai Struct — описание бинарных форматов
useretail, есть такая тема! (*улыбается*)
Переместил твоё сообщение сюда.
useretail,
Jun 21 2018, 20:03 Работа с отладчиком
Эээ... это я опять торможу. F7 - зайти внутрь функции (Step into).
А ещё F8 на инструкции loop сразу пройдёт весь цикл, в то время как F7 будет переходить на начало при каждом шаге.
Смотри в пунктах меню Ольки (как минимум View и Debug) что есть, а то я так сразу про все важные клавиши и не вспомню.
Ещё выше писал про пропажу бряков от клавиши F2. Но про саму клавишу не написал: F2 - поставить/снять бряк. Если файл не изменялся, то при перезапуске бряки не будут пропадать, кроме случаев когда бряк стоит на памяти которая была динамически выделена или внутри .DLL.
Пробел в окне дизассемблера вызывает диалог изменения кода (все изменения вылетят в трубу, после перезапуска программы). Наверное их как-то можно сделать постоянными, но не осилил разбираться, ибо оно не так уж и часто нужно было.
А ещё Alt+F9 - Execute till user code. Это полезно, когда программа выплюнула какое-то окно, а тебе нужно после него что-то посмотреть. Если делать пошаговое выполнение, то ты, как правило, будешь крутиться в бесконечном цикле, где сообщения Windows туда-сюда гоняются. Эта комбинация клавишь позволит вывалиться в отладчик, когда окно было закрыто. Самое простое применение:
1) Ждём пока программа покажет MessageBox() с каким-либо нужным сообщением.
2) Прицепляемся в памяти к программе: File -> Attach и выбираем среди процессов нашу программу.
3) Жмём Alt+F9.
4) Жмём чего-ниубдь на диалоговом окне MessageBox(), чтобы оно закрылось.
5) Опа - мы на следующей инструкции после этого окна - смотрим откуда сюда переход был и что там нужно поменять.
Siberian GRemlin,
Jun 20 2018, 19:51 Работа с отладчиком
Да, это пересылка, нужно было просто F8.
REP - сокращение от REPEAT (повторить).
В ECX должно быть количество раз (сколько повторить - C = Counter; ECX - регистр-счётчик).
MOVS - пересылка (BYTE/WORD/DWORD), у тебя пересылается BYTE - значит в ECX должно быть количество пересылаемых байт.
EDI - destination - адрес буфера назначения (куда пересылается).
ESI - source - адрес буфера источника (откуда).
Там ещё флаг направления задаётся командой CLD (+) или STD (-) - в первом случае значение EDI до MOVS будет указывать на начало буфера (увеличивается), а во втором на его конец (уменьшается), но, думаю, здесь всё же идёт увеличение.

Совсем забыл:
Ctrl+F2 - перезапустить программу.
Alt+F2 - закрыть и выгрузить программу, но не закрывать Ольку - это пригодится, если нужно изменить исполняемый файл, после чего достаточно нажать упомянутое выше Ctrl+F2, чтобы Олька сама перезагрузила последний открытый файл. Только замечу тут же, что Олька после любого изменения будет считать файл новым, так что все выставленные при помощи клавиши F2 бряки в коде вылетят в трубу - здесь снова спасает CommandBar, ибо набранное там, к примеру:
bp 401000
Сохранится в истории и никуда не денется, так что достаточно выбрать и снова нажать Enter. Кстати, посмотри справку к CommandBar, если интересно, там есть ещё condition break (помечаются фиолетовым цветом, а не красным) - это когда бряк должен срабатывать при определённом условии - здорово выручает, когда у тебя какой-то код вызывается из 1000 разных мест, а тебе нужно конкретное - ставишь условие, когда, например, в регистре EAX будет 0x1234 и только тогда такой бряк сработает.

Ещё пара полезных команд для CommandBar:
AT <адрес> - перейти на адрес в дизассемблере.
D <адрес> - перейти на адрес в дампе памяти; в принципе, можно всегда щёлкнуть по регистру, стеку или памяти и выбрать там "Show in Dump", но иногда, бывает, ты заранее уже знаешь какой-то статический адрес, где будет что-то лежать - можно сразу перейти туда после перезапуска программы и поставить там бряк на обращение.

И ещё насчёт команды BP и BPX. Иногда бывает такое, что функция из ядра системы (та же CreateFileA, например) импортируется, но "bpx CreateFileA" ничего не даёт и бряк не ставится. Так вот в такой ситуации можно поставить бряк на саму функцию CreateFileA в ядре системы:
1) Щёлкаешь правой клавишей на окне дизассемблера.
2) Выбираешь View -> Module 'kernel32'.
3) Теперь тебя переключили из основной программы на выбранный модуль.
4) Тут пишешь не bpx, а именно "bp CreateFileA", никаких сообщений не будет, но бряк установится.
5) Возвращаешься назад в программу (см. п.2) и запускаешь её.
6) Когда вылетит, то ты будешь стоять в начале кода функции. Чтобы узнать кто её вызвал, делай Ctrl+F9 (Execute till return), затем F8 и ты на инструкции, которая идёт после открытия файла. Или можно сразу после вылета на бряке встать на стеке на последний параметр, щёлкнуть правой клавишей мышки и выбрать "Follow in Disassembler" (Enter), чтобы сразу перейти на адрес возврата.
Siberian GRemlin,
Jun 14 2018, 17:15 Работа с отладчиком
Ты прям хочешь руководство в две строчки. Так не бывает.
Короче (для x86 - 32х битных приложений) - только самое основное:
1) Скачиваешь Ольку 1.10 (слева в меню "Odbg110.zip").
2) Скачиваешь CommandBar для неё: CommandBar
3) Распаковываешь Ольку, распаковываешь CommandBar и кидаешь в каталог к Ольке.
4) Запускаешь и открываешь там свой исполняемый файл (F3 или File - Open).
5) Т.к. ты брезгуешь нормальными системами, то запускаешь Ольку от имени Администратора, плюс помни, что первый вылет в ней будет не на OEP, а где-то в дебрях системы, ибо Windows Vista и выше - гоумно. Так что делай сразу F9, чтобы оно до OEP дошло.
6) Теперь жмёшь Ctrl+D или переключаешься на CommandBar снизу.
7) Пишешь там и жмёшь Enter:
bpx CreateFileA
Убедись, что там появилось "+ Breakpoint is set" или вводи CreateFileW или ещё чем там игра файлы открывает.
8) Отпускаешь программу на выполнение (F9). Если там нет антиотладочных приёмов, то она должна выпасть на вызове CreateFileA или на чём ты бряк ставил.
9) Когда выпадет - смотри окно справа-снизу. Это стек - смотри там имя открываемого файла. Жмёшь F9, пока там не будет интересующий тебя файл.
10) Теперь делаешь F8 - Step over, чтобы функция открытия выполнилась. Смотришь окно в верхнем-правом углу - это регистры, тебя интересует eax - это дескриптор только что открывшегося файла. Если там -1 (0xFFFFFFFF), значит файл не открылся - смотри в том же окне сообщение об ошибке (LastErr).
11) Теперь ты знаешь дескриптор файла. Ставишь бряк на:
bpx ReadFile
и отпускаешь на выполнение F9.
12) Выпал на чтении файла - смотри в стеке какой там дескриптор. Если твой - значит читается тот файл, которые тебя интересует, иначе - F9. Если файл твой - щёлкай правой кнопкой мышки в стеке на втором параметре сверху (адрес буфера) и выбираешь там "Follow in Dump" (третий пункт снизу). Теперь у тебя в окне слева-снизу показано начало памяти, куда будет прочитан файл.
13) Читаешь файл - F8. Теперь в окне памяти смотришь, что прочиталось именно то что нужно (можешь ещё на всякие SetFilePointer бряков понаставить, если файл не сначала читается, но больше лишних телодвижений будет). Ставишь на эту память бряк - щёлкаешь на первом байте левой клавишей, затем со Shift'ом щёлкаешь на каком-нибудь ещё, чтобы они выделились, затем правой клавишей на выделении и выбираешь Breakpoint - Memory, on access. Можешь выбрать на "on write", будет быстрее, но это только при условии, что буфер расшифровывается сам в себя, а не записывается куда-то ещё. К тому же "on access", позволит перехватить момент, когда прочитан первый байт, чтобы понять что дальше с ним делается.
14) Отпускаешь программу на выполнение (F9) и, теоретически, ты должен выпасть в месте, где память читают и расшифровывают.
15) Обрати внимание, что есть программы написанные наркоманами, так что там перед расшифровкой блок память могут таскать между буферами: buf1 - buf2 - buf3. Тогда бряк выпадет на копировании памяти из первого буфера во второй. А расшифровка, как ты понимаешь, будет третьего. Т.к. копирование выполняется в большинстве случаев стандартными средствами, то смотри регистр edi - это адрес памяти назначения. Переходим туда (правой клавишей мышки - Follow in Dump), и, после копирования, ставим там бряк на это место памяти. Этот бряк добавится к уже существующему, так что остальные можешь удалить, если не нужны, чтоб лишний раз не дёргало - Breakpoint - Remove memory breakpoint (после этого ставишь новый бряк, ибо эта функция удаляет все бряки).
Будут вопросы - задавай. Только с конкретными деталями что именно не получается.
Siberian GRemlin,
May 28 2018, 10:16 Программы запуска
Из того, что я видел - по степени убывания частоты использования:
1) Зачастую launcher передаёт game определённый параметр командной строки. Ловится очень просто - заменяешь game свой программой, которая сообщает с какими ключами её запустили.
2) Пару раз видел как launcher создавал ключ в реестре, запускал game, та проверяла ключ, если он есть - запускалась, если нет - выходила. Уже не помню подробностей, кто именно удалял ключ после запуска - game или launcher. Ловится такое дело через RegMon.
3) Ещё было - создавался/изменялся файл настроек с определённым значением. Это можно отследить через FileMon.
4) Какая-то программа была, которая запускала свой основной модуль в спящем режиме, что-то там расшифровывала в уже загруженном в памяти процессе, и только потом делала ResumeThread(). При обычном запуске там то ли точка входа другая была, то ли команды по адресу точки входа были обычным завершением работы, так что без launcher сама game тупо без всяких сообщений сразу выходила.
5) Также попадалось совсем дикое, но это под DOS - launcher перехватывал прерывания, на них садились сервисные функции игры, а уже потом запускался game, который проверял есть ли на этих прерываниях нужный сервис.
Может, что-то ещё забыл, но это основное.
Siberian GRemlin,
Nov 30 2017, 16:37 STUNS - STupid UNcompreSsor
Собрал новую версию v1.0.

Русским языком:
- нафиг дропнут старый код и всё переписано начисто;
- GCC 3.2 с хаками вместо MSVC 6.0 - меньше занимает;
- обновлены puff и blast из последних исходных кодов zlib;
- алгоритмы UCL/NRV (ucl2b and ucl2d) выброшены как малоиспользуемые;
- изменён текст вывода сообщений: смещение (в hex), размер (десятичный), алгоритм, информация;
- новая опция, чтобы всё распакованное сохранялось в один файл (Corak просил);
- новая опция, позволяющая ничего не сохранять - давно надо было такое сделать: сначала всё настраиваешь, а когда видишь, что будет распаковываеться только то что нужно, то уже распаковываешь.

Т.к. переписывал начисто и заново, то возможны появления ошибок в самых неожиданных местах.
Если заметили - сообщайте.
Старую версию v0.5 оставил кому нужна в первом сообщении.
Corak,
Nov 17 2017, 11:31 Open Source Projects
Короче, меня все и всё достало, так что публикую свои правки в открытую.

Первая сторона конфликта: Resident Evil 3: Restoration Project.
Основной сайт (обновляется редко).
Основное обсуждение здесь.
Тут ещё.

Вторая сторона конфликта:
Сайт.
Форум.

Т.к. дерьмо, наверняка, ещё полетит в ближайшее время, то сообщаю что я уожу из проекта и из конфликта по Resident Evil 3: Restoration Project.
Все свои правки я делаю открытыми и публичными. Каждый может:
- украсть и присвоить их себе и заявить что он автор;
- продавать в GOG / Steam / CAPCOM / куда угодно;
- использовать по любому другому усмотрению.
Я разрешаю - мне глубоко фиолетово.

Все дальнейшие проблемы меня не касаются. Обе стороны вместо того чтобы найти компромисс предпочитают устроить скандал и поливать друг друга дерьмом - мне это всё нахрен не сдалось и я не хочу в этом участвовать.
Поэтому если кто-то попытается втянуть меня в этот скандал, то я легко и непринуждённо утоплю в их собственном дерьме любую сторону конфликта.
Больше комментариев не будет. Все свободны.

Все правки ниже работают только для USA версии ResidentEvil3.exe (1 273 856 байт от 2000.10.02). Для RE3_MERCE.EXE адреса переменных будут теми же, но секция кода чуть больше, поэтому смещения для дополнительного кода будут другими. Я не буду их здесь описывать - кто захочет сам разберётся.

1) Сдвиг текста с 6 до 34 пикселей слева как в PS-версии:
[codebox]0002DAB0: 06 22 ; статичные области, типа всякого мусора на полу
0002DB0D: 06 22 ; активные объекты: пиш.машинка, двери с ключом и т.д.
0002F56C: 06 22 ; line1: init // Farewell to my life.
0002F584: 06 22 ; line2: init // Farewell to my home.
0002F5A9: 06 22 ; line1: show
0002F5BB: 06 22 ; line2: show
0003E883: 06 22
0003EF7F: 06 22 ; текст на электростанции
000495E9: 06 22
0002E1BD: 02 1E ; текст для головоломок[/codebox]

2) Фикс, чтобы использовался каталог "zmovie", если в bio3.ini нет ключа "Movie" в секции "General".
[codebox]; empty string => "zmovie/bdino.str"
00004082: 80 E6
00004083: 49 BA
00004084: 53 51
; "/" => 0 in "zmovie/bdino.str"
; от трейлера DinoCrisis
; (отсутствует и не используется в PC-версии игры)
0011BAEC: 2F 00[/codebox]

3) Дололнительный код - публикуется впервые и никто такого ещё не делал - полный сброс игры по F9 в главное меню из любого места (даже из FMV роликов) с исправлением состояния и сбросом необходимых флагов, а также переключение автоприцела по F1.
[codebox]; extend .text section size
; VirtSize => PhysSize (0010847A => 00109000)
; for additional code
000001F8: 7A 00
000001F9: 84 90
; call to additional code
00004908: 25 E8
00004909: FF 6F
0000490A: FF 4B
0000490B: 00 10
; additional code
0010947C: 00 25
0010947D: 00 FF
0010947E: 00 FF
00109481: 00 66
00109482: 00 3D
00109483: 00 45
00109484: 00 9C
00109485: 00 75
00109486: 00 07
00109487: 00 80
00109488: 00 35
00109489: 00 BE
0010948A: 00 28
0010948B: 00 A6
0010948D: 00 40
0010948E: 00 66
0010948F: 00 3D
00109490: 00 46
00109491: 00 9C
00109492: 00 75
00109493: 00 2C
00109494: 00 80
00109495: 00 25
00109496: 00 9B
00109497: 00 87
00109498: 00 A5
0010949A: 00 FD
0010949B: 00 66
0010949C: 00 C7
0010949D: 00 05
0010949E: 00 80
0010949F: 00 87
001094A0: 00 A5
001094A4: 00 C6
001094A5: 00 05
001094A6: 00 B4
001094A7: 00 28
001094A8: 00 A6
001094AA: 00 01
001094AB: 00 80
001094AC: 00 25
001094AD: 00 81
001094AE: 00 C8
001094AF: 00 A5
001094B1: 00 FB
001094B2: 00 80
001094B3: 00 0D
001094B4: 00 82
001094B5: 00 C8
001094B6: 00 A5
001094B8: 00 20
001094B9: 00 C6
001094BA: 00 05
001094BB: 00 5A
001094BC: 00 FD
001094BD: 00 A4
001094BF: 00 02
001094C0: 00 C3
; F1: 44 -> 45 new ID (40004 -> 40005)
001369F4: 44 45
; F9: 41 -> 46 new ID (40001 -> 40006)
00136A1C: 41 46[/codebox]
Код из блока additional code с комментариями:
[codebox]and eax, 00000FFFFh
cmp ax, 09C45h
jne @next
; toggle autoaim
xor b, [00A628BE], 040h
@next:
cmp ax, 09C46h
jne @quit
; drop radar flag
and b, [00A5879B], 0FDh
; drop invert state
mov w, [00A58780], 00000h
; set normal menu speed
mov b, [00A628B4], 001h
; drop unknown flag
and b, [00A5C881], 0FBh
; set hard reset bit
or b, [00A5C882], 020h
; stop playing FMV movies
mov b, [00A4FD5A], 002
@quit:
retn[/codebox]

4) Впервые во всём мире - пропуск анимации дверей для Resident Evil 3. Дело в том что на PC она абсолютно бесполезна, т.к. сначала грузится сцена (вся), затем анимация двери и только потом игра начинает её проигрывать и ждать нажатия кнопки вызывающей карту (с её помощью анимацию можно пропустить).
CODE
; animation door skip
0006975E: B9 00


5) Также прикладываю утилиты, которые я написал во время работы:
- ddrawold - попытка сделать враппер и решить проблему с патчами для сцен в низком разрешении (незаконченая разработка);
- re3frame - позволяет менять количество кадров в видеороликах в игре (т.е. длительность видеороликов - да оно там через задницу считается);
- flagtest - что-то типа ArtMoney, но позволяет менять битовые флаги игры - дело в том, что вся игра, по сути, это одна большая (и кривая) виртуальная машина, так что там не только какие-то определённые значения за что-то отвечают, но и байт или двойное слово может отвечать сразу за кучу параметров, если зажжены или погашены какие-либо биты.
Скачать можно здесь: re3tools.zip.

QUOTE
This page in web archives as proof: 1, 2.
useretail,
Apr 19 2017, 05:19 Software patches
QUOTE(useretail @ Apr 19 2017, 00:42) [snapback]4229[/snapback]
А почему не 2.95? Вроде она последняя из вторых...
Потому что после 2.81 туда засунули поддержку проигрывания видео и всё пропало (обрати внимание на постфикс Classic - это была последняя версия, из которой ещё не пытались комбайн сделать). Впрочем, я от 2.95 взял плагины для проигрывание трекерных форматов in_mod.dll - там пофиксили падение плагина, когда у тебя открыта информация о файле и файл закончил играть. А ещё я взял оттуда in_mp3.dll (обновил на всякий случай), он, вроде, даже .AAC должен проигрывать (во всяком случае в два раза толще обычного), но почему-то у меня он ничего не играет (просто не запускает на проигрывание файл и всё), поэтому без in_mp4.dll никуда.
useretail,
Mar 25 2017, 07:20 .DDS DirectX 10
Не совсем в тему, но всё ж.
.DDS (DirectDraw Surface) to .TGA texture converter v1.4
В самом низу страницы. Утилита конвертирующая .DDS в .TGA, основанная на ReadDXT от nVIDIA из DDS Utilities версии 8.30 от 2007 года. С новыми .DDS (DirectX 10+ и прочие) работать не будет! С исходными кодами на Си (VS C++ 6.0).
Вообще, утилиту писал 12 лет назад, тупо добавив в ReadDXT работу с маской "*.dds". Потом, когда появился The Compressonator и другие утилиты, я её с сайта убрал (лет 10, наверное, назад). Однако, примерно месяц назад со мной связался Aka Sektor и сказал что в сообществе мододелов для S.T.A.L.K.E.R. моей утилитой до сих пор пользуются. Попросил поглядеть что там с новыми файлами и прозрачностью - утилита, мол, на них не работает. Однако, исправить я ничего не мог, потому что там .LIB файл без исходных кодов, только с заголовочным файлом. Бибилиотека эта была у меня от версии DDS Utilities 6.74 - я обновил до 8.30 - это последняя на сайте nVIDIA (на сайте написано 8.31, но в библиотеке указано 8.30), до того как они болт на эту библиотеку положили. И тут выяснилось страшное: все .LIB файлы для 8.30 собраны под 7-ой студией, а у меня только 6-ая. Искать и собирать под 7-ку мне очень не хотелось, так что пришлось изрядно попариться (особенно с частью отсутствующих функций), чтобы собрать под 6-ку, но я всё ж собрал и теперь программа будет работать под любым Windows (см. исходные коды - там много интересного). К тому же к новой версии ReadDXT исходных кодов не было (не говоря уже о том, что .LIB переписали на классы) и часть .DDS файлов она не конвертировала, которые конвертировала старая верси 6.74. В общем, Aka Sektor мне присылал .DDS файлы которые неправильно конвертировались старой версией dds2tga или старой они конвертировались, а новой нет. В итоге, общими усилиями, собрали таки обновлённую версию, правда, Volume Mip Map я не проверял, ибо не на чем. И хотя утилита не поддерживает новых расширений .DDS, зато, как сказал Aka Sektor, она небольшая, шустрая и везде работает - за это мододелы её и ценят.
Я думал стоит здесь про это писать или нет, потом вспомнил, что Axsis как-то писал, что утилиты от nVIDIA более или менее правильно .DDS конвертируют, в отличие от многих других, поэтому решил всё же об этой утилите упомянуть - может кому-нибудь тоже пригодится.
Siberian GRemlin,
Mar 16 2017, 07:44 Прогресс и программы
Долго думал написать здесь или в Software Patches, но всё ж решил в этой теме, ибо там патчи чтобы починить, а тут чтобы тупо заставить работать. Короче, отказался у меня сегодня Skype запускаться с ошибкой:
QUOTE
Вы были отключены от сети потому что пользуетесь устаревшей версией Skype.
Как пишут сами разработчики версии 7.16 and below более не поддерживаются.
Т.е. они тупо блочат по номеру версии.
Ну, я тоже не будь дураком - запустил ArtMoney, сделал поиск строки "6.20" (моя версия Skype, где ещё не успели окончательно весь интерфейс испоганить). Нашлось что-то около 20-30 совпадений, но, как оказалось, достаточно было поменять лишь в первом "6" на "7" чтобы Skype благополучно продолжил работать. Сделал себе небольшую программку, которая запускает Skype, ждёт, пока в этом месте памяти (адрес фиксированный) не появится "6", патчит на "7" и выходит.
Кстати, для проверки поставил в песочнице Skype 7.17.0.106 (взять можно здесь) - тот, действительно, входит без проблем, но интерфейс уже успели угробить.
Siberian GRemlin,
Dec 31 2016, 08:42 С наступающим Новым годом!
И снова пора подводить итоги года, друзья.

В этом году нашему проекту исполнилось целых 10 лет - взят некоторый рубеж, так сказать.

За этот год у нас было не так уж много распаковщиков, в основном правили старые (иногда даже 10-ти летней выдержки), но лучше поздно чем никогда, верно?
Спасибо всем, кто не ленился писать комментарии, тестировать и сообщать об ошибках!

Самое главное - в этом году все наши нужды по финансовой части проекта взял на себя товарищ kampaster - наш казначей. Я по прежнему кое-что накалымливаю, а товарищи BLACK и sssss помогают закидывая на копилку. Не то чтобы много было, но мне как-то всё ж совестно все наши расходы целиком на казначея сваливать.
Большое спасибо всем, кто помогает нам в такое непростое время и делится своими сбережениями (очень хочется надеяться, что не последними)!

И, конечно же, спасибо всем нашим форумчанам, участникам команды CTPAX-X!
Я уверен, что мы много чего интересного и хорошего за этот год сделали.
Спасибо вам, друзья!

Хочу пожелать всем счастливого Нового Года!
А также вам и вашим близким исполнения всех ваших желаний!
Не жадничайте только сильно с желаниями, хорошо? (*улыбается*)
Пусть в Новом Году у нас у всех будут силы, желание и возможность для тех дел, которые мы не успели завершить в этом!
С Новым Годом!
Axsis,
Nov 23 2016, 15:03 Delphi, Asm, C, WinAPI, PHP, ...
QUOTE(-=CHE@TER=- @ Feb 13 2014, 14:49) [snapback]3648[/snapback]
Натолкнулся на то, что в нескольких играх используется LZSS, описанный в моём сообщении выше.
Но, есть одно отличие MS-LZSS (Microsoft LZSS) от классического LZSS (который, похоже, используется во многих играх), без которого на выходе получится не файл, а что попало.
Нашёл ещё одну вариацию - применялась в старых играх от Blizzard:
- Warcraft: Orcs and Humans
- Blackthorne
- Lost Vikings
В ближайшее время распаковщик на сайт добавлю (там нет имён и через флаги у размера / смещения файла определяется сжат он или нет). Кому интересно, описываю изменения в том алгоритме что я приводил ранее.

Вот эти строки:
CODE
FillChar(buff[0], $FFF + 1, 32);
I:=($FFF + 1) - 16;
...
J:=J + ((Len And $F0) ShL 4);
Len:=(Len And $0F) + 3;

Заменяются этими:
CODE
FillChar(buff[0], $FFF + 1, 0);
I:=0;
...
J:=J + ((Len And $0F) ShL 8);
Len:=((Len And $F0) ShR 4) + 3;

И всё.
Grom PE, Siberian GRemlin,
Oct 31 2016, 18:46 Полезные ссылки
Помнится товарищ jTommy 8 лет назад поделился исходными кодами GAP 1.28.
А последняя версия 1.32, если вы помните.
Так вот, полгода назад Валерий Анисимовский таки выложил исходные коды не только к последней версии GAP, но и видеофильтрам - GMFCore.
Game Audio Player v1.32 source codes
Game Media Formats Core Filters Package v1.00 source codes
Так что кому нужны алгоритмы распаковки видео и/или звука - может подглядеть.
Siberian GRemlin,
Aug 17 2016, 10:15 STUNS - STupid UNcompreSsor
Собрал новую версию v0.5.

Русским языком:
Натолкнулся на падение STUNS из-за minilzo, причём на потоке, где был, как оказалось, только deflate. Блин, давно надо было обновить все библиотеки распаковщиков. Также, на всякий случай, обновил UCL. Там, кстати, есть новые алгоритмы сжатия, типа NRV2E и NRV2E-99, но их тогда надо отдельными ключами командной строки добавлять - сейчас нет времени и желания с этим копаться, так что лишние файлы просто выкинул для уменьшения размера дистрибутива. Главное, что не падает больше. Все библиотеки в STUNS сейчас должны быть последних версий.
Axsis, Siberian GRemlin,
Jul 13 2016, 10:45 The Last Express Gold Edition
Ух, ты!
Первый раз вижу .EXE файл, который реально использует reloc'и!
$0054E2F8 => $00B0E2F8
Во всяком случае у меня оно сюда грузится.
Проверь у себя - такой же адрес будет или нет.
Если нет, то придётся тебе получать адрес, куда загружен процесс, затем прибавлять к нему $0014E2F8 ($0054E2F8 - $00400000), чтобы получить смещение до своей строки. Гугли как можно по ProcessInfo.hProcess или ProcessInfo.dwProcessId (PID) получить HMODULE / HINSTANCE (это как раз адрес загрузки).
Я попробовал строчку Arial заменить на Comic - вроде бы, ошибок нет, но и шрифт в меню и Credits не поменялся (во всяком случае на Comic не похож).
Возможно, Arial, он везде Arial, а Comic нужно было писать полным именем как "Comic Sans MS", поэтому и не сработало. Но WriteProcessMemory() возвращет True, так что всё отрабатывает без проблем.
Кстати, всё забываю сказать - у тебя дескрипторы текут - после ResumeThread() нужно обязательно его закрывать: CloseHandle(ProcessInfo.hThread); Закрытие дескриптора - это не завершение процесса.
Siberian GRemlin,
Jul 4 2016, 14:39 Кто чего слушает?
Kaleo - Way Down We Go (Official Video)
Kaleo - "Way Down We Go" (LIVE in a volcano)
Во втором клипе они реально в недра вулкана спустились. Правда уже недействующего. (*улыбается*)
Axsis,
Jun 26 2016, 18:28 The Last Express Gold Edition
Это просто адрес кода. Его можно посмотреть в HIEW или IDA например (это из другой программы):

.0040117A: E8D1FD0200 call ExitProcess ; KERNEL32

Вот это $0040117A и есть адрес в памяти загруженного процесса. Учти, что это виртуальный адрес, а не смещение в файле.

var buff, dw: DWORD;
...
if (ReadProcessMemory(pHandle, $0040117A, @buff, 4, @dw) = true) then
writeln(buff); // buff == $02FDD1E8
...

.EXE не используют relocations, так что для исполняемого файла адрес всегда будет абсолютный и одинаковый на любой системе.
А для .DLL тебе нужно будет к базе (GetModulaHandle() / LoadLibrary()) прибавлять относительный адрес (т.е. от начала модуля).
Вообще, проверить можешь - читаешь память по указаному адресу (ReadProcessMemory()) и смотришь "Arial" ли там. Если да - значит попал куда надо. (*улыбается*)
Siberian GRemlin,
Jun 26 2016, 13:00 The Last Express Gold Edition
QUOTE(Siberian GRemlin @ Jun 26 2016, 12:12) [snapback]4113[/snapback]
Печально, но ни один из вариантов не помог. Может игра как-то иначе субтитры выводит, не через эту функцию / DLL.
Наверное.
Насчёт .EXE и "Arial", попробуй так (малой кровью проверить):
1) Пишешь программу, которая через CreateProcess() создаёт процесс игры в спящем (CREATE_SUSPENDED) режиме.
2) Патчишь своё "Arial" в памяти (WriteProcessMemory()) на что нужно (не забудь права на память поменять и обратно - VirtualProtectEx()) или что ты там хотел изменить.
3) "Отпускаешь" процесс на исполнение через ResumeThread().
Если этот финт с ушами пройдёт (игра не проверят свой код в памяти и после изменения начала видеть русские буквы), то можно, в принципе, так в виде запускалки и оставить.
Siberian GRemlin,
Jun 26 2016, 11:22 The Last Express Gold Edition
Если не проверяется, то ок.
Попробуй, пока что, такое:

libcocos2d.dll
0005F0EC: 01 -> 00 ; DEFAULT_CHARSET (1) -> ANSI_CHARSET (0)

Если не поможет, то попробуй вместо 00 вписать CC - это RUSSIAN_CHARSET (204).

Если и так не сработает, значит в ту ветку, почему-то, управление не передаётся и можно попробовать перед самым созданием шрифта заменить качество на кодировку:

// это то, что мы выше меняли
.1005FCE9: C6 45 83 01 mov b,[ebp][-7D], 001 => mov b,[ebp+var_94.lfCharSet], 1

// а это - установка качества непосредственно перед вызовом CreateFontIndirect()
.1005FE64: C6 45 86 04 mov b,[ebp][-7A], 004 => mov b,[ebp+var_94.lfQuality], 4 ; (ANTIALIASED_QUALITY 4)
Т.е. меняешь 86 на 83 и вместо 04 пишешь 00 или CC (смещение начала этой инструкции 0005F264).
Шрифт, правда, вместо ANTIALIASED будет с обычным, простым, начертанием, зато с нужной кодировкой.
Siberian GRemlin,

6 Страниц V  1 2 3 > » 
Упрощённая версия Сейчас: 20th August 2019 - 16:23