Добро пожаловать, гость ( Вход | Регистрация )
| Дата поста: | В теме: | За сообщение: | Спасибо сказали: | ||
|---|---|---|---|---|---|
| Jul 19 2026, 13:41 | Патчим MageSlayer с помощью fasmg | QUOTE(-=CHE@TER=- @ Jul 19 2026, 10:02) [snapback]4939[/snapback] можно по одному файлу заменять, смотреть что поменялось Так и думаю сделать, когда дойду в игре до глючного места.QUOTE В версии 1.00 и 1.1 только эти файлы меняются? Исполняемый файл тот же самый? mageslay.exe тоже меняется, я изучал и патчил только 1.1. Не считая того, что no-cd подсмотрел из различий от 1.0 патченного и оригинала. |
-=CHE@TER=-, | ||
| Jul 19 2026, 11:23 | Патчим MageSlayer с помощью fasmg | С помощью худо-бедно скомпилированного vpack: https://web.archive.org/web/19980502215605/...files/vpack.cpp выяснил, что версии 1.0 и 1.1 mage.vpk различаются следующими файлами внутри: MAPS/DEATH3.VBM MAPS/KEEP4.VBM MAPS/SEWSCRT1.VBM MAPS/TEMPLE4.VBM MAPS/TEMPLEBS.VBM MAPS/TMPSCRT1.VBM MAPS/TMPSCRT2.VDT MAPS/TOMB2.VBM Пока неясно, что с этим делать. В архиве с исходниками утилит https://web.archive.org/web/19980502215645/...es/rtsource.zip ещё есть bspbin.c, который эти VBM только генерирует. |
-=CHE@TER=-, | ||
| Jul 19 2026, 10:36 | Патчим MageSlayer с помощью fasmg | Некто мне напомнил о существовании такой игры, как MageSlayer. Пожаловался на управление, а я помнил только, что нравилась игра, а про управление негативных впечатлений не осталось. Решил скачать и проверить. И что же я увидел? Вид сверху, бег можно настроить, чтоб WASD слал на все четыре стороны, настройка "tank strafe". А вот с мышью не заладилось. Игра умеет только воспринимать движение вверх-вниз, как бег вперёд-назад, а влево-вправо — как поворот. Так дело не пойдёт, решил я, и пропатчил игру, чтоб курсор мыши был точкой, куда смотрит персонаж. Теперь играется, словно современная игра. Попрактиковался с fasmg, где макросы для патчинга стали ещё проще, чем это требовалось в fasm 1, попрактиковался с Ghidra и x87 FPU. Игру берём отсюда: https://www.old-games.ru/game/496.html Дисковую версию, после патча до 1.1. Пока сильно не играл, на форуме old-games.ru говорят, что версия 1.1 портит прохождение, это ещё надо изучить. А вот версия 1.0 крашится при перемещении на первую локацию, если разрешение игры не 640x480x8. Что сделано: - пропатчил вызовы ShowCursor, чтоб курсор никогда не скрывался - пропатчил вызов SetCooperativeLevel, где был бит DISCL_EXCLUSIVE, чтоб курсор мыши не захватывался эксклюзивно, и опять же не скрывался из-за этого же - пропатчил место, где движения мыши вызывали движение и поворот персонажа - уникального значения "угол поворота персонажа" я не нашёл, поэтому пришлось обходным путём: нашёл место, где читается угол поворота разных объектов на уровне, а если вызов происходит из конкретной функции, то это персонаж, записываем угол. - используя текущий угол персонажа и положение курсора на экране, вычисляем скорость поворота, которую надо отправить в сетевой пакет. - чтоб поворот не случился больше нужного, заставляем функцию проверки ввода от мыши вызываться каждый кадр, а не только если координаты изменились Проверял на Wine 10.5, виртуалке Windows 2000 SP2, Windows XP SP3. Итак, вот мой патч: CODE ; mouse targeting patch for MageSlayer v1.1 ; use fasmg to assemble against mageslay.exe, sha256=1a970cd3d2d5065a93cdd1ee0b9fe370d0df107efbf3e4a2f1d4a9a47abfe8a7 format binary as 'exe' include 'p6.inc' calminstruction align? boundary,value:? compute boundary, (boundary-1)-((0 scaleof $)+boundary-1) mod boundary arrange value, =db boundary =dup value assemble value end calminstruction file 'mageslay.exe' macro patch cmd match =at= vaddr= =to= paddr,cmd offs = paddr virtual at vaddr end macro macro end?.patch! load mover:$ - $$ from $$ store mover:lengthof mover at :offs end virtual end match end macro use32 if $ <> 1121792 err 'wrong mageslay.exe version, if 1.0, patch to 1.1 first!' end if new_ep_rva = new_ep - 0x400000 store dword new_ep_rva at :0xA8 store dword 0xD9800 at :0x180; more space for code in .text store dword 0x01400 at :0x1F8; more space for data in .idata patch at 0x428FF4 to 0x283F4 jmp get_angle_of_object end patch patch at 0x42AC39 to 0x2A039 jmp go_catch_the_flag end patch store byte 0xEB at :0x352F8; no-cd ;patch at 0x4375DB to 0x369DB; original printf is broken?.. ; patch05:: ; push 1.1 ;end patch store byte 4 at :0x3A7CE; remove exclusive mouse access patch at 0x46CBBA to 0x6BFBA; make it always check for mouse input instead of only when moved, fixes spinning around jmp $+13 end patch patch at 0x46CC2C to 0x6C02C jmp handle_mouse_input end patch store "Version: 1.1mf":14 at :0xE65A8 label ShowCursor dword at 0x5A45CC label user32_dll dword at 0x4DCDB0 label LoadLibraryA dword at 0x5A4488 label GetProcAddress dword at 0x5A451C label str_percent_d at 0x4E3A6F label printf_to_console at 0x4132A0 label main_hwnd dword at 0x547F84 label GetClientRect dword at 0x5A4604 patch at 0x4DA6D8 to 0xD9AD8 disabled_ShowCursor: xor eax,eax ret 4 align 16, 0x90 new_ep: mov eax,disabled_ShowCursor mov [ShowCursor],eax push GetCursorPos push user32_dll call [LoadLibraryA] push eax call [GetProcAddress] mov [GetCursorPos],eax jmp 0x4A8060 ; align 16, 0x90 ;debug_print_float32: ; push eax ; fld dword [esp] ; push 10 ; fild dword [esp] ; fmulp st(1),st(0) ; fistp dword [esp] ; pop eax ; add esp,4 ; align 16, 0x90 ;debug_print_int32: ; push eax ; push str_percent_d ; call printf_to_console ; add esp,8 ; ret align 16, 0x90 go_catch_the_flag: xor ecx,ecx inc ecx mov [catch_flag],ecx call 0x427300; original func jmp 0x42AC3E; original place align 16, 0x90 get_angle_of_object: mov ecx,[catch_flag] test ecx,ecx jz no_catch mov ecx,[edx+eax*4] mov [current_angle],ecx xor ecx,ecx mov [catch_flag],ecx no_catch: jmp 0x42A0DC; original place handle_mouse_input: call 0x416B20; original func xor eax,eax mov [esp+0x38],eax; zero out forward/backward speed ; mov [esp+0x34],eax; zero out turning speed push CursorPos_point call [GetCursorPos] mov eax,[main_hwnd] push GetClientRect_rect push eax call [GetClientRect] mov eax,[CursorPos_point+4] mov edx,[GetClientRect_rect+12] shr edx,1 sub edx,eax push edx fild dword [esp] mov eax,[CursorPos_point] mov edx,[GetClientRect_rect+8] shr edx,1 sub eax,edx push eax fild dword [esp] fpatan fld [current_angle] fsubp st(1),st(0) fldpi fadd st(0),st(0) fxch st(1) fprem1 fstp st(1) push 0x40000; turning speed multiplier fimul dword [esp] add esp, 12 fistp dword [esp+0x34] jmp 0x46CC31; original place if $ >= 0x4DA800 err 'code too big, not enough space!' end if end patch patch at 0x5A5260 to 0xF3460 catch_flag dd 0; set to 1 if current object is player current_angle dd 0 label GetCursorPos dword db 'GetCursorPos',0 align 4 CursorPos_point: dd 0,0 GetClientRect_rect: dd 0,0,0,0 if $ >= 0x5A5400 err 'data too big, not enough space!' end if end patch |
-=CHE@TER=-, | ||
| Apr 6 2018, 14:21 | Delphi, Asm, C, WinAPI, PHP, ... | QUOTE(-=CHE@TER=- @ Apr 6 2018, 19:34) [snapback]4336[/snapback] Я понимаю что, возможно, ты кроссплатформенностью не особо заморачиваешься, но мне в принципе было интересно обсудить возможное универсальное решение. Кроссплатформенность — это хорошо и правильно. Но в случае с GCC, как и с другими особенно юниксово-идеологическими вещами, под кроссплатформенностью почему-то понимается не подстроиться под новую исполняемую среду, а притащить пол-юникса за собой, частью чего вот такая внезапная подстановка "*" и является. И такой подход вызывает отвращение. |
-=CHE@TER=-, | ||
| Mar 29 2018, 16:38 | Delphi, Asm, C, WinAPI, PHP, ... | Проблемы с файлами, начинающимися с "-" в винде как таковой нет, потому что маски файлов подставляются программой, а не исполняющей средой, и нет опасности, что при вызове команды "myprog *" встанет файл, превратившийся в ключ "уничтожить всё". Лично я предпочитаю, чтоб ключи начинались с "-". Если очень надо файл "-something.txt", можно его указать программе как "?something.txt*. Проблема тут может быть в том, что в программах, обрабатывающих только один файл, авторы часто забывают сделать раскрытие масок. А в линуксах для одиночного файла принято использовать stdin/stdout, что тоже обходит проблему с минусовым файлом. (добавлено:) А, можно же ещё относительно текущей директории указывать: ".\-something.txt" |
-=CHE@TER=-, | ||
| Sep 19 2017, 18:37 | Прогресс и программы | QUOTE(-=CHE@TER=- @ Sep 19 2017, 16:53) [snapback]4262[/snapback] Последнюю версию они компилируют с Qt 5.9, а Qt после 5.6 поломал поддержку Windows XP. Сейчас весь Qt-шный софт сползает.В исходниках проекта пишут, что можно скомпилировать с Qt 5.3. |
-=CHE@TER=-, Corak, | ||
| Jun 2 2016, 10:39 | FireFox: addons, extensions, tweaks, etc. | Не знаю насчёт просто AdBlock, но Adblock Plus давно имеет некий белый список конкретных спонсоров. По-моему пора все эти адблоки выкинуть и пользоваться uBlock Origin. |
-=CHE@TER=-, Siberian GRemlin, | ||
| May 1 2016, 22:42 | Strippers | QUOTE(-=CHE@TER=- @ May 2 2016, 03:51) [snapback]4065[/snapback] Единственная проблема, которую обнаружил с "advzip.exe" - даты без учёта часового пояса почему-то сохраняются. Действительно. Предлагаю три варианта: 1. Создавать архив без сжатия, а этой утилитой пережимать; 2. Поменять в исходниках в zip.cc time2zip() вызов gmtime на localtime и скомпилировать; 3. Пропатчить вызов gmtime на localtime в бинарнике (он там третий по счёту, 0xB701: 7B → 2B). |
-=CHE@TER=-, | ||
| Apr 30 2016, 16:21 | Strippers | -=CHE@TER=-, если ты хочешь ещё большего уровня сжатия, чем kzip, лучше не перебирать случайные таблицы в нём, а воспользоваться алгоритмом zopfli, который сейчас лучше всех жмёт DEFLATE. Для zip утилита с этим алгоритмом называется AdvanceComp/advzip. |
-=CHE@TER=-, | ||
| Mar 6 2016, 12:39 | Delphi, Asm, C, WinAPI, PHP, ... | QUOTE(-=CHE@TER=- @ Mar 6 2016, 15:12) [snapback]4041[/snapback] У меня компьютер старый. Уже где-то на форуме обсужалось, для работы хватает, обновлять не хочу. Комп ещё более тормозной, чем мой постоянно перегретый нетбук? Сожалею.Насколько я помню, я перешёл на Far 3 из-за поддержки UTF-8. QUOTE Не, ты не понял - в просмотрщике же нет курсора. Как ты там будешь что-то писать или указывать? Так можно диалогами обойтись, окошком ввода да окошком сообщения результата. Или объединить их.QUOTE Если у тебя все файлы будут одного формата - тогда да. А так-то структура файлов разная. Под какой надо формат, под тот и написать (отредактировать). Я ради интереса написал скрипт для прыжков по 4-байтному смещению в просмотрщике:[cut=Viewer_HexJump.lua] CODE local prevpos = nil; [/cut]local function hexjump() local start = viewer.GetInfo(nil).FilePos; prevpos = start; -- Get first bytes of the hex view local str = ReadConsoleOutputCharacter(12, 1, 24); local strb = str:gsub("[^0-9A-F]", ""):sub(1, 8); -- 4 bytes local offset = 0; for i = #strb - 1, 1, -2 do offset = offset * 256 + tonumber(strb:sub(i, i+1), 16); end; viewer.Select(nil, offset, 4); end; local function prehexjump() far.Timer(0, function(self) self:Close(); hexjump() end); end; local function backjump() if prevpos ~= nil then viewer.Select(nil, prevpos, 4); end; end; MenuItem { menu = "Plugins"; area = "Viewer"; guid = "CFBC01BA-342A-409F-A2B7-DAF874A84680"; text = "HexJump to 4-byte offset"; action = function(target, item) local F = far.Flags; local mode = Viewer.State; local needsrefresh = false; if band(mode, 0x20) == 0 then viewer.SetMode(nil, {Type=F.VSMT_VIEWMODE, iParam=F.VMT_HEX}); needsrefresh = true; end; if needsrefresh then mf.postmacro(prehexjump); else mf.postmacro(hexjump); end; end; } Macro { description="Go to previous position before HexJump"; area="Viewer"; key="BS"; flags=""; action = function() mf.postmacro(backjump); end; } QUOTE Не, HIEW'ом-то я как раз пользуюсь, но только для редактирования файлов, а если быстро нужно что-то посмотреть/проверить, то из FAR никуда не ухожу - открыл файл на просмотр и какой-нибудь текстовичок для записи, а дальше Ctrl+Tab или через F12 переключаюсь. Я повесил HIEW на Alt+F4 (хех), и использую для просмотра тоже, удобно же. А сейчас только что обнаружил фичу "console detach key" в Far'е, а то всё время грустил, что для заметок нужно второе окно Far'а открывать. |
-=CHE@TER=-, | ||
| Mar 3 2016, 21:38 | Delphi, Asm, C, WinAPI, PHP, ... | QUOTE(-=CHE@TER=- @ Mar 4 2016, 03:44) [snapback]4029[/snapback] Калькулятор этот при всех достоинствах адово часто падает [...] А почему бы не заменить этот calc скриптами на Lua? Я в восторге от скриптов.В общем, если кто-то знает как это исправить - с удовольствием выслушаю, ибо задолбало. Сейчас взял и опубликовал свои наработки: https://grompe.org/#far_scripts.zip После установки скриптов можно будет делать так: CODE 0xFF + 14 (Ctrl+Enter на строке)CODE 0xFF + 14=269 Или если нравится, F11 → "Execute Lua on Selection" → "0xFF + 14" введёт в редактор 269. |
-=CHE@TER=-, | ||
| Aug 27 2015, 13:25 | Прогресс и программы | QUOTE(Siberian GRemlin @ Aug 27 2015, 14:04) [snapback]3924[/snapback] Какие? Слышал что-то про «Halo 2», но сам не пробовал. Те, что вместе с Вистой шли. Обновлённый сапёр, пасьянс там, новые игры. |
-=CHE@TER=-, | ||
| Aug 27 2015, 05:20 | Прогресс и программы | QUOTE(-=CHE@TER=- @ Aug 26 2015, 02:31) [snapback]3920[/snapback] Ну, ты смог отделаться лёгкой кровью, а в FileZilla там какие-то функции из kernel32.dll, которых в Windows XP ещё не было (GetFinalPathNameByHandleW, InitializeConditionVariable, SleepConditionVariableCS, WakeConditionVariable и какая-то библиотека Normaliz.dll с одной единственной функцией IdnToAscii), а заморачиваться со вставкой мне как-то не особо хотелось. С целым рядом отсутсвующих функций уже проще какой-нибудь загрузчик написать, либо сделать подмену библиотек. Эдакий KernelEx, только для Windows XP вместо Windows 98. Ну и игры от Висты в XP же переносили. Рано или поздно такая утилита должна появиться, энтузиастов старых ОС много. |
-=CHE@TER=-, Siberian GRemlin, | ||
| Aug 25 2015, 11:46 | Прогресс и программы | Зачастую программы не работают под XP только потому, что новый MSVC тупо ставит минимальную версию подсистемы 6.0 (Vista и выше) в заголовке exe-шников. Собственноручно заставил одну программу запуститься под XP без официальной поддержки, исправив все заголовки в .exe и прилагающихся .dll на 5.0, правда, одной dll пришлось всунуть внутрь код функции InterlockedCompareExchange64, которой нет в XP. |
-=CHE@TER=-, Siberian GRemlin, | ||
| Dec 16 2013, 03:45 | Spacebase DF9 | Да, с подставленным заголовком DDS в расжатые zlib-данные показывает картинку. Тут либо DXT3, либо DXT5. |
Siberian GRemlin, | ||
| Nov 3 2013, 06:24 | Opera 9.xx | Presto закопать и не дать исходников — обидно и несправедливо. Сначала отнекивались чем-то вроде "это ж ещё надо усилия тратить, откомментировать, поддерживать, чтоб нормально выложить", потом нашлась причина — у них движок Nintendo лицензирован и не хочется их, родных, подставлять. Opera после перехода на другой движок уже столько А Web Standards Project так иронично и кстати разбежались, не доделав тест на стандарты Acid4. Интересно, что будет в итоге? Firefox сдастся и тоже станет хромом? |
-=CHE@TER=-, | ||
| Jun 27 2013, 11:00 | Уголок параноика | Вместо Chrome лучше пользоваться Iron, это Chromium, которому стучалку вырезали. > какие-нибудь корпоративные документы Такие исключительно по внутренней сети и внутренним протоколам должны пересылаться (например, через локальный джаббер-сервер). Доверять подобное скайпу — себе искать приключений. > Теоретически кто-нибудь может создать "левый" супер-нод и каким-нибудь образом расшифровать траффик через него. Да что там суперноды и китайцы, уже давно всё перехвачено, от P2P там мало что осталось. |
-=CHE@TER=-, | ||
| Jun 23 2013, 21:23 | HTTP sniffer | Да, я использовал этот Fiddler2 для перехвата https в Java-программе. Нужно было поставить его поддельный корневой сертификат в систему и кое-что там скриптом прописать. После работы удалил сертификат. А скрипт такой, чтоб сертификат удовлетворял домену: CODE static function OnBeforeRequest(oSession: Session) { ... // MY ADDITIONS // ============ oSession["x-OverrideCertCN"] = oSession["https-Client-SNIHostname"]; |
-=CHE@TER=-, useretail, | ||
| Jul 30 2012, 16:37 | CheckSum | QUOTE Grom PE!Версия 0.27 на FTP - можешь её пересобрать?И ещё файл history.en.txt - я в буржуйском не силён, а в русском написал, что изменил. Скомпилил, английскую историю дописал, все дела на FTP. |
-=CHE@TER=-, | ||
| May 13 2012, 13:46 | HTTP sniffer | Ещё есть примочки для браузера типа https://addons.mozilla.org/en-US/firefox/addon/tamper-data/ |
-=CHE@TER=-, Siberian GRemlin, | ||
| May 13 2012, 11:31 | HTTP sniffer | А цель какая? Если нужно перехватывать трафик любой программы, то тут в систему как-то надо встраиваться. Я для таких дел использую CommView, кстати. А если просмотреть трафик контролируемой программы, браузера, скажем, то можно и обойтись чем-нибудь типа прокси с логгированием: http://mitmproxy.org/ |
Siberian GRemlin, | ||
| Apr 19 2012, 19:05 | Delphi, Asm, C, WinAPI, PHP, ... | Сам у себя встречал такие файлы. Полюбопытствовал, что и как. Выяснилось, что можно взять и применить регу: CODE REGEDIT4 Тогда ни одна программа не будет создавать эти файлы.[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib] "Disable Performance Counters"=dword:00000001 А последствия - монитор производительности системы ничего не будет показывать. |
-=CHE@TER=-, Siberian GRemlin, | ||
| Mar 24 2012, 20:13 | Замена системных модулей для Delphi | QUOTE Нафиг тогда такого монстра. Так нас же VCL не интересует, а совершенно голый проект должен быть таких же размеров, как и с Delphi 7.QUOTE Запросто - посмотри сколько раз в .EXE файле будет встречаться строчка, если раскоментарить define для STDWAY: Три раза, но в юникоде %)Вот что нового со времён Delphi 7, вычитал из документов и интернета: - multi-unit namespaces (Vcl.Forms, System.SysUtils, etc.) - for ... in ... do loops - Exit(Result) - inline functions - operator overloading - class helpers - strict private, strict protected - constructors, operator overloading, static methods and properties in records - class: abstract, sealed, const, type, var, property - nested classes - final virtual methods - other code optimizations (?) - generics - anonymous methods - {$SETPEFLAGS 1} = no relocs - {$POINTERMATH}, {$RTTI}, {$SCOPEDENUMS} - new warnings - strings and APIs are unicode by default - enhanced RTTI (reflection, RTTI.pas) - libraries, frameworks, all those bells and whistles - 64-bit compilation - Mac OSX compilation - COFF .OBJ support |
-=CHE@TER=-, | ||
| Mar 23 2012, 20:45 | Замена системных модулей для Delphi | Набрёл на Embarcadero RAD Studio XE2 with Update 4, буду ковыряться в системных модулях Delphi этого чуда. Что нового в языке, обозначено тут: http://edn.embarcadero.com/article/images/...ture_Matrix.pdf Хотя не уверен, с какой версией это сравнение. Стоящее дело? |
-=CHE@TER=-, | ||
| May 6 2010, 02:16 | Замена системных модулей для Delphi | QUOTE(-=CHE@TER=- @ May 3 2010, 18:08) [snapback]2916[/snapback] Или тогда вопрос к Grom PE ты можешь в DCC32HACK как-нибудь перехватить работу с SetLength()?.. Похоже, это надо копаться в механизме RTTI и выискивать обращение к именам. Посмотрю как-нибудь.. |
-=CHE@TER=-, | ||
1 2 >
| Упрощённая версия | Сейчас: 2nd September 2026 - 08:18 |