Здравствуйте, гость ( Вход | Регистрация )

8 страниц V  1 2 3 > »   
Ответить в эту темуОткрыть новую тему
> Чтение из памяти
ivanTu
сообщение 26.2.2015, 11:49
Сообщение #1


****

Apprentice
Сообщений: 128
Регистрация: 2.2.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.276
Возраст: 27



Приветствую всех, подскажите пожалуйста, у меня есть базовый адрес и офсеты, как правильно все написать пробовал вот так :

set #target_hp_base 0x7D47265C
set #offset1 0x72c
set #offset2 0xf8
set #offset3 0x418
set #offset4 0x3a4
set #offset5 0x204

set #target_hp #target_hp_base + #offset1 + #offset2 + #offset3 + #offset4 + #offset5

readmem #hp #target_hp d
hint Жизней мало епт = #hp

ничего не получилось возвращает либо ноль либо не верное число...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 26.2.2015, 20:16
Сообщение #2


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



У вас скорее всего есть цепочка указателей и офсеты от каждого указателя указаны. Т.е. берете адрес + офсет1, считываете значение. В значении у вас будет указатель со следующим адресом, прибавляете к нему второй офсет и т.д.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ivanTu
сообщение 27.2.2015, 8:40
Сообщение #3


****

Apprentice
Сообщений: 128
Регистрация: 2.2.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.276
Возраст: 27



Цитата(DarkMaster @ 26.2.2015, 20:16) *

У вас скорее всего есть цепочка указателей и офсеты от каждого указателя указаны. Т.е. берете адрес + офсет1, считываете значение. В значении у вас будет указатель со следующим адресом, прибавляете к нему второй офсет и т.д.


Что то я никак не разберусь в последовательности действий, Уважаемый дарк покажи на пальцах, куда что и с чем, вот что есть.



и кстате, тот адрес что выделен (базовый) я его вытащил из .Dll - ки процесса, и через PE tools взял его адрес, я про то что UoPilot читает адреса из dll процесса?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ivanTu
сообщение 27.2.2015, 9:00
Сообщение #4


****

Apprentice
Сообщений: 128
Регистрация: 2.2.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.276
Возраст: 27



Пробовал вот так :

set #target_hp_point0 0x7D47265C
set #target_hp_point2 #target_hp_point0 + 72C
set #target_hp_point3 #target_hp_point2 + F8
set #target_hp_point4 #target_hp_point3 + 418
set #target_hp_point5 #target_hp_point4 + 3A4
set #target_hp #target_hp_point5 + 204

readmem #hp #target_hp d
hint Жизней мало епт = #hp

Возвращает 0
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 27.2.2015, 9:07
Сообщение #5


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



это печальная история... Мог, но релиз не состоялся т.к. исходники были утеряны... На данный момент пилот не может запросить начальный адрес блока дллки. Вся адресация у него только общая на процесс. С PE tools дело не имел, только с артмани. Надеюсь правильно вас понял, что адресация идет от начала дллки, но что-то больно цифры тогда большие. Если адресация все-таки общая на процесс, а судя по адресам это так, то схему я уже выше описывал. В данном случае это будет выглядеть примерно так:
Код
set #a 0x2B7BAF00 + 0x204
readmem #b #a D
// В #b должен в данном случае упасть адрес 2BF033F70
// от вернувшегося адреса необходимо расчитать смещение
set #b #b + 0x3A4
readmem #c #b D
set #c #c +0x418
readmem #d #c D
и т.д.

Учтите, что значения при выводе в лог для отладки будут десятичными а не хексом. Для удобства можно использовать:
Код
log dec2hex(#b)


// Вообще очень странная лапша из адресов. Обычно вперед-назад указатели не прыгают, а идут только вперед.

Сообщение отредактировал DarkMaster - 27.2.2015, 9:07


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ivanTu
сообщение 27.2.2015, 14:50
Сообщение #6


****

Apprentice
Сообщений: 128
Регистрация: 2.2.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.276
Возраст: 27



Спасибо уважаемы Дарк , все получилось, но уж больно огромен код получается )))
Можете подсказать как оптимизировать можно, если это возможно?

Код
// Считываем базовый адрес и оффсеты HP выбранной цели
set #point0 0x7D47265C + 0x72C
readmem #point0 #point0 d
set #point1 #point0 + 0xf8
readmem #point1 #point1 d
set #point2 #point1 + 0x418
readmem #point2 #point2 d
set #point3 #point2 + 0x3A4
readmem #point3 #point3 d
set #target_hp #point3 + 0x204 // Получили адрес памяти HP выбранной цели
readmem #target_hp #target_hp d  // Обьявляем переменную для адреса #target_hp
// КОНЕЦ // Считываем базовый адрес и оффсеты HP выбранной цели

:start_script  
hint HP  =  #target_hp
goto start_script
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 27.2.2015, 23:25
Сообщение #7


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Цитата
Можете подсказать как оптимизировать можно, если это возможно?

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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ivanTu
сообщение 28.2.2015, 0:37
Сообщение #8


****

Apprentice
Сообщений: 128
Регистрация: 2.2.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.276
Возраст: 27



Теперь другая проблема, тестил скрипт на 64х битной системе, принес домой адреса не читаются на 32х битной такое возможно? Есть ли решение?

включаю этот же скрипт на домашнем компе

Код
// Считываем базовый адрес и оффсеты HP выбранной цели
set #point0 0x7D47265C + 0x72C
readmem #point0 #point0 d
set #point1 #point0 + 0xf8
readmem #point1 #point1 d
set #point2 #point1 + 0x418
readmem #point2 #point2 d
set #point3 #point2 + 0x3A4
readmem #point3 #point3 d
set #target_hp #point3 + 0x204 // Получили адрес памяти HP выбранной цели
readmem #target_hp #target_hp d  // Обьявляем переменную для адреса #target_hp
// КОНЕЦ // Считываем базовый адрес и оффсеты HP выбранной цели

