Здравствуйте, у меня вот проблема со считыванием значений.
Не знаю как написать функцию получения значения i.
Знаю что начинается с 0 и полученный индекс умножаться на 4
максимальное число i := $38
Это типа : 4*0=0,4*1=4,4*2=8 и т.д Как его считать? Помогите пожалуйста :(
PHP код:
var
...
begin
try //
for i := $0 to $38 do
begin
???
ReadProcessMemory (hProcess, Pointer($007E3600), @WHP, sizeof(WHP), NoB); //BaseAdress $hex
ReadProcessMemory (hProcess, Pointer(WHP+$1A8), @WHP, sizeof(WHP), NoB); //Enviroment Struct
ReadProcessMemory (hProcess, Pointer(WHP+(i*4)), @WHP, sizeof(WHP), NoB); //Структура персонажа
ReadProcessMemory (hProcess, Pointer(WHP+$1B4), @WHP, sizeof(WHP), NoB); //Читаем значение HP(Жизни)
...
Здравствуйте, у меня вот проблема со считыванием значений.
Не знаю как написать функцию получения значения i.
Знаю что начинается с 0 и полученный индекс умножаться на 4
максимальное число i := $38
Это типа : 4*0=0,4*1=4,4*2=8 и т.д Как его считать? Помогите пожалуйста :(
Это какой-то дельфийский слэнг?
Тебе нужно считать 38 последовательностей по 4 байта? А в чём проблема?
for(int i = 0; i < 38; i++)ReadProcessMemory (hProcess, Pointer(WHP+(i*4)), @WHP, sizeof(WHP), NoB);
Но я бы советовал дёргать память напрямую, без WinAPI.
Да, это на делфи 7.
Вы привели мне пример на C++. Хм.. спасибо большое.
В делфи это выглядит так, если я точно понял ваш код)))
i : Integer; - переменная. integer - числовой диапазон
for i :=$0 to $38 do
begin
ReadProcessMemory (hProcess, Pointer(WHP+(i*4)), @WHP, sizeof(WHP), NoB);
end;
"Но я бы советовал дёргать память напрямую, без WinAPI." - можно поподробней пожалуйста?
Попробую более внятно разъяснить)))
Когда я смотрю в ассемблерскую вкладку в программе "Cheating Engine", причем при поиске структуры персонажа, он мне показывает несколько видов кодов структуры, вот один из них:
eax = [BA]+1A8]] BA - BaseAdress
edi - это итератор цикла, оно меняется от 0 до значения eax с шагом в единицу.
Я хочу узнать чему будет равно edi программно, не прибегаю к cheating engine.
edi - от 0 до 9 hex и от A до E. Потом я умножаю на 4. И програ работает.
В своем коде я не много ошибся. Надо написать:
38 - это уже 38=4*9 в hex.
Как мне объяснили некоторые: "Ты попал на цепочку данных, если тебе надо прочитать всю цепочку, то читай в цикле с итератором i, если конкретный элемент, то напиши его индекс в i."
Вот собственно на что я и попал:
007E3600+1A8+(i*4)+1B8.
Я вообще понятие не имею в Delphi что такое итератор.(один чувак назвал его указателем)
Привели мне пример 3 циклов:
Код:
Код:
var
i: integer;
{ ... }
begin
i := 0;
while i < $100 do //TODO: insert correct value
begin
//TODO: Read value from process memory
inc(i);
end;
i := 0;
repeat
//TODO: Read value from process memory
inc(i);
until
i = $100; //TODO: insert correct value
for i := 0 to $100 do //TODO: insert correct value
begin
//TODO: Read value from process
end;
end;
Попробовал с этим кодом, выводит мне одно огромное значения причем оно меняется, тогда когда я дергую окно программы. Ладно приду попробую еще раз во всем разобраться, если не смогу разобраться, придется к вам за помощью обращаться.
Спасибо за внимание.
И да ваш код Dark:
он значит for i = 0; если i < 38 то действие верно, i++ - как я понял инкремент, начал и C++ немного подучивать
практически тоже самое и на Delphi
Код:
begin
i := 0;
while i < $100 do //TODO: insert correct value
begin
//TODO: Read value from process memory
inc(i);
end;
Ток что, приду и буду думать че как по чем
Если есть догадки поделитесь)))
Попробую более внятно разъяснить)))
Когда я смотрю в ассемблерскую вкладку в программе "Cheating Engine", причем при поиске структуры персонажа, он мне показывает несколько видов кодов структуры, вот один из них:
eax = [BA]+1A8]] BA - BaseAdress
edi - это итератор цикла, оно меняется от 0 до значения eax с шагом в единицу.
Я хочу узнать чему будет равно edi программно, не прибегаю к cheating engine.
edi - от 0 до 9 hex и от A до E. Потом я умножаю на 4. И програ работает.
В своем коде я не много ошибся. Надо написать:
38 - это уже 38=4*9 в hex.
38=4*9? Это может быть в другой вселенной, в нашей же 36=4*9, а если в хексе, то 38=4*0e
По твоему ASM коду всё получается по-другому, объясняю на пальцах:
BaseAddress + 0x1A8 - по этому адресу лежит первый указатель
далее к этому указателю прибавляется (i * 4) и по получившемся адресу расположен ещё один указатель
считываем его и он собственно будет указывать на искомую величину.
Значит мне надо указывать от 0 до $0e???
так как 38=4*$0e
i - это числовой диапазон или DWORD???
Добавлено через 1 час 52 минуты
Стал проверять... Мозг вынесло только так...
Решил использовать 2 цикла, чтоб проверить быстрей.
var // объявленные переменные
HP, MP : Integer;
WHP, WMP : DWORD;
NoB : DWORD;
i : Integer;
---------------------------
1 цикл:
Код:
begin //начало тела
i:= $0; // i = 0x0 в hex
while i < $0e do
begin
ReadProcessMemory (hProcess, Pointer($007E3600 + $1A8), @WHP, sizeof(WHP), NoB);
ReadProcessMemory (hProcess, Pointer(WHP + (i*4)),@WHP, sizeof(WHP), NoB);
ReadProcessMemory (hProcess, Pointer(WHP), @WHP, sizeof(WHP), NoB);
inc(i); - если это убрать то програ зависнет.
HP := Integer(WHP);
Label2.Caption := IntToStr(WHP)
выводит мне все время 0, я специально убирал 4, менял i от и до.
Результат 0.
Сделал так:
Код:
i := $0;
while i < $0e do
begin
ReadProcessMemory (hProcess, Pointer($007E3600 + $1A8), @base, sizeof(base), NoB);
ReadProcessMemory (hProcess, Pointer(base + (i*4)),@WHP, sizeof(WHP), NoB);
ReadProcessMemory (hProcess, Pointer(WHP), @WHP, sizeof(WHP), NoB);
inc(i);
ReadProcessMemory (hProcess, Pointer(WHP+$1B4),@AWP, sizeof(AWP),NoB);
end;
HP := Integer(AWP);
Label2.Caption := IntToStr(AWP);
Результат - 1.
Я уже запарился и самый прикол, даже если I * другие числа результат не измениться что в первом примере что и во втором.
Я вообще не врубаюсь
Одно я знаю точно, что если я бы знал чему равно i*4 и добавил в код как результат, например:
i := 0;
while i < $2 do
begin
ReadProcessMemory (hProcess, Pointer($007E3600), @WMPMax, sizeof(WMPMax), NoB); //BaseAdress
ReadProcessMemory (hProcess, Pointer(WMPMax+$1A8), @WMPMax, sizeof(WMPMax), NoB);
ReadProcessMemory (hProcess, Pointer(WMPMax+(i*4)), @WMPMax, sizeof(WMPMax), NoB);
ReadProcessMemory (hProcess, Pointer(WMPMax+$1B4), @WMPMax, sizeof(WMPMax), NoB); //Читаем значение HPMaX
inc(i);
end;
Одно я не могу понять почему i < 2. если менять эту цифру на больше, то какие то сумасшедшие цифры получаются. А при вашем коде, обычно или 0 показывает или 1. А если еще что то добавить в код, то это может повеять на результат а может и нет. Фиг поймешь....
Последний раз редактировалось Foreworld; 24.04.2014 в 07:15.
Причина: Добавлено сообщение
сразу бы сказал, что не шаришь. Как тебе это объяснить, если ты пытаешься кодить методом подбора? Тут понимать надо, а не наугад кнопки клацать.
Удаляюсь с темы.
ReadProcessMemory (hProcess, Pointer(WMPMax+i*$4), @WMPMax, sizeof(WMPMax), NoB);
Возможно так)
еще одна ванга-тыкалка? это наверно ахуенно апать старые темы при том что сам не знаешь ответа. а ничего что 4 в шестнадцатиричной системе равно четырем в десятичной и хоть ты 4 напишешь хоть $4 это одно и тоже.
еще одна ванга-тыкалка? это наверно ахуенно апать старые темы при том что сам не знаешь ответа. а ничего что 4 в шестнадцатиричной системе равно четырем в десятичной и хоть ты 4 напишешь хоть $4 это одно и тоже.
Я вот понимаю а вот Delphi может неправильно выводить результат я так и написал чтобы он указал $ возможно в этом проблема!