IPB

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

История благодарностей участнику Grom PE ::: Спасибо сказали: 98 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
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]
MKVToolNix GUI v10.0.0 ('To Drown In You')
Latest version of MKVToolNix with Windows XP support.
Последнюю версию они компилируют с 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;

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;
}
[/cut]
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 после перехода на другой движок уже столько версий циферок сменила, а пользоваться всё ещё нельзя. Так и живу — для более-менее приличных сайтов использую Opera 12, а для новомодных - Iron.

А 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=-,

2 Страниц V  1 2 >
Упрощённая версия Сейчас: 2nd September 2026 - 08:18