Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.04.04;
Скачать: CL | DM;

Вниз

Как узнать значения в чужих приложениях?   Найти похожие ветки 

 
Danco ©   (2010-01-29 02:39) [0]

Доброго времени суток мастера :)

Подскажите как узнать значения в чужом приложении, точнее 3D игре, а если еще точнее, то в PerfectWorld?

Если, кто юзал игру, то поймет о чем идет речь. В общем нужны координаты персонажа x и y. Гуглил и нашел только подобный код, но не на делфи а на Autoit:


#include <NomadMemory.au3>
$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-01-29 09:32) [1]


> Danco ©   (29.01.10 02:39)  

> Или дать ссылки на изучения матерьяла :)

http://msdn.microsoft.com/en-us/library/ms679303(VS.85).aspx
ReadProcessMemory function.

--
Regards, LVT.


 
Danco ©   (2010-01-29 22:47) [2]

Спасибо 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? :/


 
Danco ©   (2010-01-29 23:07) [3]

Немного еще доперло до моих мозгов )

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;


Что тут подправить? :(


 
Leonid Troyanovsky ©   (2010-01-30 13:48) [4]


> Danco ©   (29.01.10 23:07) [3]

> Что тут подправить? :(

Во-первых, положено:
Win32Check(HandleWindow <> 0);
Win32Check(ReadProcessMemory());

Во-вторых, MainReadByteIZFile возвращает пустую строку,
а должна была, хотя бы, Result := IntToStr(ipBuf).

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2010-01-30 13:57) [5]


> Danco ©   (29.01.10 23:07) [3]

> Что тут подправить? :(

Во-первых, положено:
Win32Check(HandleWindow <> 0);
Win32Check(ReadProcessMemory());

Во-вторых, MainReadByteIZFile возвращает пустую строку,
а должна была, хотя бы, Result := IntToStr(ipBuf).

--
Regards, LVT.


 
Danco ©   (2010-01-31 15:49) [6]

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-02-01 11:49) [7]


> Danco ©   (31.01.10 15:49) [6]

ReadProcessMemory(HandleWindow, MainAddress

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2010.04.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.006 c
2-1265207702
HF-Trade
2010-02-03 17:35
2010.04.04
GetPixel


3-1220246663
Finjy
2008-09-01 09:24
2010.04.04
Закрасить строку в ListView


1-1247389218
dmitry_12_08_73
2009-07-12 13:00
2010.04.04
Прокрутка и копирование содержимого веб-страницы


2-1264742431
Б
2010-01-29 08:20
2010.04.04
AlphaBlend без TransparentColor.


6-1216320126
alexda
2008-07-17 22:42
2010.04.04
Socket Error