Вверх ↑
Этот топик читают: Гость
Ответов: 321
Рейтинг: 10
#1: 2015-08-31 09:10:22 ЛС | профиль | цитата
Привет ребята. Помогите пожалуйста с вопросом.
Как допустим через ProcMemory прочесть не '4 bytes' (Dword), а 'array of byte' ?! Оо
------------ Дoбавленo в 09.10:
Помогите отредактировать компонент, если такое возможно...
Как понял редактировать этот файл hiProcMemory.pas, но боюсь его трогать, дабы не сломать.

ProcMemory v 0.1:
http://forum.hiasm.com/forum_serv.php?q=56&id=4024
карма: 1

0
Ответов: 4630
Рейтинг: 749
#2: 2015-08-31 10:05:26 ЛС | профиль | цитата
А что будешь потом делать с этими байтами? А как узнаёшь, сколько именно байт нужно читать?
карма: 26

0
Ответов: 321
Рейтинг: 10
#3: 2015-08-31 10:41:58 ЛС | профиль | цитата
А что будешь потом делать с этими байтами? А как узнаёшь, сколько именно байт нужно читать?

Редактировать..
247 199 0 24 0 2 117 68 15 183 на
F7 C7 00 00 0 2 117 68 15 183...
То есть первые 4 значения.
карма: 1

0
Ответов: 4630
Рейтинг: 749
#4: 2015-08-31 10:44:35 ЛС | профиль | цитата
Ну и чем Dword не подходит?
карма: 26

0
Ответов: 321
Рейтинг: 10
#5: 2015-08-31 11:36:17 ЛС | профиль | цитата
С ним и работаем И все стабильно хорошо.
Но когда в первые 4 надо поставить 00 00 00 00:
247 199 0 24 0 2 117 68 15 183 на
00 00 00 00 0 2 117 68 15 183... то dword становится равен 0, и после его записи в память проходит сбой, а если через Cheat Engine вправлять через Array of byte вручную, то все работает.
------------ Дoбавленo в 11.08:
4 Bytes: 1059360187
Array of byte: 187 141 36 63 212 208 49 62 97 11

4 Bytes: 0
Array of byte: 0 0 0 0 212 208 49 62 97 11

Так и должно быть ?!
------------ Дoбавленo в 11.36:
Когда записываешь в память Dword 0 вместо Array of byte 00 00 00 00... Приложение в котором меняешь значение вылетает, а если редактировать вручную через CE, все нормально...
Или я что-то не так делаю, сейчас еще попробую...
карма: 1

0
Ответов: 4630
Рейтинг: 749
#6: 2015-08-31 13:09:03 ЛС | профиль | цитата
Проверь, правильно ли подается в компонент адрес для записи.
карма: 26

0
Ответов: 1841
Рейтинг: 369
#7: 2015-09-01 04:55:18 ЛС | профиль | цитата
dword(integer) != byte
Изменяя или читая один dword, ты работаешь с массивом из 4 байтов.

wiki писал(а):
Массив (в некоторых языках программирования также таблица, ряд, матрица) — набор компонентов (элементов), расположенных в памяти непосредственно друг за другом, доступ к которым осуществляется по индексу (индексам). В отличие от списка, массив является структурой с произвольным доступом[1].

Так вот и читай/пиши последовательно по одному байту друг за другом столько раз, сколько нужно, увеличивая адрес на 1 (byte=1).
Представление массива в памяти ничем не отличается от представления массива в delphi или любом другом ЯП (мб не всех ) , но ЯП позволяет удобно работать с ним с помощью различных методов, как пример - обращение по индексу.
Тут же тебе нужно всю работу ЯП и компилятора делать самому (упрощённо ).

------------ Дoбавленo в 04.55:
А вообще, функция ReadProcessMemory позволяет прочитать/записать столько байт, сколько нужно и насколько позволяют границы адресного пространства выделенные под процесс и его модули.
карма: 1
0
Ответов: 4630
Рейтинг: 749
#8: 2015-09-02 10:31:29 ЛС | профиль | цитата
CriDos писал(а):
Изменяя или читая один dword, ты работаешь с массивом из 4 байтов
Ему и надо работать с четырьмя байтами.
карма: 26

