Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
 | 
	| 21.11.2010 15:26 | 
	
		
	 | 
	
		
		Дьякон 
 
 
		
		
		
			
			
			 
			
Posts: 395 
	
		
	 | 
	
		
			
			 
			
				PROCEDURE Damage_stack; ASSEMBLER; {$FRAME-} 
 
Приведи вид данной процедуры в отладчике
			 
			
			
  
Страус труп (с) Бьерн
			
		 |  
	 
 | 
	| 21.11.2010 16:17 | 
	
		
	 | 
	
		
		Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
 | 
	| 21.11.2010 16:54 | 
	
		
	 | 
	
		
		GhostManSD 
 
 
		
		
		
			
			
			
 
 
			
Posts: 1054 
	
		
	 | 
	
		
			
			 
			
				Подскажите, пожалуйста, такую вот вещь: в DL кнока с номером 30721 реагирует на нажатие Esc, закрывая окно. Возможно ли сделать так, чтобы кнопка с номером 30720 реагировала так же на Enter?
			 
			
			
  
Κακῆς ἀπ' ἀρχῆς γίγνεται τέλος κακόν.
			
		 |  
	 
 | 
	| 21.11.2010 19:17 | 
	
		
	 | 
	
		
		Дьякон 
 
 
		
		
		
			
			
			 
			
Posts: 395 
	
		
	 | 
	
		
			
			 
			
				 (21.11.2010 16:54)Berserker Wrote:  
Code: 
 код процедуры на асме, указанный в сорцах 
RET
  
 
тогда что с esp ?
			  
			
			
  
Страус труп (с) Бьерн
			
		 |  
	 
 | 
	| 21.11.2010 20:08 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				Вот так выглядит место, где он вызывается: 
Code: 
 .text:0044008E lea     ecx, [ecx+edx+1C4h] 
.text:00440095 loc_440095: 
.text:00440095 call    loc_3C91070 
.text:0044009A loc_44009A: 
.text:0044009A mov     esi, eax
  
Вот как выглядит сам код:
 
Code: 
 Damage_s:03C91070 loc_3C91070: 
Damage_s:03C91070 mov     eax, ds:dword_890AD8 
Damage_s:03C91075 shr     eax, 1Fh 
Damage_s:03C91078 test    eax, eax 
Damage_s:03C9107A jnz     short loc_3C91085 
Damage_s:03C9107C mov     eax, offset sub_4E7230 
Damage_s:03C91081 call    eax ; sub_4E7230 
Damage_s:03C91083 jmp     short $+2 
Damage_s:03C91085 
Damage_s:03C91085 loc_3C91085: 
Damage_s:03C91085 push    offset loc_44009A 
Damage_s:03C9108A retn
  
Перед вызовом ESP = 0x00228CF0, а после 0x00228CEC.
			  
			
			
			
		 |  
	 
 | 
	| 21.11.2010 20:23 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				
LIBRARY HookDamage; 
{!INFO 
MODULENAME = 'Damage' 
VERSION = '1.0' 
AUTHOR = 'Sav' 
} 
 
USES Win, Utils, SysUtils, VPUtils; 
 
CONST    (* HookCode constants *)    C_HOOKTYPE_JUMP = FALSE;    C_HOOKTYPE_CALL = TRUE;    C_OPCODE_JUMP = $E9;    C_OPCODE_CALL = $E8;    C_UNIHOOK_SIZE = 5; 
 
TYPE 
THookRec = RECORD    Opcode: BYTE;    Ofs: INTEGER; 
END; 
 
VAR 
Temp: INTEGER; 
 
PROCEDURE WriteAtCode(P: POINTER; Buf: POINTER; Count: INTEGER); 
BEGIN    Win.VirtualProtect(P, Count, PAGE_READWRITE, @Temp);    Win.CopyMemory(P, Buf, Count);    Win.VirtualProtect(P, Count, Temp, NIL); 
END; 
 
PROCEDURE HookCode(P: POINTER; NewAddr: POINTER; UseCall: BOOLEAN); 
VAR    HookRec: THookRec; 
BEGIN    IF UseCall THEN BEGIN     HookRec.Opcode:=C_OPCODE_CALL;    END // .if    ELSE BEGIN     HookRec.Opcode:=C_OPCODE_JUMP;    END; // .else    HookRec.Ofs:=INTEGER(NewAddr)-INTEGER(P)-C_UNIHOOK_SIZE;    WriteAtCode(P, @HookRec, 5); 
END; 
 
 
 
