Current time: 22.04.2024, 02:16 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Исследование героев
» туториал(ы)
Author Message
Sav Offline

Posts: 2180
Post: #271

По-моему, лучше в хуке по адресу A запомнить значение по-адресу B, а проверять в хуке по адресу C, если я правильно понял, что тебе надо.
03.02.2011 15:37
Find all posts by this user Quote this message in a reply
Prayer Offline

Posts: 56
Post: #272

(03.02.2011 13:46)GhostManSD Wrote:  На фига бряк-то? Смещай координаты просто за пределы экрана.

Или забей нопами отрисовку.
Хммм... А это как? Где искать координаты? Отрисовку?
Я же писал что делитант...
03.02.2011 20:13
Find all posts by this user Quote this message in a reply
GhostManSD Offline

Posts: 1054
Post: #273

Нашел свою кнопку? Перейди на адрес, где она прописывается (в Олли: search > text references > твоя кнопка.def. Нажимаешь на ней лкм. Ты попадешь в CPU. Там рядом с названием кнопки будут прочие аргументы. Координаты находятся на пару строчек ниже (2 адреса: отступ сверху и отступ слева). Они - в шестнадцатеричном формате. Для перевода используй калькулятор Windows в инженерном режиме. Поставь большие координаты, чтобы кнопка "уехала" за пределы экрана. Вроде все.


Κακῆς ἀπ' ἀρχῆς γίγνεται τέλος κακόν.
03.02.2011 20:31
Visit this user's website Find all posts by this user Quote this message in a reply
GhostManSD Offline

Posts: 1054
Post: #274

Sav, попробую. Мне тоже приходила в голову такая мысль, но я думал, есть способ сделать без второго хука.


Κακῆς ἀπ' ἀρχῆς γίγνεται τέλος κακόν.
03.02.2011 20:37
Visit this user's website Find all posts by this user Quote this message in a reply
Дьякон Offline

Posts: 392
Post: #275

покажи код


Страус труп (с) Бьерн
03.02.2011 21:57
Find all posts by this user Quote this message in a reply
GhostManSD Offline

Posts: 1054
Post: #276

Адреса для хука (точнее, для хука - верхний, а остальные прописываю для восстановления оригинальных команд); при хуке происходит вызов функции 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 в природе нет.


Κακῆς ἀπ' ἀρχῆς γίγνεται τέλος κακόν.
(This post was last modified: 04.02.2011 00:02 by GhostManSD.)
04.02.2011 00:00
Visit this user's website Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #277

Здесь Берс показывал мне, как использовать для передачи и приёма параметров SN:X.
04.02.2011 00:07
Find all posts by this user Quote this message in a reply
Дьякон Offline

Posts: 392
Post: #278

ты мне свой код выложи


Страус труп (с) Бьерн
04.02.2011 00:08
Find all posts by this user Quote this message in a reply
GhostManSD Offline

Posts: 1054
Post: #279

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 таким же образом значения по адресам.


Κακῆς ἀπ' ἀρχῆς γίγνεται τέλος κακόν.
(This post was last modified: 04.02.2011 00:23 by GhostManSD.)
04.02.2011 00:22
Visit this user's website Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #280

А что у тебя подряд два POPAD в MageGuildBackground? Причём один то выполняется, то нет.
04.02.2011 01:36
Find all posts by this user Quote this message in a reply
GhostManSD Offline

Posts: 1054
Post: #281

Ну так вроде же надо восстанавливать регистры независимо от итога. Хотя во втором случае никакие регистры вроде не меняются, так что там и правда нет нужды. Но проблема-то не в этом.
Гм. Сейчас вот на свежую голову все это посмотрел и увидел, что если вручную в Олли поменять процедуру в нужном мне адресе, получается вот что:
БЫЛО
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 затирается. Как бороться?


Κακῆς ἀπ' ἀρχῆς γίγνεται τέλος κακόν.
(This post was last modified: 04.02.2011 01:56 by GhostManSD.)
04.02.2011 01:51
Visit this user's website Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #282

Если что-то затирается, надо в конце процедуры хука push-ить адрес первой незатираемой команды, а все затираемые выполнять в процедуре.


В процедуре MageBuildBackgroung убери popad перед "@@leave:" - другой popad и так будет выполняться всегда.
04.02.2011 02:02
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #283

Если у тебя
Code:
JZ @@Leave
выполняется, то идёт один POPAD, иначе - два. Ты уверен, что так и должно быть?
04.02.2011 02:07
Find all posts by this user Quote this message in a reply
GhostManSD Offline

Posts: 1054
Post: #284

Попробовал поменять код. Вместо двух процедур сделал одну.
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;


Κακῆς ἀπ' ἀρχῆς γίγνεται τέλος κακόν.
(This post was last modified: 04.02.2011 03:40 by GhostManSD.)
04.02.2011 03:16
Visit this user's website Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #285

Ты вообще в курсе, что PUSH(AD) и POP(AD) изменяют значение ESP?
04.02.2011 03:45
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group