|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
изменить значение в памяти другого процесса
Вобщем надо изменить значение в другой прогамме.
Адрес памяти всегда постоянный, (отсеял его с помощью 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
|
||||
|
||||
Особо не разбирался, но эта строчка радует:
Код:
var Buffer: Byte; //тут будет наше значение ... ReadProcessMemory(ProcessHandle, Ptr($00871714), @Buffer,NumberOfBytes, Temp); Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
||||
|
||||
Buffer это один байт, а здесь попытка считать в него все восемь, NumberOfBytes:=1;
|
#4
|
|||
|
|||
да)незаметил.с примера так скопировал)
но всё равно не помогло чтото. сделал Buffer: integer; и всё равно 0 и Temp тоже нулю всегда равен |
#5
|
||||
|
||||
Вопрос в том, что нужно считывать из памяти: если АртМоня показывает целое восьмибайтное, то тогда буфер должен быть 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
|
|||
|
|||
хмм ReadProcessMemory присваивает буферу пустое значение.
и функция bth возвращает один символ $ ,вызыая тем самым ошибку ''$' is not a valid integer value =( буфер должен быть просто Buffer: array of byte; ? ему размер указывать не нужно? (и если нужно,то как?) |
#7
|
|||
|
|||
8 байт в делфи это int64.
Кроме того надо проверить, что возвращает ReadProcessMemory, переменные Res и Temp var Buffer: int64; var res:boolean; res:=ReadProcessMemory(ProcessHandle, Ptr($00871714),@Buffer,8, Temp); |
Этот пользователь сказал Спасибо general за это полезное сообщение: | ||
Snake22 (11.09.2012)
|