| Berserker   
   
   Posts: 16785
 
 |  | 
	| 25.02.2010 23:16 |  | 
	
		| Berserker   
   
   Posts: 16785
 
 |  | 
	| 25.02.2010 23:34 |  | 
	
		| Дьякон   
 Posts: 395
 
 | 
			| 
 
				К сожалению подгрузкой просто длл не всегда можно справиться со всеми задачами.
			 
 Страус труп (с) Бьерн
 |  | 
	| 25.02.2010 23:47 |  | 
	
		| Berserker   
   
   Posts: 16785
 
 |  | 
	| 25.02.2010 23:58 |  | 
	
		| Дьякон   
 Posts: 395
 
 | 
			| 
 
				Например нужно обрабатывать результаты какой-нибудь функции. При этом прописывая код начиная с команды retn ты затираешь кодом нижеследующую процедуру.
			 
 Страус труп (с) Бьерн
 |  | 
	| 26.02.2010 00:13 |  | 
	
		| Berserker   
   
   Posts: 16785
 
 |  | 
	| 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: 16785
 
 |  | 
	| 26.02.2010 00:38 |  | 
	
		| Berserker   
   
   Posts: 16785
 
 | 
			| 
 
				Дьяк поставил задачу написать перехватчик 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: 16785
 
 |  | 
	| 26.02.2010 19:10 |  | 
	
		| etoprostoya   
 Posts: 1809
 
 | 
			| 
 
				baratorch пишет на С (или С#), так что VP.EXE ему не поможет.
			 |  | 
	| 26.02.2010 19:14 |  |