Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2009, 21:12   #1
lexastik
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 16
По умолчанию Чтение данных из памяти процесса (need help)

Здравствуйте участники форума. Просмотрел множество сайтов, прежде чем попал к Вам. Раньше дело с процессом чтения из памяти не имел и поэтому много вопросов. Сейчас он стоит в следующем. Есть программа (игра), через артмани нахожу адрес памяти с переменной далее код:
Код:
program console_Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils,Graphics,Tlhelp32,Windows;

var
 cycle:boolean;
 i:integer;

function ReadTask(ExeFileName: string;Var Sp:single): Integer;
const
 PROCESS_WM_READ = $0165;
 PROCESS_WM_OPERATION = $0008;
var
 ContinueLoop: BOOLEAN;
 FSnapshotHandle: THandle;
 FProcessEntry32: TProcessEntry32;
 han,processHandle: THandle;
 SpeedPtr:^single;
 adr:pointer;
 res:boolean;
 nB: DWORD;
 st:string;
 speed:real;
begin
 Result := 0;
 FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
 ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
 speed:=0;
 sp:=1;
 while Integer(ContinueLoop) <> 0 do
 begin
   if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
     UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
     UpperCase(ExeFileName))) then
     begin
       processHandle := OpenProcess(PROCESS_VM_READ,False,FProcessEntry32.th32ProcessID);
       adr:=ptr($0165A788);
       res:=ReadProcessMemory(processHandle,adr,SpeedPtr,4,nB);
       writeln(nB);
       writeln(GetLastError());
       if res then sp:=SpeedPtr^*3.6
       else sp:=0;
//        writeln(SpeedPtr^*3.6);
       writeln(res);
       writeln(FProcessEntry32.th32ProcessID);
       writeln(processHandle);


     end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
 end;
 CloseHandle(FSnapshotHandle);
end;
Я думаю загвоздка в выделенном тексте, это там где указывается VM_Read, но как ее решить не знаю. Ошибка 998 последняя.

Помогите пожалуйста разобраться.

Последний раз редактировалось rpy3uH; 25.02.2009 в 21:21.
lexastik вне форума Ответить с цитированием
Старый 25.02.2009, 23:04   #2
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

Вообще константа в делфи прописана. Поэтому возможно ошибка в ней, а с другой стороны возможно стоит получить полные права

To open a handle to another local process and obtain full access rights, you must enable the SeDebugPrivilege privilege. For more information, see Changing Privileges in a Token.
Д'якон вне форума Ответить с цитированием
Старый 25.02.2009, 23:16   #3
lexastik
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 16
По умолчанию

А как можно определить PROCESS_WM_READ для другого процесса? Код не мой, но как раз то что надо, но вот что конкретно туда подставить...Еще попробую с привелегиями.
lexastik вне форума Ответить с цитированием
Старый 25.02.2009, 23:49   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

PROCESS_VM_READ = $0010;
константы уже определены в windows.pas
пыщь
JTG вне форума Ответить с цитированием
Старый 26.02.2009, 07:03   #5
lexastik
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 16
По умолчанию

До этого стояло $0010, но было тоже самое. Может быть такое, что программа не дает считывать данные с адреса? Хотя артмани читает же...или адрес в артмани не верный??? Думал может хэндл не верный, брал хэндл окна, но с ним вообще ошибка №6.
lexastik вне форума Ответить с цитированием
Старый 26.02.2009, 10:30   #6
lexastik
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 16
По умолчанию

Попробовал другой адрес, теперь ошибка 299. Как определить адрес памяти не самой переменной, а процесса, начальный адрес. Я вот поставил 0000091С и стала ошибку давать 299, на след запуск адрес уже нужно было ставить 0000F04....
lexastik вне форума Ответить с цитированием
Старый 26.02.2009, 10:35   #7
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

у процесса нет начального адреса. Есть начальный адерс его образа, а это уже не так просто определить. Для того чтобы узнать выделен ли участок виртуальной памяти процесса надо юзать функцию VirtualQueryEx
rpy3uH вне форума Ответить с цитированием
Старый 26.02.2009, 13:41   #8
lexastik
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 16
По умолчанию

VirtualQueryEx указал, что размер региона 64кбайта. Как сделать перемещение по адресам памяти или это заложено в PROCESS_WM_READ = $0010 и PROCESS_WM_OPERATION = $0008. Само значение VirtualQueryEx равно 28, так же как и SizeOf(mbi)
lexastik вне форума Ответить с цитированием
Старый 26.02.2009, 14:55   #9
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

С указателями путаница, вот рабочий вариант для ctfmon.exe

Код:
program Project2;

{$APPTYPE CONSOLE}

uses
 SysUtils,Graphics,Tlhelp32,Windows;

var
 cycle:boolean;
 i:integer;

function ReadTask(ExeFileName: string;Var Sp:single): Integer;
var
 ContinueLoop: BOOLEAN;
 FSnapshotHandle: THandle;
 FProcessEntry32: TProcessEntry32;
 han,processHandle: THandle;
 SpeedPtr:single; //тут не указатель
 adr:pointer;
 res:boolean;
 nB: DWORD;
 st:string;
 speed:real;
begin
 Result := 0;
 FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
 ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
 speed:=0;
 sp:=1;
 while Integer(ContinueLoop) <> 0 do
 begin
   if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
     UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
     UpperCase(ExeFileName))) then
     begin
       processHandle := OpenProcess(PROCESS_VM_READ,False,FProcessEntry32.th32ProcessID);
       Win32Check(longbool(processHandle)); //делает GelLastError и выводит код и текст ошибки

       adr:=ptr($00400000); 

       res:=ReadProcessMemory(processHandle,adr,addr(SpeedPtr),4,nB);
       Win32Check(longbool(res));

       writeln('Process ID: ', FProcessEntry32.th32ProcessID);
       writeln('Process handle: ', processHandle);
       writeln('Bytes readed: ', nB);
       writeln('ReadProcessMemory result: ', res);
       writeln('Value @ 00400000: ', SpeedPtr);
       writeln('-------------------------------------------');

//       if res then sp:=SpeedPtr^*3.6
//       else sp:=0;
//       writeln(SpeedPtr^*3.6);
     end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
 end;
 CloseHandle(FSnapshotHandle);
end;

var s: single;

begin
 ReadTask('ctfmon.exe', s);
 readln;
end.
и ещё: экзешники чаще всего грузятся начиная с 00400000, т.е. адрес переменной будет например 0041FF61, а у тебя 0165A788 (хотя и такое тоже бывает, если при сборке специально указали другой базовый адрес загрузки), я вот не помню в каком виде артмани выдаёт адреса переменных - "нормальный" виртуальный адрес или что-то своё.
пыщь
JTG вне форума Ответить с цитированием
Старый 26.02.2009, 16:52   #10
lexastik
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 16
По умолчанию

ГРОМАДНЕЙШЕЕ СПАСИБО!!! ОЧЕНЬ ПОМОГЛИ!!! В артмани судя по всему указатель, но почему то этот указатель на адрес тот, что меньше указанного Вами, поэтому выдает ошибку 299. Можно пообщаться в ICQ?
lexastik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение адреса памяти чужого процесса XAOC-forever Общие вопросы Delphi 2 15.12.2008 09:03
Баг с чтением из внтуренней памяти процесса. Ivan_32 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 13.12.2008 15:22
Редактирование памяти процесса (Delphi) Air Помощь студентам 4 17.10.2008 15:19
Редактирование памяти процесса Air Win Api 6 16.02.2008 20:15