| Berserker   
   
   Posts: 16785
 
 |  | 
	| 21.11.2010 15:26 |  | 
	
		| Дьякон   
 Posts: 395
 
 | 
			| 
 
				PROCEDURE Damage_stack; ASSEMBLER; {$FRAME-}
 Приведи вид данной процедуры в отладчике
 
 Страус труп (с) Бьерн
 |  | 
	| 21.11.2010 16:17 |  | 
	
		| Berserker   
   
   Posts: 16785
 
 |  | 
	| 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: 16785
 
 |  | 
	| 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: 16785
 
 |  | 
	| 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 |  |