Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.07.2012, 02:15
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию изменить значение в памяти другого процесса

Вобщем надо изменить значение в другой прогамме.
Адрес памяти всегда постоянный, (отсеял его с помощью ArtMoney)
адрес 00871714
нашел в интернете как считывать изменять данные в программе,но уменя не работает =(
вот листинг программы,посмотрите что не так
Код:
uses ...TlHelp32;

//функция поиска хендла по имени exe файла прогаммы
function GetProcessByEXE(exename:string):thandle;
var
  I: Integer;
  hSnapshoot: THandle;
  pe32: TProcessEntry32;

  proc:thandle;
begin
  result:=0;
  hSnapshoot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  if (hSnapshoot = -1) then
      Exit;
  pe32.dwSize := SizeOf(TProcessEntry32);
  if (Process32First(hSnapshoot, pe32)) then
  repeat
  if (pe32.szExeFile=exename)then
     begin
     result:=pe32.th32ProcessID;
     exit;
     end;
  until not Process32Next(hSnapshoot, pe32);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  GameScreen: HWND; //хендл процесса
  Buffer: Byte; //тут будет наше значение
  ProcessIdentifier, ProcessHandle, Temp: Cardinal;
  NumberOfBytes: byte;// количество байт

begin
NumberOfBytes:=8;
  GameScreen := GetProcessByEXE('proga.exe');
  if GameScreen <> 0 then
  begin
    GetWindowThreadProcessId(GameScreen, @ProcessIdentifier);
    ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessIdentifier);
    ReadProcessMemory(ProcessHandle, Ptr($00871714), @Buffer,NumberOfBytes, Temp);    
    ShowMessage( IntToStr(Buffer) );
    //Buffer:=5; //пока не надо
    //WriteProcessMemory(ProcessHandle,Ptr($00871714),@Buffer,NumberOfBytes,Temp);
    Closehandle(ProcessHandle);

  end;
end;
при считывании всё время возвращается ноль. хотя там не ноль.
еще,где NumberOfBytes:=8; это АртМоней показывает Тип-целое, 8байт. вроде правильно подставил?
Хенд процесса возвращается правильный, сверял с АртМонием.
Где косяк?
еще я слышал что дельфи шестнадцатеричные числа както в обратном порядке читает.может адрес памяти переконвертировать както надо?

Последний раз редактировалось Snake22, 21.07.2012 в 02:17.
Ответить с цитированием
  #2  
Старый 21.07.2012, 04:58
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Особо не разбирался, но эта строчка радует:
Код:
var
  Buffer: Byte; //тут будет наше значение
...
ReadProcessMemory(ProcessHandle, Ptr($00871714), @Buffer,NumberOfBytes, Temp);
что можно прочитать в Byte при запросе 8 байт? Укажи буфер достаточного размера, необязательно 8 байт, можно и больше, ну уж никак не меньше. Заодно проверяй значение переменной Temp, сколько реально считалось.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 21.07.2012, 04:59
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Buffer это один байт, а здесь попытка считать в него все восемь, NumberOfBytes:=1;
Ответить с цитированием
  #4  
Старый 21.07.2012, 05:34
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

да)незаметил.с примера так скопировал)
но всё равно не помогло чтото.
сделал Buffer: integer; и всё равно 0
и Temp тоже нулю всегда равен
Ответить с цитированием
  #5  
Старый 21.07.2012, 05:48
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вопрос в том, что нужно считывать из памяти: если АртМоня показывает целое восьмибайтное, то тогда буфер должен быть array[1..8] of byte и после получения его надо преобразовать к integer, например, так:
Код:
function bth(ds: array of byte): integer;
   var
   i: integer;
   s: string;
  begin
  s:= '$';
  for i := High(ds) downto Low(ds) do
  s:= s + IntToHex(ds[i], 2);
  Result:= StrToInt(s);
  end;

...
bth(Buffer);
...

Последний раз редактировалось Alegun, 21.07.2012 в 05:55.
Ответить с цитированием
  #6  
Старый 21.07.2012, 05:55
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

хмм ReadProcessMemory присваивает буферу пустое значение.
и функция bth возвращает один символ $ ,вызыая тем самым ошибку
''$' is not a valid integer value =(

буфер должен быть просто Buffer: array of byte; ? ему размер указывать не нужно? (и если нужно,то как?)
Ответить с цитированием
  #7  
Старый 21.07.2012, 11:05
general general вне форума
Прохожий
 
Регистрация: 21.07.2012
Сообщения: 1
Репутация: 10
Восклицание

8 байт в делфи это int64.
Кроме того надо проверить, что возвращает ReadProcessMemory, переменные Res и Temp

var Buffer: int64;
var res:boolean;

res:=ReadProcessMemory(ProcessHandle, Ptr($00871714),@Buffer,8, Temp);
Ответить с цитированием
Этот пользователь сказал Спасибо general за это полезное сообщение:
Snake22 (11.09.2012)
  #8  
Старый 21.07.2012, 11:12
Аватар для ined
ined ined вне форума
Начинающий
 
Регистрация: 16.11.2008
Адрес: Российская Федерация!! :)
Сообщения: 165
Версия Delphi: Delphi 2010
Репутация: 1272
По умолчанию

А ты вот это читал?
__________________
11011111 INED Home code
VK
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter