разный результат выполнения одного кода на разных физических машинах
День добрый, мм подскажите почему выполнение данного кода на разных машинах выдает разный результат?
Конкретно, на второй машине хп берется рандомное, на параллельной машине все работает нормально и все отслеживает с точностью.
Re: разный результат выполнения одного кода на разных физических машинах
а также еще данный фрагмент почему-то выводит нужную строку 2 раза.
Данные смещения по нпс/мобам, в кубе в 60ой стабильно 1 нпс а выод идет двойной отчего то.
И подскажите, пожалуйста, где глянуть смещения к кланам и именам окружающих игроков?
Код:
memo1.Lines.Clear;
strname := '';
for N:=1 to 768 do
begin
ReadProcessMemory(hProcess, Pointer(Game_Address), @WHP, sizeof(WHP), NoB); //my real pointer
ReadProcessMemory(hProcess, Pointer(WHP+$1C), @WHP, sizeof(WHP), NoB);
ReadProcessMemory(hProcess, Pointer(WHP+$24), @WHP, sizeof(WHP), NoB);
ReadProcessMemory(hProcess, Pointer(WHP+$1C), @WHP, sizeof(WHP), NoB);
ReadProcessMemory(hProcess, Pointer(WHP+$4*N), @d1, sizeof(d1), NoB);
ReadProcessMemory(hProcess, Pointer(d1+$4), @d2, sizeof(d2), NoB);
ReadProcessMemory(hProcess, Pointer(d2+$274), @namesptr, sizeof(namesptr), NoB); //my pointer name
ReadProcessMemory(hProcess,Pointer(namesptr+$0), @names,128,NoB);
strname:=WideCharToString(names);
if names = 'Координатор лотереи Куба' then
memo1.Lines.Add(strname);
end;
Re: разный результат выполнения одного кода на разных физических машинах
Далее, замените все Dwordы на Cardinal(после XE2 может иметь значение..)
Уберите лишние переменные.
Да и приведите код в порядок... к примеру хотябы так...
Код:
Function ReadProcMemCardinal(adr:Cardinal):cardinal;
Var
NoB: SIZE_T;
Begin
ReadProcessMemory (hProcess, Pointer(Adr), @Result, 4 , NoB);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
Var
HP : Cardinal; //Ну не могут быть ни хп ни адреса в памяти отрицательными, откуда тут Integer??
PlayerStructStart: Cardinal;
begin
try
PlayerStruct := ReadProcMemCardinal(
ReadProcMemCardinal(Game_Address)
+host_player_struct_offset);
HP := ReadProcMemCardinal(PlayerStruct+host_player_hp_offset);
// MP := ReadProcMemCardinal(PlayerStruct+host_player_mp_offset);
// MaxHP := ReadProcMemCardinal(PlayerStruct+host_player_maxhp_offset);
// MaxMP := ReadProcMemCardinal(PlayerStruct+host_player_maxmp_offset);
Label1.Caption := IntToStr(HP);
except
ShowMessage('капец');
end;
end;
Представте как сократится код если чтений больше чем хп\мп?)
Re: разный результат выполнения одного кода на разных физических машинах
Ginrey, ну так я ему и привел пример где нет записей во временное нечто непонятное) где если что то пишется то сразу по нужным переменным и в нужном формате....
Добавлено через 3 минуты
Цитата:
Сообщение от scitelz
спасибо за развернутость, буду ковырять, многократность все равно не ушла правда, но буду разбираться, спасибо
пробуйте разбить на классы - ее можно убрать полностью) главное построить правильные зависимости, и смотреть что и куда вы читаете)
допустим достаточно при создании программы\по кнопке старт единожды открыть процесс и считать ссылку до своего персонажа, а далее при каждой интерации(по таймеру) читать только нужные статы оттуда, не открывая процесс и не считывая всю цепочку, важно понять какие переменне не переинициализируются в процессе выполнения кода...
дальше можно например максимально значение жизней считывать раз в минуту, а то что нужно срочно считывать чаще... например так
Код:
Var
OnTimerMinuteAction:Cardinal;
Prcoedure OnTimer;
Begin
if OnTimerMinuteAction<GetTickCount then
begin
MaxHP:=ReadDword(MaxHPAdr);
OnTimerMinuteAction:=GetTickCount+60000;
end;
HP:=ReadHP(HPAdr)
end;
Последний раз редактировалось ToRcH2565; 12.01.2014 в 01:49.
Причина: Добавлено сообщение
Re: разный результат выполнения одного кода на разных физических машинах
ну множества и тд с этим разбираюсь так и не убрал пока, однако на данном этапе меня больше интересует с чего вдруг на разных машинах разные значения. На том пк, на котором компилится все норм, - на ноутбуке цифры взятые с потолка и меняющиеся по ивенту таймера.
Цитата:
дальше можно например максимально значение жизней
ХП по большому счету и не нужны, основное это отображение окружающих, однако данная проблема забавна - когда на разных пк разные вариации
Function ReadProcMemCardinal(Handler,address:Cardinal):cardinal;
Var
NoB: SIZE_T;
Begin
ReadProcessMemory (Handler, Pointer(Address), @Result, 4 , NoB);
end;
Re: разный результат выполнения одного кода на разных физических машинах
Ну последний раз писать офсеты ручками мне и приходилось на 145-146, отложилось в памяти))) ... дальше все в базу заливал и оттуда таскал спокойненько...
Цитата:
Сообщение от fds255
А вот насчет чтения от BA согласен, и еще нужно попробовать все же так:
хм, смысл забивать BA и смещения константой... просто отладчиком пройтись и проверить....)
в делфях при трассировке кода(а вдруг кто не знает) можно просто навести на название переменной и во всплывающем окошке увидеть ее значение...)
Re: разный результат выполнения одного кода на разных физических машинах
Цитата:
хм, смысл забивать BA и смещения константой... просто отладчиком пройтись и проверить....)
в делфях при трассировке кода(а вдруг кто не знает) можно просто навести на название переменной и во всплывающем окошке увидеть ее значение...)
забавна ситуация не в том что он считает неверно. Интересно почему на двух разных машинах - значение разное. На той, на которой код компилится значение то верное))
ну потихоньку разобрался и с тем что строк много, лишние убрал - единственное...как исправить кодировку?
количество мобов рядом считает, насколько могу судить, верное)
Код:
WHP := ReadProcmemCardinal(hProcess, Base_Address);
WHP := ReadProcmemCardinal(hProcess, WHP+$1c);
WHP := ReadProcmemCardinal(hProcess, WHP+$1c);
WHP := ReadProcmemCardinal(hProcess, WHP+$24);
MobCount := ReadProcMemCardinal(HProcess,WHP+$14); //количество мобов
WHP := ReadProcMemCardinal(hProcess,WHP+$50);// указатель на начало
// Label1.Caption := MobCount.ToString();
for N:=0 to (MobCount-1) do
begin
ReadProcessMemory(hProcess, Pointer(WHP+$4*N), @d1, sizeof(d1), NoB);
if (d1<>0) then
ReadProcessMemory(hProcess,Pointer(d1), @names,128,NoB);
strname := GetWideString(hProcess, namesptr);
memo1.lines.add(GetWideString(hProcess,namesptr)+'//'+inttostr(n));
end;
Код:
function getWideString(hProc, data: Cardinal): string;
var
i: Cardinal;
rw: SIZE_T;
ch: widechar;
wch: array [0..255] of widechar;
str: widestring;
begin
i:=0;
repeat
ReadProcessMemory(hProc,Pointer(data),@ch,4,rw);
data:=data+4;
wch[i]:=ch;
inc(i);
until (ord(ch)=0) or (i>=255);
i:=0;
str:='';
repeat
str:=str+wch[i];
inc(i);
until wch[i]='';
Result:= str;
end;
[Ссылки могут видеть только зарегистрированные пользователи. ]
Последний раз редактировалось scitelz; 15.01.2014 в 01:45.
Re: разный результат выполнения одного кода на разных физических машинах
Читайте строку как строку... не надо мудрить....
Код:
var
Name : WideString;
Begin
Len = 9; //9 для ника перса, в любом случае строка больше чем нужно не прочтется, обрежется финальным символом. #0#0 для юникода.
SetLength(Name,Len+1);
ReadProcessMemory(hProc,Pointer(data),@Name[1],Len*Sizeof(WideChar),rw);
end;
Обратите внимание только на то как получить ссылку на память для строки... это немного отличается от чтения прочих переменных... строка это массив с нумерацией не от 0 а от 1....
Добавлено через 5 минут
Цитата:
Сообщение от ToRcH2565
Sizeof(WideChar)
Если не уверены с длинной какого либо типа, делайте как в примере...
Последний раз редактировалось ToRcH2565; 15.01.2014 в 21:41.
Причина: Добавлено сообщение