Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать значения в чужих приложениях? [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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо