Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

разный результат выполнения одного кода на разных физических машинах

-

Общение разработчиков

- Программирование для Perfect World, общение и обсуждене разработок

Ответ
 
Опции темы
Старый 11.01.2014, 14:11   #1
 Разведчик
Аватар для scitelz
 
scitelz никому не известный тип
Регистрация: 25.01.2013
Сообщений: 13
Популярность: 10
Сказал(а) спасибо: 7
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию разный результат выполнения одного кода на разных физических машинах

День добрый, мм подскажите почему выполнение данного кода на разных машинах выдает разный результат?
Конкретно, на второй машине хп берется рандомное, на параллельной машине все работает нормально и все отслеживает с точностью.


Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
KlientWindow := FindWindow(nil, PChar('Perfect World')); 
GetWindowThreadProcessId(KlientWindow,@ProcessId);П.
hProcess := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); 

end;
//______________________________________________________________________________

procedure TForm1.Timer1Timer(Sender: TObject);
 var HP,HPMax,MP,MPMax,n: Integer;
    WHP,WHPMax,WMP,WMPMax: DWord;
    d1, d2: DWord;
    NoB: SIZE_T;
    names: array [0..255] of char;
    namesptr: DWord;
    strname: string;
begin
  try 
    ReadProcessMemory (hProcess, Pointer(Game_Address), @WHP, sizeof(WHP), NoB);
    ReadProcessMemory (hProcess, Pointer(WHP+host_player_struct_offset), @WHP, sizeof(WHP), NoB);
    ReadProcessMemory (hProcess, Pointer(WHP+host_player_hp_offset), @WHP, sizeof(WHP), NoB);
    HP := Integer(WHP); 
    Label1.Caption := IntToStr(HP);
  except
    ShowMessage('капец');
  end;

  
end;

Последний раз редактировалось scitelz; 11.01.2014 в 14:37.
  Ответить с цитированием
Старый 11.01.2014, 15:29   #2
 Пехотинец
Аватар для ToRcH2565
 
ToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известен
Регистрация: 02.08.2009
Сообщений: 57
Популярность: 417
Сказал(а) спасибо: 12
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: разный результат выполнения одного кода на разных физических машинах

Цитата:
Сообщение от scitelzПосмотреть сообщение
HP := Integer(WHP);

Цитата:
Сообщение от scitelzПосмотреть сообщение
WHP,...: DWord;

Вам данные типы данных разными не показались? это для начала...

Вот для начала исправте на:
HP := Cardinal(WHP);//Dword = Cardinal != Integer.
  Ответить с цитированием
Старый 11.01.2014, 15:33   #3
 Разведчик
Аватар для scitelz
 
scitelz никому не известный тип
Регистрация: 25.01.2013
Сообщений: 13
Популярность: 10
Сказал(а) спасибо: 7
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию 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;
  Ответить с цитированием
Старый 11.01.2014, 15:40   #4
 Пехотинец
Аватар для ToRcH2565
 
ToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известен
Регистрация: 02.08.2009
Сообщений: 57
Популярность: 417
Сказал(а) спасибо: 12
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию 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;
Представте как сократится код если чтений больше чем хп\мп?)

Добавлено через 2 минуты

Цитата:
Сообщение от scitelzПосмотреть сообщение
strname:=WideCharToString(names);

WTF??? у вас делфи какая?

Добавлено через 8 минут
Цитата:
Сообщение от scitelzПосмотреть сообщение
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);

Это вынести из цикла! одни и теже чтения тыщи раз



Цитата:
Сообщение от scitelzПосмотреть сообщение
ReadProcessMemory(hProcess,Pointer(namesptr+$0), @names,128,NoB);

WTF?? компилятор конечно +0 уберет) но всеже WTF??


Далее нехватает кода функции
Цитата:
Сообщение от scitelzПосмотреть сообщение
WideCharToString

Ибо как в ней происходит преобразование я не в курсе)
Дальше больше...
Можно читать сразу в строку) только задав ей размер...
Код:
Var
  s:string
