Current time: 25.11.2024, 09:08 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Программирование ВОГ
Author Message
Berserker Offline
Administrators

Posts: 16657
Post: #16

packa, чистый dll метод предполагает изменение ехе только для подгрузки этой длл, это пара десятков байт.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
25.02.2010 23:16
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #17

Можно сделать мини-Эру для Сода с поддержкой загрузки плагинов из папки и без других фич.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
25.02.2010 23:34
Find all posts by this user Quote this message in a reply
Дьякон Offline

Posts: 395
Post: #18

К сожалению подгрузкой просто длл не всегда можно справиться со всеми задачами.


Страус труп (с) Бьерн
25.02.2010 23:47
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #19

Quote:К сожалению подгрузкой просто длл не всегда можно справиться со всеми задачами.
Назови хоть одну задачу.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
25.02.2010 23:58
Find all posts by this user Quote this message in a reply
Дьякон Offline

Posts: 395
Post: #20

Например нужно обрабатывать результаты какой-нибудь функции. При этом прописывая код начиная с команды retn ты затираешь кодом нижеследующую процедуру.


Страус труп (с) Бьерн
26.02.2010 00:13
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #21

Банальный перехват до ret с несколькими командами на твою функцию в DLL, в которой реализуется двухуровневый обработчик:

1) Уровень асма
PUSHAD
PUSHFD
...получить параметры
...вызвать высокоуровневый обработчик
POPFD
POPAD
...выполнить затёртые команды, что были до RET
RET

2) Уровень твоего высокоуровневого обработчика.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
26.02.2010 00:17
Find all posts by this user Quote this message in a reply
asm Offline

Posts: 29
Post: #22

(26.02.2010 00:13)Дьякон Wrote:  Например нужно обрабатывать результаты какой-нибудь функции. При этом прописывая код начиная с команды retn ты затираешь кодом нижеследующую процедуру.

Можно начать раньше, а эти 5 байт повторить с своей ДЛЛ, оч удобно... у меня ДЛЛ изменяющий игру скоро будет весить больше самой игры )))) куда ж это раместишь с ехе ))))
Добавлено:
(26.02.2010 00:17)Berserker Wrote:  Банальный перехват до ret с несколькими командами на твою функцию в DLL, в которой реализуется двухуровневый обработчик:

1) Уровень асма
PUSHAD
PUSHFD
...получить параметры
...вызвать высокоуровневый обработчик
POPFD
POPAD
...выполнить затёртые команды, что были до RET
RET

2) Уровень твоего высокоуровневого обработчика.

Берс опередил....

Берсу ещё раз спасибо. Если бы не его изыскания и терпение над моими глупыми вопросами, то не было бы моего мода
(This post was last modified: 26.02.2010 00:21 by asm.)
26.02.2010 00:20
Find all posts by this user Quote this message in a reply
Дьякон Offline

Posts: 395
Post: #23

1. Результат - это eax.
2. Eax заполняется перед самым ret.
3. При вызове процедуры высокого уровня портятся регистры. Например, push esp, mov ebp, esp.
4. Выполнить затертые команды до ret? И что ты не влезишь на процедуру следующую? Где ты выиграл в размерах? Что начиная с ret, что до ret?
5. Использовать пустые места? Это время на их поиск и отладку программы, чтоб все учитывалось при патче + связь с высоким уровнем. + кто-то уже занял пустые места своим патчем и игра слетает с катушек.

А теперь мой вариант:
20 строк кода и новая секция. Далее нужно лишь вычислить offset для jmp и заменить команду ret. Переходим в новую сецию. Для заполнения новой секции воспользуемся удобным масмом (а не асмом встроенном в с++). Создаем объектный файл, указываем линкеру путь к этому файлу, описываем процедуру и memcpy записывает нужный нам код в секцию, который мы без труда, без глубокого вникания в опкоды написали на масме.
Добавлено:
В общем спор бессмысленный. Каждый останется при своем мнении. Я много чего пробовал и вышепредложенные варианты меня не устроили. Пишу так как удобно и быстрее вот и все. Я исходники выложу, захотите исправляйте в соответствии с вашими взглядами )))))


Страус труп (с) Бьерн
(This post was last modified: 26.02.2010 00:34 by Дьякон.)
26.02.2010 00:29
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #24

Приведи хоть один адрес и нужный перехватчик. Я приведу тебе полный код. У ЗВС такого кода былоьше 30 тыс. строк, у меня в эре перехватчиков больше 20, включая возвратные.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
26.02.2010 00:38
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #25

Дьяк поставил задачу написать перехватчик 0x55D102. ЕАХ - указатель на класс. Его высокоуровневая функция будет менять поля класса.

В бой:
Code:
HookCode(Ptr($55D102), @MuFuncAsm, C_HOOKTYPE_JUMP, 7);

FUNCTION MyFuncAsm; ASSEMBLER; {$FRAME-}
ASM
  // Старый код
  MOV [DWORD FS:0],ECX
  MOV ESP,EBP
  PUSHAD
  PUSHFD
  PUSH EAX
  CALL MyFunc
  POPFD
  POPAD
  // RET
END;

PROCEDURE MyFunc (Obj: PSomeObj);
BEGIN
  ShowMessage(Obj.DefName);
END;


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
26.02.2010 00:49
Find all posts by this user Quote this message in a reply
GrayFace Offline
Forum Moderators

Posts: 1233
Post: #26

И на с++ Sm При условии, что в 55D0F8 вставляется jmp
Code:
void* __stdcall LoadDefHook(void* def)
{
  return def;
}

__declspec(naked) void _LoadDefHook()
{
  __asm
  {
    mov large fs:0, ecx
    push eax
    call LoadDefHook
    push 0x55D0FF
    ret
  }
}
26.02.2010 05:57
Find all posts by this user Quote this message in a reply
baratorch Offline

Posts: 197
Post: #27

вроде суть перехвата и подмены понял и оценил
только вот я в жизни не создал ни одной длл и проект полностью себе не представляю
куда мне пихать вызовы HookCode (в примере Берсекера), в DllMain ?

и каков код самой HookCode??

В екзешник героев мне надо будет вставить вызов LoadLibrary моей длл, так?
26.02.2010 17:55
Find all posts by this user Quote this message in a reply
SAG Offline

Posts: 173
Post: #28

26.02.2010 18:02
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16657
Post: #29

baratorch, вы на чём пишите? И могли бы привести пример, что и на что нужно пропатчить? Пример сага компилируется через Era Source\BIN.W32\VP.EXE. Выходной файл в Era Source\OUT.W32\.

Костяк DLL в принципе шаблонный.


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
26.02.2010 19:10
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #30

baratorch пишет на С (или С#), так что VP.EXE ему не поможет.
26.02.2010 19:14
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group