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.)