Begin
  SetLength(s,100);
  ReadProcessMemory(hProcess, Pointer(StringAdr), @S[1], 100, NoB);
  MyStr=AnsiString(S);
  FillChar(s,#0,100);
зы. весь код набирался тут, так что названия переменных и порядок следования параметров может быть неверным.

Последний раз редактировалось ToRcH2565; 11.01.2014 в 15:50. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 11.01.2014, 15:53   #5
 Разведчик
Аватар для scitelz
 
scitelz никому не известный тип
Регистрация: 25.01.2013
Сообщений: 13
Популярность: 10
Сказал(а) спасибо: 7
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: разный результат выполнения одного кода на разных физических машинах

Цитата:
WTF??? у вас делфи какая?

XE5

Добавлено через 3 минуты
спасибо за развернутость, буду ковырять, многократность все равно не ушла правда, но буду разбираться, спасибо

Последний раз редактировалось scitelz; 11.01.2014 в 16:11. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 11.01.2014, 21:06   #6
-= Мастер Света =-
 Рыцарь-капитан
Аватар для Ginrey
 
Ginrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака НоррисаGinrey троюродный дядя Чака Норриса
Регистрация: 14.06.2012
Сообщений: 511
Популярность: 7566
Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
 
По умолчанию Re: разный результат выполнения одного кода на разных физических машинах

Цитата:
Сообщение от scitelzПосмотреть сообщение
многократность все равно не ушла правда

а вы посмотрите , что вообще записывается в имена, вполне возможно что ваша строка просто дважды повторяется в игре под определенным адресом
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо"

Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
  Ответить с цитированием
Старый 12.01.2014, 01:41   #7
 Пехотинец
Аватар для ToRcH2565
 
ToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известен
Регистрация: 02.08.2009
Сообщений: 57
Популярность: 417
Сказал(а) спасибо: 12
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию 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. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 14.01.2014, 13:21   #8
 Разведчик
Аватар для scitelz
 
scitelz никому не известный тип
Регистрация: 25.01.2013
Сообщений: 13
Популярность: 10
Сказал(а) спасибо: 7
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: разный результат выполнения одного кода на разных физических машинах

ну множества и тд с этим разбираюсь так и не убрал пока, однако на данном этапе меня больше интересует с чего вдруг на разных машинах разные значения. На том пк, на котором компилится все норм, - на ноутбуке цифры взятые с потолка и меняющиеся по ивенту таймера.
Цитата:
дальше можно например максимально значение жизней

ХП по большому счету и не нужны, основное это отображение окружающих, однако данная проблема забавна - когда на разных пк разные вариации

переменные
Код:
 base_address : integer = $0C38B6C;
 Game_Address : integer = $0C392CC;
 host_player_struct_offset : integer = $34;
 host_player_hp_offset : integer = $4A8;
Код:
Function ReadProcMemCardinal(Handler,address:Cardinal):cardinal;
Var
    NoB: SIZE_T;
Begin
    ReadProcessMemory (Handler, Pointer(Address), @Result, 4 , NoB);
end;
ищу окно игры
Код:
KlientWindow := FindWindow(nil, PChar('Perfect World'));
GetWindowThreadProcessId(KlientWindow,@ProcessId);
hProcess := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); 
Timer1.Enabled := True;
читаю хп
Код:
try
    PStruct := ReadProcMemCardinal(hProcess, 
                                          ReadProcMemCardinal(hProcess,Game_Address)+host_player_struct_offset);
    HP := ReadProcMemCardinal(hProcess, PStruct+host_player_hp_offset);
    Label1.Caption := IntToStr(HP);
  except
    ShowMessage('error###');
  end;

Последний раз редактировалось scitelz; 14.01.2014 в 13:29.
  Ответить с цитированием
Старый 14.01.2014, 20:06   #9
 Пехотинец
Аватар для ToRcH2565
 
ToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известен
Регистрация: 02.08.2009
Сообщений: 57
Популярность: 417
Сказал(а) спасибо: 12
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: разный результат выполнения одного кода на разных физических машинах

