![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать значения в чужих приложениях? [D6]
Danco © (2010-01-29 02:39:00)Доброго времени суток мастера :)
Подскажите как узнать значения в чужом приложении, точнее 3D игре, а если еще точнее, то в PerfectWorld?
Если, кто юзал игру, то поймет о чем идет речь. В общем нужны координаты персонажа x и y. Гуглил и нашел только подобный код, но не на делфи а на Autoit:
#include
$PID = ProcessExists("elementclient.exe")
$Handle = _MemoryOpen($PID)
$x = _MemoryRead(0x009771BC,$Handle)
$x = _MemoryRead($x+0x20,$Handle)
$x= _MemoryRead($x+0x3C,$Handle)
MsgBox(0,"Test X","your x: " & $x &"." )
Полностью в этом вопросе признаюсь нуб, но может мне кто-нибудь подскажет, как это реализовать на Delphi?
Или дать ссылки на изучения матерьяла :)
Leonid Troyanovsky (2010-02-01 11:49:00) [1]
> Danco © (31.01.10 15:49) [6]
ReadProcessMemory(HandleWindow, MainAddress
--
Regards, LVT.
Danco (2010-01-31 15:49:00) [2]
function FindProcess(name: string): Cardinal;
var
hSnapshot: THandle;
lppe: TProcessEntry32;
begin
Result := 0;
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if hSnapshot = 0 then
exit;
lppe.dwSize := SizeOf(TProcessEntry32);
if Process32First(hSnapshot,lppe) then
repeat
if name = ExtractFileName(lppe.szExeFile) then
begin
Result := lppe.th32ProcessID;
break;
end;
until not Process32Next(hSnapshot,lppe);
CloseHandle(hSnapshot);
end;
function MainReadByteIZFile(MainAddress, IDAgent:Cardinal):String;
var HandleWindow : cardinal;
ipBase: Pointer;
IpBuf : longint;
numberRead: DWORD;
begin
HandleWindow:=OpenProcess(PROCESS_VM_READ,False,IDAgent);
if Win32Check(HandleWindow <> 0) then
begin
ipBase:=ptr($00000000);
Win32Check(ReadProcessMemory(HandleWindow, ipBase, Addr(ipbuf), 4, numberRead));
CloseHandle(HandleWindow);
Result := IntToStr(ipBuf);
end else
Result := IntToStr(0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption:=MainReadByteIZFile($02253644,FindProcess('Edittitle.exe'));
end;
Теперь выдает ошибку:
Peoject Projec1.exe raised exception class EOSError with message 'SystemError. Code:87. Параметр задан не верно'. Process stopped. Use Sep or Run to contine.
Какой парамтр не верно? Или я фигню какуюто написал а не код? О_о
Leonid Troyanovsky (2010-01-30 13:57:00) [3]
> Danco © (29.01.10 23:07) [3]
> Что тут подправить? :(
Во-первых, положено:
Win32Check(HandleWindow <> 0);
Win32Check(ReadProcessMemory());
Во-вторых, MainReadByteIZFile возвращает пустую строку,
а должна была, хотя бы, Result := IntToStr(ipBuf).
--
Regards, LVT.
Leonid Troyanovsky (2010-01-30 13:48:00) [4]
> Danco © (29.01.10 23:07) [3]
> Что тут подправить? :(
Во-первых, положено:
Win32Check(HandleWindow <> 0);
Win32Check(ReadProcessMemory());
Во-вторых, MainReadByteIZFile возвращает пустую строку,
а должна была, хотя бы, Result := IntToStr(ipBuf).
--
Regards, LVT.
Danco (2010-01-29 23:07:00) [5]Немного еще доперло до моих мозгов )
ID процесса можно найти таким методом:
function FindProcess(name: string): Cardinal;
var
hSnapshot: THandle;
lppe: TProcessEntry32;
begin
Result := 0;
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if hSnapshot = 0 then
exit;
lppe.dwSize := SizeOf(TProcessEntry32);
if Process32First(hSnapshot,lppe) then
repeat
if name = ExtractFileName(lppe.szExeFile) then
begin
Result := lppe.th32ProcessID;
break;
end;
until not Process32Next(hSnapshot,lppe);
CloseHandle(hSnapshot);
end;
Но поэксперементировал на своем проекте и выводит пустую строку (память $021D44CC беру через артмани)
function FindProcess(name: string): Cardinal;
var
hSnapshot: THandle;
lppe: TProcessEntry32;
begin
Result := 0;
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if hSnapshot = 0 then
exit;
lppe.dwSize := SizeOf(TProcessEntry32);
if Process32First(hSnapshot,lppe) then
repeat
if name = ExtractFileName(lppe.szExeFile) then
begin
Result := lppe.th32ProcessID;
break;
end;
until not Process32Next(hSnapshot,lppe);
CloseHandle(hSnapshot);
end;
function MainReadByteIZFile(MainAddress, IDAgent:Cardinal):String;
var HandleWindow : cardinal;
ipBase: Pointer;
IpBuf : longint;
numberRead: DWORD;
begin
HandleWindow:=OpenProcess(PROCESS_VM_READ,False,IDAgent);
ipBase:=ptr($021D44CC);
ReadProcessMemory(HandleWindow, ipBase, Addr(ipbuf), 4, numberRead);
CloseHandle(HandleWindow);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Caption:=MainReadByteIZFile(0,FindProcess('Project2.exe'));
end;
Что тут подправить? :(
Danco (2010-01-29 22:47:00) [6]Спасибо Leonid Troyanovsky
Немного понял, но совсем немного :)
function MainReadByteIZFile(MainAddress, IDAgent:Cardinal):String;
var HandleWindow : cardinal;
ipBase: Pointer;
IpBuf : longint;
numberRead: DWORD;
begin
HandleWindow:=OpenProcess(PROCESS_VM_READ,False,IDAgent);
ipBase:=ptr($009771BC);
ReadProcessMemory(HandleWindow, ipBase, Addr(ipbuf), 4, numberRead);
CloseHandle(HandleWindow);
end;
Нашел подобную функцию, но что-то не понимаю как ей пользоваться.
MainReadByteIZFile(?,?);
Что именно сюда вписывать? Что такое MainAddress и IDAgent? :/
Leonid Troyanovsky (2010-01-29 09:32:00) [7]
> Danco © (29.01.10 02:39)
> Или дать ссылки на изучения матерьяла :)
http://msdn.microsoft.com/en-us/library/ms679303(VS.85).aspx
ReadProcessMemory function.
--
Regards, LVT.