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