Current time: 23.03.2024, 04:51 Hello There, Guest! (LoginRegister)
Language: english | russian  

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

Posts: 1054
Post: #136

Долго думал, куда кинуть. Сперва хотел в тему по ERM, но, думаю, лучше сюда.
Функция для изменения типа и количества существ в армии героя. Зачем это нужно? Ну, например, это позволяет без ритуальных плясок устанавливать отрицательное количество существ.

Code:
; Функция для изменения существ в армии героя
; x1 - номер героя
; x2 - номер слота
; x3 - тип существ
; x4 - кол-во существ

!?FU80001;
!!VRy1:S1170 *x1; Указать номер героя
!!VRy2:S4 *x2; Указать номер слота
!!VRy3:S71112441 +y1 +y2; Вычислить адрес типа существ
!!VRy4:S71112469 +y1 +y2; Вычислить адрес количества существ
!!UN:Cy3/4/x3; Установить новый тип
!!UN:Cy4/4/x4; Установить новое кол-во
Исходные адреса в hex:
[[43D16F9]+492*x1+4*x2] - тип существ
[[43D1715]+492*x1+4*x2] - количество существ


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

Posts: 1054
Post: #137

Обновил функцию. Теперь в x3 устанавливается тип существ, в x4 - количество.


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

Posts: 622
Post: #138

Quote:43D16F9
адрес динамический. У меня, к примеру, там FFFFFFFF.
Расово кошерный православного вида указатель на структуру героя:
[699538]+21620+492*<hero>
13.09.2010 20:43
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #139

Прошу прощения за тупой вопрос: динамический адрес может меняться при нескольких запусках программы на одном компьютере или только на разных компьютерах? И вообще, может кто-нибудь дать мне точное определение этого понятия?
13.09.2010 21:00
Find all posts by this user Quote this message in a reply
GhostManSD Offline

Posts: 1054
Post: #140

feanor, а теперь, пожалуйста, расшифруй. Ab Это такой же указатель, как те, в которых меняется текст?
Ну, например, раньше я в артмани искал, например, текст "Лорд", менял значения для всех по возрастанию, смотрел нужный адрес и искал по нему указатель. Находил нужный и уже адрес самого указателя использовал в функциях.


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

Posts: 197
Post: #141

