Wake of Gods Forum | Форум Во Имя Богов

Full Version: Программирование ВОГ
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9
packa, чистый dll метод предполагает изменение ехе только для подгрузки этой длл, это пара десятков байт.
Можно сделать мини-Эру для Сода с поддержкой загрузки плагинов из папки и без других фич.
К сожалению подгрузкой просто длл не всегда можно справиться со всеми задачами.
Quote:К сожалению подгрузкой просто длл не всегда можно справиться со всеми задачами.
Назови хоть одну задачу.
Например нужно обрабатывать результаты какой-нибудь функции. При этом прописывая код начиная с команды retn ты затираешь кодом нижеследующую процедуру.
Банальный перехват до ret с несколькими командами на твою функцию в DLL, в которой реализуется двухуровневый обработчик:

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

2) Уровень твоего высокоуровневого обработчика.
(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) Уровень твоего высокоуровневого обработчика.

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

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

А теперь мой вариант:
20 строк кода и новая секция. Далее нужно лишь вычислить offset для jmp и заменить команду ret. Переходим в новую сецию. Для заполнения новой секции воспользуемся удобным масмом (а не асмом встроенном в с++). Создаем объектный файл, указываем линкеру путь к этому файлу, описываем процедуру и memcpy записывает нужный нам код в секцию, который мы без труда, без глубокого вникания в опкоды написали на масме.
Добавлено:
В общем спор бессмысленный. Каждый останется при своем мнении. Я много чего пробовал и вышепредложенные варианты меня не устроили. Пишу так как удобно и быстрее вот и все. Я исходники выложу, захотите исправляйте в соответствии с вашими взглядами )))))
Приведи хоть один адрес и нужный перехватчик. Я приведу тебе полный код. У ЗВС такого кода былоьше 30 тыс. строк, у меня в эре перехватчиков больше 20, включая возвратные.
Дьяк поставил задачу написать перехватчик 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;
И на с++ 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
  }
}
вроде суть перехвата и подмены понял и оценил
только вот я в жизни не создал ни одной длл и проект полностью себе не представляю
куда мне пихать вызовы HookCode (в примере Берсекера), в DllMain ?

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

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

Костяк DLL в принципе шаблонный.
baratorch пишет на С (или С#), так что VP.EXE ему не поможет.
Pages: 1 2 3 4 5 6 7 8 9
Reference URL's