Добро пожаловать, гость ( Вход | Регистрация )
Дата поста: | В теме: | За сообщение: | Спасибо сказали: | ||
---|---|---|---|---|---|
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 |
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, описанный в моём сообщении выше. Нашёл ещё одну вариацию - применялась в старых играх от Blizzard:Но, есть одно отличие MS-LZSS (Microsoft LZSS) от классического LZSS (который, похоже, используется во многих играх), без которого на выходе получится не файл, а что попало. - 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, | ||
Jun 25 2016, 21:03 | STUNS - STupid UNcompreSsor | Собрал новую версию v0.4. Описание на английском (спасибо Grom PE за его пруфрид, а также справки по командной строке!) и ссылку в первом сообщении обновил. Пришлось правда в справке по ключам командной строки кое-чего тут и там подсократить, чтобы в стандартный экран 80x25 влезало. Вообще, хотел всё это ещё в октябре прошлого года выложить, но забыл. Русским языком: - появилась возможность задать смещение (только в hex) откуда сканировать, что помогает пропустить лишние данные в начале файла (по умолчанию 0 - с начала файла) - появилась возможность задать максимальное количество файлов (например, 25) после распаковки которых программа завершает работу (по умолчанию 0 - неограниченно) - наконец, появилась та штука, которую, видимо, планировал сделать ещё сам автор оригинальной программы - если вы помните, то ключи с именами алгоритма указываются просто и с "-" на конце если алгоритм нужно отключить; при этом т.к. по умолчанию все алгоритмы включены, то простое использование любого алгоритма без "-" на конце ничего не меняло; т.е. если в сканируемом файле использовался только один, скажем, deflate, то все остальные приходилось отключать: stuns -pkware- -lzo- -ucl2b- -ucl2d- ... что раздувало командную строку, да и раздражало набирать; теперь же достаточно написать: stuns -deflate ... и все остальные алгоритмы сами отключатся; если нужно два каких-то, то пишем: stuns -deflate -pkware ... будут использованы только deflate и pkware, а остальные отключатся - по-моему очень удобно. |
Axsis, Siberian GRemlin, | ||
Feb 7 2016, 13:45 | Новости сайта | Друзья! Нам сегодня исполнилось 10 лет! Поздравляю всех с этой круглой датой! Кое-что я написал в новостях на главной, но хотелось бы вспомнить всю историю нашего проекта... Начать, наверное, стоит с товарища Terminus'а - автора и хозяина сайта Extractor.ru - если бы не он, то, скорее всего, и нашего проекта не было бы, потому что Extractor.ru это не просто крупнейший, а единственный русскоязычный сайт по распаковке ресурсов. Практически все из нашей команды познакомились именно там. А уже потом, в 2006 году товарищ Blade вытащил меня с моей домашней странички CTPAX-CHEATER на народе на отдельный хостинг и домен второго уровня. Мало кто знает, но в то время у меня было всё очень сложно - я крутился на нескольких работах и только после полуночи у меня появлялось время чтобы заняться свежеоткрывшимся сайтом, ответить на почту людям, а рано утром снова вставать на работу... Blade буквально на ходу писал сайт, добавлял новые вещи, исправлял и менял уже написанное и отшлифовывал сайт насколько мог. В то же время нам помогал недавно снова вернувшися в наши ряды товарищ RAYN3, который влился в нашу команду разбираясь тогда с шифрованием архивов в русской версии Bloodrayne 2. У нас практически каждый день что-то менялось. Это было безумное время, но мы выдержали. А потом мы, я считаю, отлично заявили о себе с NFS Multimedia Converter'ом - нам всем есть чем гордиться, это была отлично выполненная и качественная работа - не многие коммерческие фирмы могут сделать подобные вещи на таком же уровне. У нас была пара ошибок, которые, к слову, от нас не зависили - кривая работа eaconv.exe с русскими путями и точками в имени файлов, а также кривопересобранный пиратский "sdat.viv", кажется, от NFS:U2, для которого пришлось добавлять поддержку в конвертере, но это всё детали. У нас всех были свои "5 минут славы", когда мы делали первыми, единственными и лучше всех. Но не только у нас всех, но и каждого по отдельности - Xplorer со своим ToWav и огромной помощью с другими вещами, jTommy со многими и многими полезными и уникальными утилитами, Siberian GRemlin с утилитами для работы .VP6 и своими отличными переводами и русификаторами, Grom PE с конвертером DMM2XM, прочими утилитами и помощью с другими вещами, Axsis - человек, уникальный тем, что несмотря на то, что практически не написав ни одного распаковщика помог разобрать не один зубодробительный формат от сложности которых реально можно было крышей двинуться. А ещё с нами были Alex - первый и единственный модератор форума, товарищи Bourn - nocd и другие полезные программы, angeld29 - помощь с распаковкой и дешифровкой Resident Evil 3 (у него, кстати, свой сайт имеется - Angel Death's page с разными программами). Считаю нужным упомянуть и товарища Xexys утилиты которого, после закрытия сайта товарища jTommy теперь хостятся у нас и мы не дали столь полезным программам кануть в Лету. Также было бы несправедливо забыть про наших форумчан: xkL0#J (поддержка сайта, активное в обсуждениях на форуме), Капитан Фокин (помощь и тестирование плагина CheckSum для FAR), nickolayer (активное обсуждение на форуме), Raf-9600 (nocd для NFS2, Disciples: Sacred Lands, Star Wars: Galactic Battlegrounds music fix), useretail (активное обсуждение на форуме), geminiYO (помощь с конвертером для NFS4). А ещё хочется сказать спасибо участникам форума Extractor.ru: конечно же Terminus'у, а также VAG (eaconv.exe, unepf и множество других утилит), CrOm (плагин к FAR для распаковки игровых ресурсов), John_Modest (полезнейшие утилиты для игр серии Silent Hill), Guru (первый конвертер для NFS:U), а также многим-многим другим! Прошу простить, если забыл чьи-то заслуги или даже кого-то - сложно вспомнить всё, что было за эти 10 лет и объять необъятное. Спасибо всем, кто так или иначе был с нами за это время! Без вас всё было бы иначе, а возможно и не было бы совсем ничего! |
Axsis, Siberian GRemlin, | ||
Feb 4 2016, 18:29 | Новости сайта | Друзья! К нашей команде примкнул, отлучившийся на 10 лет по жизненным обстоятельствам, товарищ RAYN3! Кто-то, возможно, не в курсе кто это - посмотрите страницу "О проекте" на основном сайте. (*улыбается*) Прошу любить и жаловать! |
RAYN3, | ||
Oct 2 2015, 15:08 | !Вирусы! | Всё, я так больше не могу - мучительно хочется кому-нибудь в глаз дать, но не знаешь с кого начать... Прошу отнестись серьёзно к тексту ниже, т.к. он касается всех. Итак, с чего бы начать?.. Позавчера товарищ Siberian GRemlin прислал мне на почту письмо (за что ему спасибо), сказав что он не может зайти на мой сайт (ctpax-cheater) т.к. его блокирует Интернет-обозреватель. Кто не знал - современные оборзеливатели тягают откуда-то список "плохих сайтов" и если ваш сайт туда угодил, то пользователи зайти к вам не смогут. Я современными программами не пользуюсь, ибо хрень на палочке, так что об этой проблеме не знал. Стал искать кто эти списки составляет - тоже, кстати, нетривиальная задача, ибо кто этим только не занимается. Вышел вот сюда: https://www.stopbadware.org/clearinghouse/search Вбил туда адрес своего сайта и узнал, что мой сайт аж с марта (!) в блокировке из-за какого-то ThreatTrack. Нагуглил их сайт: http://www.threattracksecurity.com/resourc...ubmissions.aspx Зашёл в "Blocked website" и объяснил, что у меня нет никаких вирусов и прочей фигни - потрудитесь объяснить, за что вы мой сайт заблокировали. Сегодня опять зашёл на stopbadware.org и смотрю - с моего сайта блокировка снята (1 октября - когда на ThreatTrack написал). Но теперь в истории моего сайта есть запись, что он был в блокировке с марта по октябрь. Это, конечно, не судимость, но очень неприятно. А теперь то, что меня ОСОБЕННО БЕСИТ. Я проверил свой сайт на трёх сервисах: virustotal.com/en/url/... google.com/safebrowsing/diagnostic... urlvoid.com/... И только VirusTotal.com сказал, что мой сайт был проверен в марте (всё совпадает) и 1 (ОДИН!) антивирус что-то там нашёл - чёртов BitDefender! Самое главное - я сделал ещё раз проверку сайта на VirusTotal.com и там больше ничего не нашлось - сайт прошёл проверку всеми антивирусами. Вы понимаете что происходит? - какие-то уроды пишут кривой антивирус BitDefender, который всё считает вирусами; - кто-то, на каком-то сервисе, отправляет мой сайт на проверку; - мой сайт блокируется 1 (одним!) куском не буду говорить чего, но это был BitDefender; - из-за 1 (одного!!!) ложного срабатывания мой сайт попадает в чёрный список, который непонятно кто распространяет и непонятно кто составляет; - и теперь хозяину сайта, который об этом всём ни сном ни духом, нужно где-то и как-то искать кто, когда и как занёс его сайт в этот чёртов чёрный список, чтобы оттуда удалиться; - но самое главное - хоть тебя и убрали из списка, но история о том что твой сайт был в блокировке так и останется - и это при том, что блокировка была из-за ЛОЖНОГО срабатывания!!! Я понимаю что борьба с вирусами, фишинговыми сайтами и прочее и прочее. Но это уже маразм какой-то. Если пользователь дебил, то можно сколько угодно защищать его от подобных сайтов - он всё равно туда залезет. Зато страдают все остальные. И, вообще, благими делами вымощена дорога известно куда. На данный момент Интернет уничтожают не столько вирусы и фишинговые сайты, сколько антивирусные компании блокирующие всё подряд. Люди, что с вами не так?! |
Siberian GRemlin, | ||
Sep 12 2015, 11:56 | Полезные ссылки | Siberian GRemlin, | |||
Aug 14 2015, 08:50 | Баги сайта и форума | Сегодня от хостера пришло автоматическое уведомление: QUOTE User has used 102% of his/her allocated disk space. Зашёл на FTP и посчитал размер всех файлов (там ещё какие-то автоматически генерируемые логи были - где-то на 50 Мб - всё потёр) - получилось 177 Мб. Но в веб-админке показывает, что использовано 307.7 Мб из 300 Мб.Думаю, что за фигня - залез в настройки посмотреть подробнее - ах ты ж долбанный ты нафиг! Там размер БД больше 100 Мб! Что-то думаю, много. Сделал "OPTIMIZE TABLE" для всех таблиц (сайта и форума) - как-то сильно не помогло. Сделал SQL-запрос "SHOW TABLE STATUS" и поглядел что не так. С БД сайта всё было ок, а вот на форуме оказалась просто адски жирная таблица "ibf_spider_logs" - она одна аж 90 Мб с чем-то жрала. Полез в настройки форума и отключил эту хрень (Search Engine Spiders -> Log all spider visits? -> No), чтобы больше туда ничего не добавлялось. Затем очистил таблицу: TRUNCATE TABLE ibf_spider_logs; OPTIMIZE TABLE ibf_spider_logs; Поглядел ещё раз статистику и сделал тоже самое с таблицей "ibf_task_logs" (правда, где отключается запись туда не нашёл - да и ладно, она не очень большая). Так вот, после этого обновил статистику в веб-админке - БД похудела и стала занимать около 10 Мб!!! А я раньше никак не мог понять, чего это у меня резервная копия БД форума так долго делается и так много занимает! |
Siberian GRemlin, | ||
Jul 28 2015, 08:06 | Doom 3. BFG Edition [.IDWAV] | Глянул - короче, там сплошной головняк. Формат у .idwav / .idxma примерно такой: CODE uint32 magic; // const uint32 SOUND_MAGIC_IDMSA = 0x6D7A7274 int64 timestamp; // 8 bytes (ID_TIME_T) bool loaded; // 1 byte int playBegin; // 4 bytes int playLength; // 4 bytes idWaveFile::waveFmt_t format; // vary - see "/neo/sound/WaveFile.h" int num; // 4 bytes BYTE amplitude[num]; // num bytes int totalBufferSize; // 4 bytes int num; // 4 bytes [num] structs: int numSamples // 4 bytes int bufferSize // 4 bytes BYTE [bufferSize] // bufferSize bytes См. файлы: /neo/sound/XAudio2/XA2_SoundSample.cpp /neo/sound/XAudio2/XA2_SoundSample.h Например метод: bool idSoundSample_XAudio2::LoadGeneratedSample( const idStr &filename ) Это загрузка такого файла. Определённый интерес вызывает там idWaveFile::ReadWaveFormatDirect( format, fileIn ); которая, как я понял, читает format, который, в свою очередь, будет разного размера в зависимости от типа закодированного звука (см. комментарии в XA2_SoundSample.h). И ещё я не понял что такое amplitude и зачем оно нужно. Теоретически, т.к. здесь хранится заголовок waveFmt_t от .WAV, то можно собрать .WAV файл. Практически - как ты видишь звук побит на блоки и с тем же IMA ADPCM всё не так просто. |
Siberian GRemlin, | ||
Упрощённая версия | Сейчас: 21st August 2024 - 09:21 |