Статическая память - это секция данных в экзешнике. Эта память выделяется сразу при запуске экзешника. Для самого экзешника адрес этой памяти (и следовательно всех данных в этой памяти) всегда один и тот же (от запуска к запуску и во время выполнения ехе) и всегда существует (пока экзешник работает).
(Например массивы свойств существ, видео, координат строений в городе хранятся в статической памяти, так как длина этих массивов и размер их элементов (да и содержание тоже кстати) не меняется в процессе выполнения программы.

Динамическая память выделяется/освобождается под те или иные нужды в процессе выполнения екзе в зависимости от тех или иных событий. То есть адрес такой памяти (выделенной под какие-то определенные данные) может менятся не только от запуска к запуску, но и от выделения к выделению в процессе выполнения программы.(Например для списков запущенных диалоговых окон и списков элементов этих диалоговых окон память выделяется динамически, так как длина этих списков и размер элементов этих списков меняется в процессе выполнения программы)
Поэтому запоминать такой адрес не имеет смысла, так как при следующем запуске или даже например при старте другого сценария по этому адресу могут находится совершенно другие данные или вообще память недоступная для чтения/записи для этого процесса и тогда при попытке обращения к памяти по этому адесу мы получим крах программы с сообщением о "насилии над доступом" и что "память не может быть Read(Write)".
(This post was last modified: 14.09.2010 16:14 by baratorch.)
14.09.2010 15:57
Find all posts by this user Quote this message in a reply
GhostManSD Offline

Posts: 1054
Post: #142

Появилось три вопроса.

1. Как можно узнать статический адрес? Например, для того же динамического 43D16F9 пробовал искать указатель в Артмани - не находит. И вообще у меня этот адрес не меняется никогда и всегда хранит одну и ту же информацию, а именно - тип существ в первом слоте Оррина. Может, он и не динамический вовсе?

2. Если я добавлю деф в h3sprite.lod, для него появится свой адрес? Иными словами, смогу ли я обращаться к дефу в дизассемблере? Например, менять деф кнопки на MYDEF.DEF?

3. Самое важное. Я поставил хук на какой-либо адрес. Добавил функцию 90004. Как мне сделать, чтобы, если x1=0, эта функция меняла содержимое адреса на одно значение, а если x1=1, то меняла ла бы содержимое того же адреса на другое значение?


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

Posts: 56
Post: #143

Чем defки лучше смотреть?
16.09.2010 08:38
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #144

Quote:Я поставил хук на какой-либо адрес.
Добавил функцию 90004. Как мне сделать, чтобы, если
x1=0, эта функция меняла содержимое адреса на одно
значение, а если x1=1, то меняла ла бы содержимое того
же адреса на другое значение?

Это после вызова функции, но перед popad.

mov ax, [$91DA38]
cmp ax, 0
jne @@m1
mov bx, zn1;Если x1=0, помещаем 1 значение в регистр.
@@m1:
mov bx, zn2;Если x1<>0, помещаем 2 значение в регистр.
mov perem, bx;Записываем нужное значение в переменную.
16.09.2010 11:27
Find all posts by this user Quote this message in a reply
Дьякон Offline

Posts: 392
Post: #145

(16.09.2010 01:50)GhostManSD Wrote:  1. Как можно узнать статический адрес? Например, для того же динамического 43D16F9 пробовал искать указатель в Артмани - не находит. И вообще у меня этот адрес не меняется никогда и всегда хранит одну и ту же информацию, а именно - тип существ в первом слоте Оррина. Может, он и не динамический вовсе?
На твоей машине просто совпадает. На многих других работать не будет. Если ищешь через артмани то попробуй искать указатели на начало блока. А если через отладчик или дизассемблер, то в коде часто видно как идет обращение к этому адресу. Либо перехватывай все memalloc и смотри куда записывается указатель на выделенный блок.

(16.09.2010 01:50)GhostManSD Wrote:  2. Если я добавлю деф в h3sprite.lod, для него появится свой адрес? Иными словами, смогу ли я обращаться к дефу в дизассемблере? Например, менять деф кнопки на MYDEF.DEF?

Вообще мутный какой-то вопрос. Более четкую задачу поставь. Менять деф кнопки можно не заморачиваясь с кодом, если эта кнопка уже существует. А вот если хочешь добавить новый деф и кнопку тогда...

(16.09.2010 01:50)GhostManSD Wrote:  3. Самое важное. Я поставил хук на какой-либо адрес. Добавил функцию 90004. Как мне сделать, чтобы, если x1=0, эта функция меняла содержимое адреса на одно значение, а если x1=1, то меняла ла бы содержимое того же адреса на другое значение?
Ммм... берем справочник по нужному тебе языку программирования и смотрим условные операторы.


Страус труп (с) Бьерн
16.09.2010 11:55
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 622
Post: #146

Quote:Как можно узнать статический адрес?
Самый грубый способ - шестизначные - статические, семизначные - динамические.
Quote: А если через отладчик или дизассемблер, то в коде часто видно как идет обращение к этому адресу.
Хардвер брякпойнт на чтение интересующих байтов. Когда сработает - смотреть в брякнувшем участке кода, как происходит обращение.
16.09.2010 12:49
Find all posts by this user Quote this message in a reply
Дьякон Offline

Posts: 392
Post: #147

(16.09.2010 12:49)feanor Wrote:  Самый грубый способ - шестизначные - статические, семизначные - динамические.
Есть и 6-е не статические.

(16.09.2010 12:49)feanor Wrote:  Хардвер брякпойнт на чтение интересующих байтов. Когда сработает - смотреть в брякнувшем участке кода, как происходит обращение.
Иногда указатель кочует из процедуры в процедуру в виде аргументов. Поэтому докопаться до истины не всегда так просто.


Страус труп (с) Бьерн
16.09.2010 13:34
Find all posts by this user Quote this message in a reply
feanor Offline

Posts: 622
Post: #148

Quote:Иногда указатель кочует из процедуры в процедуру в виде аргументов. Поэтому докопаться до истины не всегда так просто.
Знаю. В таком случае идем по вызвавшим процедурам. Ну и параллельно смотрим код в HexRays'e
16.09.2010 18:06
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #149

Quote:Ну и параллельно смотрим код в HexRays'e
Что такое Hex Rays?Ab
16.09.2010 18:30
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #150

(16.09.2010 08:38)Prayer Wrote:  Чем defки лучше смотреть?
Def Preview. http://wogarchive.ru/files/%D1%EE%F4%F2/...%201.1.rar
А вообще, вопрос не по теме.
16.09.2010 19:47
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