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