Привет ребята. Помогите пожалуйста с вопросом.
Как допустим через 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
Этот топик читают: Гость
Ответов: 321
Рейтинг: 10
|
|||
карма: 1 |
|
Ответов: 4630
Рейтинг: 749
|
|||
А что будешь потом делать с этими байтами? А как узнаёшь, сколько именно байт нужно читать?
|
|||
карма: 26 |
|
Ответов: 321
Рейтинг: 10
|
|||
А что будешь потом делать с этими байтами? А как узнаёшь, сколько именно байт нужно читать? Редактировать.. 247 199 0 24 0 2 117 68 15 183 на F7 C7 00 00 0 2 117 68 15 183... То есть первые 4 значения. |
|||
карма: 1 |
|
Ответов: 4630
Рейтинг: 749
|
|||
Ну и чем Dword не подходит?
|
|||
карма: 26 |
|
Ответов: 321
Рейтинг: 10
|
|||
С ним и работаем И все стабильно хорошо.
Но когда в первые 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 |
|
Ответов: 4630
Рейтинг: 749
|
|||
Проверь, правильно ли подается в компонент адрес для записи.
|
|||
карма: 26 |
|
Ответов: 1841
Рейтинг: 369
|
|||
dword(integer) != byte
Изменяя или читая один dword, ты работаешь с массивом из 4 байтов. wiki писал(а): Массив (в некоторых языках программирования также таблица, ряд, матрица) — набор компонентов (элементов), расположенных в памяти непосредственно друг за другом, доступ к которым осуществляется по индексу (индексам). В отличие от списка, массив является структурой с произвольным доступом[1].Так вот и читай/пиши последовательно по одному байту друг за другом столько раз, сколько нужно, увеличивая адрес на 1 (byte=1). Представление массива в памяти ничем не отличается от представления массива в delphi или любом другом ЯП (мб не всех ) , но ЯП позволяет удобно работать с ним с помощью различных методов, как пример - обращение по индексу. Тут же тебе нужно всю работу ЯП и компилятора делать самому (упрощённо ). ------------ Дoбавленo в 04.55: А вообще, функция ReadProcessMemory позволяет прочитать/записать столько байт, сколько нужно и насколько позволяют границы адресного пространства выделенные под процесс и его модули. |
|||
карма: 1 |
|
Ответов: 4630
Рейтинг: 749
|
|||
CriDos писал(а): Изменяя или читая один dword, ты работаешь с массивом из 4 байтов |
|||
карма: 26 |
|
Ответов: 2059
Рейтинг: 132
|
|||
А как запишится dword? (младший, старший).
Если важна последовательность байт, а не число, то надо работать с байтами. Я так понял, что надо редактировать память по шаблону, - значит побайтно. (если не в DOOM меняем количество здоровья - там числами). |
|||
карма: 6 |
|
Ответов: 4630
Рейтинг: 749
|
|||
Dword запишется стандартно - сначала младший байт. Манипулировать отдельными байтами можно с помощью математики.
|
|||
карма: 26 |
|
Ответов: 2059
Рейтинг: 132
|
|||
Netspirit
И я про то. |
|||
карма: 6 |
|
Ответов: 321
Рейтинг: 10
|
|||
В моем случае я делаю мультихак для 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 |
|
Ответов: 2059
Рейтинг: 132
|
|||
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 |
|
Ответов: 321
Рейтинг: 10
|
|||
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 |
|
Ответов: 4630
Рейтинг: 749
|
|||
Покажи схему (или часть с ProcMemory).
|
|||
карма: 26 |
|