Berserker
Posts: 16657
|
|
25.02.2010 23:16 |
|
Berserker
Posts: 16657
|
|
25.02.2010 23:34 |
|
Дьякон
Posts: 395
|
К сожалению подгрузкой просто длл не всегда можно справиться со всеми задачами.
Страус труп (с) Бьерн
|
|
25.02.2010 23:47 |
|
Berserker
Posts: 16657
|
|
25.02.2010 23:58 |
|
Дьякон
Posts: 395
|
Например нужно обрабатывать результаты какой-нибудь функции. При этом прописывая код начиная с команды retn ты затираешь кодом нижеследующую процедуру.
Страус труп (с) Бьерн
|
|
26.02.2010 00:13 |
|
Berserker
Posts: 16657
|
|
26.02.2010 00:17 |
|
asm
Posts: 29
|
(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 |
|
Дьякон
Posts: 395
|
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 |
|
Berserker
Posts: 16657
|
|
26.02.2010 00:38 |
|
Berserker
Posts: 16657
|
Дьяк поставил задачу написать перехватчик 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 |
|
GrayFace
Posts: 1233
|
И на с++ При условии, что в 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 |
|
baratorch
Posts: 197
|
вроде суть перехвата и подмены понял и оценил
только вот я в жизни не создал ни одной длл и проект полностью себе не представляю
куда мне пихать вызовы HookCode (в примере Берсекера), в DllMain ?
и каков код самой HookCode??
В екзешник героев мне надо будет вставить вызов LoadLibrary моей длл, так?
|
|
26.02.2010 17:55 |
|
SAG
Posts: 173
|
|
26.02.2010 18:02 |
|
Berserker
Posts: 16657
|
|
26.02.2010 19:10 |
|
etoprostoya
Posts: 1809
|
baratorch пишет на С (или С#), так что VP.EXE ему не поможет.
|
|
26.02.2010 19:14 |
|