PDA

Просмотр полной версии : [Помогите!] Вопрос по Делфи.


Lermontov
22.03.2012, 23:36
ReadProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer; nSize: DWORD; var lpNumberOfBytesRead: DWORD): BOOL; stdcall;


Прошу объяснить эту функцию, подробно. Знаю для чего, но подробно понять не могу. Либо дайте ссылку на описание, либо посоветуйте учебник по WinApi. Все переискал нигде найти не могу. /kidding

BritishColonist
22.03.2012, 23:50
ReadProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer; nSize: DWORD; var lpNumberOfBytesRead: DWORD): BOOL; stdcall;
hProcess: THandle - это хендл процесса, предварительно открытый с помощью функции OpenProcess.
lpBaseAddress: Pointer - это адрес памяти, из которого нужно читать данные, а точнее указатель, который равен этому адресу. Но чтобы не морочить голову, держите в уме, что это просто адрес, который надо привести к типу указателя (делается это вот так: ptr(Address) - именно так выглядит типичный второй параметр данной функции).
lpBuffer: Pointer - это указатель на место, в которое нужно положить результат (это адрес переменной, массива и т.д.). Пишут так: @result - так выглядит третий параметр.
nSize: DWORD - это размер, кол-во байтов, нужных для считывания из указателя lpBaseAddress и помещения в lpBuffer. Передают 1, 2 или 4 байта, если типы byte, word и dword соответственно.
lpNumberOfBytesRead: DWORD - переменная, в которую запишется количество считанных байтов. Эта переменная может служить для проверки (если кол-во байтов в ней не равно nSize, то функция завершилась неудачно).

Вот примерчик:
var
Result, br: DWORD;
hProc: THandle;
..
begin
..
ReadProcessMemory(hProc, ptr($B27A04), @Result, 4, br);
..
end;

в Result будет содержаться значение, хранящееся в процессе hProc по адресу $B27A04, при этом br будет содержать кол-во считанных байтов (и должно быть равно 4 в случае удачного считывания).

Lermontov
23.03.2012, 22:31
Требуется помощь!

[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Хочу сделать, что бы, допустим, значение ХП показывалось в Edit, но Delphi жалуется, что несовместимые типы переменных. Я так понял, что Edit не может показать переменные типа integer (или любые числовые переменные).

Shadrincev
23.03.2012, 23:54
IntToStr
Попробуй.

Lermontov
24.03.2012, 00:08
Попробуй.

Пробовал.

BritishColonist
24.03.2012, 00:51
Lermontov, Edit1.Text := 'Health = '+IntToStr(dwHealth);
Либо так: Edit1.Text := Format('Health = %d',[dwHealth]);

reca
24.03.2012, 14:41
Требуется помощь!

[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Хочу сделать, что бы, допустим, значение ХП показывалось в Edit, но Delphi жалуется, что несовместимые типы переменных. Я так понял, что Edit не может показать переменные типа integer (или любые числовые переменные).

не рано память читать? /nyan

Lermontov
24.03.2012, 15:48
не рано память читать? /nyan

Мммм, в каком смысле?

reca
24.03.2012, 16:04
Перевести в другой формат если не получается

BritishColonist
26.03.2012, 10:43
reca, вопрос задан в ветке, предназначенной для этого. В чём проблема?

=PaLeTiZaToR=
26.03.2012, 14:32
reca, вопрос задан в ветке, предназначенной для этого. В чём проблема?

Да , согласен , что эта ветка для ВОПРОСОВ , но память действительно помоему рановато читать , есле не получается перевести формат темболее из числа в строку

Lermontov
27.03.2012, 23:14
Да , согласен , что эта ветка для ВОПРОСОВ , но память действительно помоему рановато читать , есле не получается перевести формат темболее из числа в строку

Всегда были проблемы с переводом переменной с одного типа в другой и массивы, это 2 темы которые я очень плохо знаю :sad:

Вот проблема, со чтением ника. При типе переменной - char , показывает первую букву ника, если же ставлю string( или любой другой: pchar и т.д.) Выбивает пустое поле либо ошибка. :bow:

VeTaL_UA
28.03.2012, 18:05
Lermontov, вот рабочая функция чтения Unicode строки из памяти:
function ReadPlayerName(hProcess,data:DWord): string;
var
i,rw:DWord;
ch:WideChar;
wch:array[0..255] of WideChar;
str:string;
begin
i:=0;
repeat
ReadProcessMemory(hProcess,ptr(data),@ch,2,rw);
data:=data+2;
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;
Юзать так:
var
Wnd:THandle;
hProcess,PID:DWord;
const
BA=$00B27A04;
begin
Wnd:=FindWindow('ElementClient Window',nil);
GetWindowThreadProcessId(Wnd,@PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,PID );
if hProcess<>0 then
begin
try
ReadProcessMemory(hProcess,ptr(BA),@ibuf,sizeof(ib uf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$1C),@ibuf,siz eof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$34),@ibuf,siz eof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$638),@buf,siz eof(buf),BC);
ShowMessage(ReadPlayerName(hProcess,buf));
finally
CloseHandle(hProcess);
end;
end;
end;

Lermontov
03.04.2012, 00:31
Спасибо всем кто помог:)
Хочу научится вводить инжекты в игру, пытался по этой теме- [Ссылки могут видеть только зарегистрированные и активированные пользователи] , но для новичка там все написано непонятным языком, 1 этап понял, а вот второй и третий нет :( Прошу помощи!