до хп путь если мне не изменяет память таков на данный момент
BA + $1C + $34 + $494
пробуйте прочесть не от GA а от BA.
  Ответить с цитированием
Старый 14.01.2014, 20:25   #10
 Разведчик
Аватар для fds255
 
fds255 скоро будет известенfds255 скоро будет известенfds255 скоро будет известенfds255 скоро будет известенfds255 скоро будет известен
Регистрация: 23.06.2012
Сообщений: 43
Популярность: 427
Сказал(а) спасибо: 18
Поблагодарили 59 раз(а) в 35 сообщениях
 
По умолчанию Re: разный результат выполнения одного кода на разных физических машинах

Цитата:
до хп путь если мне не изменяет память таков на данный момент
BA + $1C + $34 + $494
пробуйте прочесть не от GA а от BA.

Изменяет ), HP для версии клиента 1.5.0 действительно $4A8, $494 для версии клиента 1.4.6.

А вот насчет чтения от BA согласен, и еще нужно попробовать все же так:

Код:
ReadProcessMemory(hProcess,Pointer($00C38B6C),@WMN,4,NoB);
ReadProcessMemory(hProcess,Pointer(WMN+$1C),@WMN,4,NoB);
ReadProcessMemory(hProcess,Pointer(WMN+$34),@PERS_STRUCT,4,NoB);
ReadProcessMemory(hProcess,Pointer(PERS_STRUCT+$4A8),@HP,4,NoB);
________________
MultiXBot
MultiX_POT

Последний раз редактировалось fds255; 14.01.2014 в 20:36.
  Ответить с цитированием
Старый 14.01.2014, 21:02   #11
 Пехотинец
Аватар для ToRcH2565
 
ToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известен
Регистрация: 02.08.2009
Сообщений: 57
Популярность: 417
Сказал(а) спасибо: 12
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию Re: разный результат выполнения одного кода на разных физических машинах

Ну последний раз писать офсеты ручками мне и приходилось на 145-146, отложилось в памяти))) ... дальше все в базу заливал и оттуда таскал спокойненько...
Цитата:
Сообщение от fds255Посмотреть сообщение
А вот насчет чтения от BA согласен, и еще нужно попробовать все же так:

хм, смысл забивать BA и смещения константой... просто отладчиком пройтись и проверить....)
в делфях при трассировке кода(а вдруг кто не знает) можно просто навести на название переменной и во всплывающем окошке увидеть ее значение...)
  Ответить с цитированием
Старый 15.01.2014, 01:42   #12
 Разведчик
Аватар для scitelz
 
scitelz никому не известный тип
Регистрация: 25.01.2013
Сообщений: 13
Популярность: 10
Сказал(а) спасибо: 7
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию 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.
  Ответить с цитированием
Старый 15.01.2014, 14:25   #13
 Сержант
Аватар для pw.assistant
 
pw.assistant излучает ауруpw.assistant излучает ауруpw.assistant излучает ауруpw.assistant излучает ауруpw.assistant излучает ауруpw.assistant излучает ауру
Регистрация: 16.02.2012
Сообщений: 105
Популярность: 651
Сказал(а) спасибо: 19
Поблагодарили 39 раз(а) в 31 сообщениях
 
По умолчанию Re: разный результат выполнения одного кода на разных физических машинах

Код:
var
   ch: widechar;

               ....

ReadProcessMemory(hProc,Pointer(data),@ch,4,rw);

               ....
widechar = 2 байта, а не 4
________________
backup - акт проявления трусости

Последний раз редактировалось pw.assistant; 15.01.2014 в 14:28.
  Ответить с цитированием
Старый 15.01.2014, 21:36   #14
 Пехотинец
Аватар для ToRcH2565
 
ToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известенToRcH2565 скоро будет известен
Регистрация: 02.08.2009
Сообщений: 57
Популярность: 417
Сказал(а) спасибо: 12
Поблагодарили 1 раз в 1 сообщении
 
По умолчанию 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. Причина: Добавлено сообщение
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 06:52.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net