0
Ответов: 2059
Рейтинг: 132
#9: 2015-09-02 14:21:12 ЛС | профиль | цитата
А как запишится dword? (младший, старший).
Если важна последовательность байт, а не число, то надо работать с байтами.
Я так понял, что надо редактировать память по шаблону, - значит побайтно. (если не в DOOM меняем количество здоровья - там числами).
карма: 6

0
Ответов: 4630
Рейтинг: 749
#10: 2015-09-02 14:40:03 ЛС | профиль | цитата
Dword запишется стандартно - сначала младший байт. Манипулировать отдельными байтами можно с помощью математики.
карма: 26

0
Ответов: 2059
Рейтинг: 132
#11: 2015-09-02 14:48:48 ЛС | профиль | цитата
Netspirit
И я про то.
карма: 6

0
Ответов: 321
Рейтинг: 10
#12: 2015-09-02 15:11:42 ЛС | профиль | цитата
В моем случае я делаю мультихак для World of Warcraft 3.3.5.
Сделал миллион функций, все работает (спасибо CriDos и Netspirit за помощь), но некоторые функции где нужно менять Array of byte на 00 00 00 00, а не допустим 90 90 C7 45 я не смог реализовать.

0x00A37F0C // write bytes 00 00 00 00 - вот например включение WallClimb (хождение по горам). Вроде все просто, но при записи через ProcMemory в 4 Bytes равному 0 игра вылетает.

Читал вчера различные форумы и понял, вроде понял, что менять надо постепенно по одной ячейке, причем порядок скорее всего в обратном порядке будет... Каша короче непонятная.
Сейчас попробую записывать 4 Bytes в 4 стадии...
187 141 36 63 - 1059360187 (4 Bytes) - WallClimb OFF
00 141 36 63 - 1059360000 (4 Bytes)
00 00 36 63 - 1059323904 (4 Bytes)
00 00 00 63 - 1056964608 (4 Bytes)
00 00 00 00 - 0 (4 Bytes) - WallClimb ON


Не удивлюсь, если ответ на мой вопрос уже есть тут, но я не понимаю Тупой :\
карма: 1

0
Ответов: 2059
Рейтинг: 132
#13: 2015-09-02 15:50:32 ЛС | профиль | цитата
Master4eG,
Array of byte на 00 00 00 00, а не допустим 90 90 C7 45 я не смог реализовать.

Не понятна фраза после запятой.
Далее:
00 00 00 00 - 0 (4 Bytes) - WallClimb ON

ON/Off конечно похоже на 0/-1, но не факт, что эта логика заложена.
Что это такое? Если это не да/нет, то возможно нулевые значения не приемлемы. Это я умозрительно.
Если эти четыре байта принимают значения отличные от -1, то скорее всего и нули нельзя писать.
Может 01 00 00 00 вместо 00 00 00 00?
Вполне может быть, что надо менять только слово, или байт.
карма: 6

0
Ответов: 321
Рейтинг: 10
#14: 2015-09-02 16:06:15 ЛС | профиль | цитата
flint2 я имел ввиду, что если нужно менять Array of byte на 00 00 00 00, то не получается, а если допустим на 90 90 C7 45 - получается, потому что 90 90 C7 45 = 757357146, а не 0!
flint2 Вполне вероятно, что будет работать с 01 00 00 00, но все таки лучше 0, стабильнее будет и проверено временем.


Сейчас компонент ProcMemory вообще не хочет записывать значение!


wow.WriteByte(0x00A37F0C, 0x00);
wow.WriteByte(0x00A37F0C + 0x1, 0x00);
wow.WriteByte(0x00A37F0C + 0x2, 0x00);
wow.WriteByte(0x00A37F0C + 0x3, 0x00);

Вот как я понимаю правильная запись Array of byte.
карма: 1

0
Ответов: 4630
Рейтинг: 749
#15: 2015-09-02 16:10:19 ЛС | профиль | цитата
Покажи схему (или часть с ProcMemory).
карма: 26

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)