Wake of Gods Forum | Форум Во Имя Богов

Full Version: Исследование героев
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
По-моему, лучше в хуке по адресу A запомнить значение по-адресу B, а проверять в хуке по адресу C, если я правильно понял, что тебе надо.
(03.02.2011 13:46)GhostManSD Wrote: [ -> ]На фига бряк-то? Смещай координаты просто за пределы экрана.

Или забей нопами отрисовку.
Хммм... А это как? Где искать координаты? Отрисовку?
Я же писал что делитант...
Нашел свою кнопку? Перейди на адрес, где она прописывается (в Олли: search > text references > твоя кнопка.def. Нажимаешь на ней лкм. Ты попадешь в CPU. Там рядом с названием кнопки будут прочие аргументы. Координаты находятся на пару строчек ниже (2 адреса: отступ сверху и отступ слева). Они - в шестнадцатеричном формате. Для перевода используй калькулятор Windows в инженерном режиме. Поставь большие координаты, чтобы кнопка "уехала" за пределы экрана. Вроде все.
Sav, попробую. Мне тоже приходила в голову такая мысль, но я думал, есть способ сделать без второго хука.
покажи код
Адреса для хука (точнее, для хука - верхний, а остальные прописываю для восстановления оригинальных команд); при хуке происходит вызов функции 90003 (это я уже прописал в плагине).
Code:
005CCD80  /$ 55                PUSH EBP
005CCD81  |. 8BEC              MOV EBP, ESP
005CCD83  |. 6A FF             PUSH -1
005CCD85  |. 68 575F6300       PUSH 00635F57                            ;  SE handler installation

Следующий код - тип подложки гильдии магов. Вычисляется здесь.
Code:
005CCEC5  |. 8B15 4C956900  MOV EDX, DWORD PTR DS:[69954C]
005CCECB  |. 68 00080000    PUSH 800                                 ; /Arg7 = 00000800
005CCED0  |. 8B4A 38        MOV ECX, DWORD PTR DS:[EDX+38]           ; |
005CCED3  |. 0FBE51 04      MOVSX EDX, BYTE PTR DS:[ECX+4]           ; |
005CCED7  |. 8B0C95 6CA3680>MOV ECX, DWORD PTR DS:[EDX*4+68A36C]     ; |
005CCEDE  |. 51             PUSH ECX                                 ; |Arg6

В функции 90003 игрок может установить параметр SN:X1 от -1 до 8. Если X1=-1, то значение ECX из кода №2 остается неизменным и соответствует реальному типу города. Если 0<X1<8, то устанавливается подложка соответствующего типа города.

Было бы еще здорово узнать, как эти параметры выставлять. При попытке прописать в своей dll нечто в духе MOV DWORD General.EventParams, 1 Паскаль говорит, что никакого General в природе нет.
Здесь Берс показывал мне, как использовать для передачи и приёма параметров SN:X.
ты мне свой код выложи
Code:
PROCEDURE MageGuildBackground; ASSEMBLER; {$FRAME-}
    ASM
    PUSHAD// Push all registers
    CMP DWORD [$887668], -1 // Compare -1 with v1
    JZ @@Leave
    MOV EAX, DWORD [$887668] // Move v1 to EAX
    MOV DWORD [$5CCED7], $8B0C85 // Change opcode
    MOV DWORD [$5CCED8], $68A36C // Change parameter
    POPAD // Restore all registers
    @@Leave:
    POPAD // Restore all registers

PROCEDURE HOOK_MageGuildEnter; ASSEMBLER; {$FRAME-}
    ASM
    PUSHAD // Push all registers
    CALL MageGuildBackground
    PUSH 90003 // Push function number
    MOV EAX, $74CE30 // Move $74CE30 to EAX
    CALL EAX // Call ERM-function
    ADD ESP, 4 // Add 4 to ESP
    POPAD // Restore all registers
    PUSH EBP // Push EBP
    MOV EBP, ESP // Move ESP to EBP
    PUSH -1 // Push -1
    PUSH $5CCD85 // Push $5CCD85
END; // .PROCEDURE HOOK_MageGuildEnter

BEGIN
    HookCode(POINTER($5CCD80), @HOOK_MageGuildEnter, C_HOOKTYPE_JUMP); // 90003
END.


До этого вместо MOV устанавливал через PINTEGER таким же образом значения по адресам.
А что у тебя подряд два POPAD в MageGuildBackground? Причём один то выполняется, то нет.
Ну так вроде же надо восстанавливать регистры независимо от итога. Хотя во втором случае никакие регистры вроде не меняются, так что там и правда нет нужды. Но проблема-то не в этом.
Гм. Сейчас вот на свежую голову все это посмотрел и увидел, что если вручную в Олли поменять процедуру в нужном мне адресе, получается вот что:
БЫЛО
Code:
005CCED7     8B0C95 6CA36800     MOV ECX, DWORD PTR DS:[EDX*4+68A36C]
005CCEDE     51                  PUSH ECX
005CCEDF  |. 6A 01               PUSH 1
СТАЛО
Code:
005CCED7     3E:8B0C85 6CA36800  MOV ECX, DWORD PTR DS:[EAX*4+68A36C]
005CCEDF  |. 6A 01               PUSH 1
Выходит, происходит сдвиг, и команда PUSH ECX затирается. Как бороться?
Если что-то затирается, надо в конце процедуры хука push-ить адрес первой незатираемой команды, а все затираемые выполнять в процедуре.


В процедуре MageBuildBackgroung убери popad перед "@@leave:" - другой popad и так будет выполняться всегда.
Если у тебя
Code:
JZ @@Leave
выполняется, то идёт один POPAD, иначе - два. Ты уверен, что так и должно быть?
Попробовал поменять код. Вместо двух процедур сделал одну.
Code:
PROCEDURE HOOK_MageGuildEnter; ASSEMBLER; {$FRAME-}
    ASM
    PUSHAD // Push all registers
    PUSH 90003 // Push function number
    MOV EAX, $74CE30 // Move $74CE30 to EAX
    CALL EAX // Call ERM-function
    ADD ESP, 4 // Add 4 to ESP
    POPAD // Restore all registers
    MOV EDX, DWORD [$69954C]
    PUSH 800
    MOV ECX, DWORD [EDX+$38]
    MOVSX EDX, BYTE [ECX+4]
    CMP DWORD [$887668], -1
    JNZ @@Change
    PUSH ECX
    PUSH $5CCEDF
    @@Change:
    MOV EAX, DWORD [$887668]
    MOV ECX, DWORD [EAX*4+$68A36C]
END; // .PROCEDURE HOOK_MageGuildEnter
Ошибка, чсх, все так же вылазит. Выкладываю ее в спойлере.
Используемый код в ERM:
!?FU90003;
!!VRv1:S-1;
Ты вообще в курсе, что PUSH(AD) и POP(AD) изменяют значение ESP?
Reference URL's