//Модификация удара с флагом бить всех вокруг. 
//Вместо вычисления 8-ми атакованных позиций, проверяется каждый из 42 стеков на необходимость атаки по нему (записанную в v-переменных). 
//$890AD8 - v9501 - номера целевых стеков атакующего (побитно), $890ADC - v9502 - номера целевых стеков защищающегося (побитно). 
 
//Модификация вызова функции вычисления адреса конструкций для атакованного на определённой позиции (в функции $440030). 
//Вместо вычисления стека по позиции, смотрим в бите v-переменной, надо ли атаковать текущий проверяемый стек. 
//Если надо, возвращаем (в EAX) $699420 + 1352*номер стека + 21708, иначе 0. 
PROCEDURE Damage_stack; ASSEMBLER; {$FRAME-} 
ASM    //Если 32-й бит в v9501 = 1, модифицируем.    MOV EAX, DWORD PTR DS:[$890AD8]    SHR EAX, 31    TEST EAX, EAX    JNZ @@Modify         //Восстановление изначального кода: вызов функции, вычисляющей адрес конструкций для атакованного на определённой позиции (запись в EAX).    MOV EAX, $4E7230    CALL EAX    JMP @@Exit        //Модифицирование кода: проверка, надо ли атаковать текущий стек и запись адреса его конструкций или 0 в EAX.    @@Modify:        @@Exit:    PUSH $44009A 
END; 
BEGIN    HookCode(POINTER($440095), @Damage_stack, C_HOOKTYPE_JUMP); 
END. 
Скомпилированная:  удалено за ненадобностью.
			  
			
			
			
				
(This post was last modified: 24.11.2010 23:15 by Sav.)
 
			 
		 |  
	 
 | 
	| 21.11.2010 20:32 | 
	
		
	 | 
	
		
		Дьякон 
 
 
		
		
		
			
			
			 
			
Posts: 395 
	
		
	 | 
	
		
			
			 
			
				ну так блин  
call    loc_3C91070 
 
C_HOOKTYPE_JUMP
			 
			
			
  
Страус труп (с) Бьерн
			
		 |  
	 
 | 
	| 21.11.2010 21:20 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				А как это исправить? 
Я не умею создавать "каркас" dll - его я тупо скопировал с MoP-овского исходника.
 
Code: 
 HookCode(POINTER($440095), @Damage_stack, C_HOOKTYPE_JUMP);
  
Тут и так C_HOOKTYPE_JUMP. И он равен False, как и в исходниках Эры.
			  
			
			
			
				
(This post was last modified: 21.11.2010 21:33 by Sav.)
 
			 
		 |  
	 
 | 
	| 21.11.2010 21:30 | 
	
		
	 | 
	
		
		Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
 | 
	| 21.11.2010 21:33 | 
	
		
	 | 
	
		
		Дьякон 
 
 
		
		
		
			
			
			 
			
Posts: 395 
	
		
	 | 
	
		
			
			 
			
				та нифига перехват сделан call - ом 
 
раньше было  
.text:00440095                 call    sub_4E7230 
 
а стало  
 
call loc_3C91070 
 
почувствуй разницу. откуда в геройской секции такие адреса могут быть?
			 
			
			
  
Страус труп (с) Бьерн
			
				
(This post was last modified: 21.11.2010 21:37 by Дьякон.)
 
			 
		 |  
	 
 | 
	| 21.11.2010 21:35 | 
	
		
	 | 
	
		
		Berserker 
 
 
		
		
		
			
			
 
 
			
 
 
			
Posts: 16788 
	
		
	 | 
	
		
 | 
	| 21.11.2010 21:43 | 
	
		
	 | 
	
		
		Sav 
 
 
		
		
		
			
			
			 
			
Posts: 2180 
	
		
	 | 
	
		
			
			 
			
				Должна вызываться при ударе существа с флагом "бить всех вокруг". У меня при ударе горыныча вызывалась.
			 
			
			
			
				
(This post was last modified: 21.11.2010 21:45 by Sav.)
 
			 
		 |  
	 
 | 
	| 21.11.2010 21:45 | 
	
		
	 | 
	
		
		Дьякон 
 
 
		
		
		
			
			
			 
			
Posts: 395 
	
		
	 | 
	
		
			
			 
			
				Не пойму откуда call  взялся. В исходниках вроде все правильно.
			 
			
			
  
Страус труп (с) Бьерн
			
		 |  
	 
 | 
	| 21.11.2010 21:46 | 
	
		
	 |