hint #target_hp


выдает вместо того , что нужно -1

беда.... (
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 28.2.2015, 1:14
Сообщение #9


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Цитата
Теперь другая проблема, тестил скрипт на 64х битной системе, принес домой адреса не читаются на 32х битной такое возможно? Есть ли решение?

изменилась цепочка указателей. ищите новую для 64 бит.

тут кстати возможна большая трагедия. Если будет приложение 64 битным с 64 битной адресацией, то пилот ее не поймет - данный апдейт был потерян вместе с теми же исходниками на адресацию по длл.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ivanTu
сообщение 1.3.2015, 12:24
Сообщение #10


****

Apprentice
Сообщений: 128
Регистрация: 2.2.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.276
Возраст: 27



Уважаемый Дарк, а возможно как то проверить в начале скрипта битность системы, а затем запускать требуемые куски скрипта?
про запуск нужного куска я так понимаю gosub мне поможет, а вот как проверить битность? Через реестр есть мысль, но тут опять вопрос на разных типах систем XP Vista и т.д адрес так же разный наверное... может есть какое то универсальное решение...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 1.3.2015, 13:46
Сообщение #11


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Самый тупой способ - проверить существование папок. Например, wow64. Вообще в пилоте прямого вытягивания битности и работы с реестром нет. Данная методика из костылей батников. Там проверяют зарезервированную системную переменную.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ivanTu
сообщение 5.3.2015, 9:54
Сообщение #12


****

Apprentice
Сообщений: 128
Регистрация: 2.2.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.276
Возраст: 27



Уважаемый Дарк подскажите , как можно работать с значением в формате Float выдает 0 всегда, если можите с примером пожалуйста.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 5.3.2015, 10:34
Сообщение #13


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



используйте строковую переменную, а не числовую. В числовую не может быть помещено значение с точкой.
Цитата
добавил в команды 'readmem' и 'writemem' операции с числами с плавающей запятой
B:byte = 1b; W:word = 2b; D:dWord = 4b; C:char = 1b; S:String = 1-255b;
DO:double = 8b; F:float = 4b; R:real = 6b;


Либо вот так:
https://forum.uokit.com/index.php?s=&sh...st&p=161352 (шутка)
Я кстати минут на 15 опоздал(( писал тот же самый функционал...


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ivanTu
сообщение 5.3.2015, 10:38
Сообщение #14


****

Apprentice
Сообщений: 128
Регистрация: 2.2.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.276
Возраст: 27



Если ставлю строку "S" то выдает так же 0 не понимаю в чем дело

readmem #a 0x0F2999BC s 10
hint #a

хотя на тот момент я точно знаю, что значение 9.024896622
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 5.3.2015, 11:27
Сообщение #15


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Цитата
Если ставлю строку "S" то выдает так же 0 не понимаю в чем дело

Ну причем тут S? Откуда она вообще взялась?
Цитата
используйте строковую переменную, а не числовую.

Цитата
добавил в команды 'readmem' и 'writemem' операции с числами с плавающей запятой

Цитата
F:float = 4b


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ivanTu
сообщение 5.3.2015, 11:45
Сообщение #16


****

Apprentice
Сообщений: 128
Регистрация: 2.2.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.276
Возраст: 27



S это string тобиш строка, яподумал что про строковую переменную вы имели ввиду это, просто F ноль возвращает, покажите пожалуйста пример кода, не могу никак понять что да как...

Все разобрался )

теперь я знаю что переменная с $ - это строковая )))

Даже в последующем найденом значении делаю проверку на целое число все работает.

$a 8.98880291

If $a > 6
hint
end_if

короче говоря все получилось! Спасибо большое Дарк! )


то есть я так понимаю число проверяется до точки?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 5.3.2015, 13:03
Сообщение #17


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Не совсем так. Если я правильно понимаю логику пилота, а здесь она не совсем адекватная, то все сравнение идет посимвольно кодами символов.
Т.е. берем строку, лезем в ascii таблицу, переводим все символы в коды. http://www.cdrummond.qc.ca/cegep/informat/...ages/ASCII1.GIF

Т.е. у нас получится вместо:
8.98880291
56 46 56 56 56 48 50 57 49
Далее из этого числа по одной цифре идет сравнение. Символ точки меньше значения цифры и это видимо как-то обрабатывается. Вообще трогать страшно.

В общем и целом делать так крайне не рекомендую, это ну уж очень не корректно. Используйте trunc или round для приведения к целочисленному типу.

Код
if 9.0 > 9
    log +
else
    log -
end_if

Уже косяк.

Сообщение отредактировал DarkMaster - 5.3.2015, 13:01


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ivanTu
сообщение 5.3.2015, 13:20
Сообщение #18


****

Apprentice
Сообщений: 128
Регистрация: 2.2.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.276
Возраст: 27



я считываю значение из памяти оно идет 9.00000хххх и сравниваю его с целым числом все сравнивается правильно, фиг знает, числа с точкой сравниваются как целое число до точки, все что после точки, не берет пилот в сравнение.

set $a 5.98880291
set $b 6
if a < b
hint // В данном случае хинт выведется
end_if
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.3.2015, 13:40
Сообщение #19


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Может так: if $a < $b
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 5.3.2015, 14:12
Сообщение #20


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



Цитата
все сравнивается правильно

Цитата
Код

if 9.0 > 9
log +
else
log -
end_if


Уже косяк.

Не может 9.0 быть больше, чем 9. Это ошибка.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

8 страниц V  1 2 3 > » 
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 29.3.2024, 2:25
Designed by Nickostyle