[duvida] Edição de Memoria Algumas Duvidas.

Iniciado por Asskiller, 25 de Janeiro , 2009, 01:18:31 AM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

Asskiller

Estou querendo selecionar um jogo por um processo e nao mais pela janela , o processo main.exe , e depois de selecionar , editar com base no Adress inserido no edit , por um novo valor e assim fazer a edição desejada.

Irei mostrar como fiz ate agora , mas fiz pegando a janela porem eu queria pegar e o processo
Ou Selcionar o Processo atraves de um Gerenciador , por assim que abrir o jogo poderei selecionar aquele processo e ele aparece na form com tipo uma label.caption.

E depois disso tudo irei freezar o novo valor.

E na hora de escrever , adicionar ao adress um Off set , isso se possivel
Se não sem o off set.


var
Form1: TForm1;
NomeJanela : THandle;
PHandle : THandle;
PID , TID,  R : DWORD;
Escrever : DWORD;

Procedure PegarHandle(Titulo:String);
Begin
NomeJanela := FindWindow(nil, pChar(Titulo));
If NomeJanela <= 0 Then
Showmessage('Erro. Este processo não está em execução.')
else
TId := GetWindowThreadProcessId(NomeJanela, @PID);
PHandle := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
Form1.Label1.caption:= 'PID:'+ IntToStr (PID);
end;


Procedure ler(Endereco:dword);
var
Ler:dword;
valor:integer;
begin
valor:= 0;
ReadProcessMemory(PHandle,pointer(endereco),addr(valor),4,Ler);
form1.label2.Caption:= 'Valor Atual:'+ IntTostr(valor);
end;


Procedure escreve(Endereco:dword ; valor: integer);
var
w:dword;
begin
writeprocessmemory(PHandle,pointer(endereco),addr(valor),4,w);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
PegarHandle(lbltitulo.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ler(StrToInt('$' + lblendereco.text));
Tler.Enabled:=True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
escreve(StrToInt('$' + lblendereco.text),StrToInt(lblvalor.text));
button4.Enabled:=true
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
TFreeze.Enabled:=True;
button5.enabled:=true
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
TFreeze.Enabled:=false;
lblvalor.Enabled:=false
end;

procedure TForm1.TFreezeTimer(Sender: TObject);
begin
button3.click;
end;

procedure TForm1.TlerTimer(Sender: TObject);
begin
If lblendereco.text <> '' then
ler(StrToInt('$' + lblendereco.text));
end;



Resumindo , quero poder selecionar o processo de um jogo , e nao a janela.
E depois editar com base no adress que irei inserir ali no Endereço e editar um novo valor depois.

Alucard

Hi, bem entendo o que deseja fazer.
Para pegar todos os processos utiliza a função CreateToolhelp32Snapshot.
http://msdn.microsoft.com/en-us/library/ms682489(VS.85).aspx

Agora para poder editar uma parte da memória, se utiliza várias funções,
dá uma olhada no tutorial abaixo.
http://www.forum.darkers.com.br/index.php?topic=8878.0

Valeuw...

Asskiller

Alucard

Estarei dando uma olhada sobre , como pegar o processo automaticamente
Sobre os topicos que você me passou


Mas teria como dar uma olhada sobre a parte de Read e Write Process que eu citei

Por que eu quero por um Determinado Adress na Edit , e editar seu valor e depois freezar esse valor.

Como eu citei , porem , eu gostaria de aprimorar isso sendo que preciso por o OFF set na jogada.

E como que eu aplicaria isso ja usando a parte que você me mostrou

Poderia dar uma olhada e me passar o code pronto , ou me dar algumas dicas de como fazer.

Irei aguardar , Obrigado desde ja pela ajuda , esclareceu bastante !

Tem msn ?

Alucard

Citação de: Asskiller online 31 de Janeiro , 2009, 02:32:09 AM
Alucard

Estarei dando uma olhada sobre , como pegar o processo automaticamente
Sobre os topicos que você me passou


Mas teria como dar uma olhada sobre a parte de Read e Write Process que eu citei

Por que eu quero por um Determinado Adress na Edit , e editar seu valor e depois freezar esse valor.

Como eu citei , porem , eu gostaria de aprimorar isso sendo que preciso por o OFF set na jogada.

E como que eu aplicaria isso ja usando a parte que você me mostrou

Poderia dar uma olhada e me passar o code pronto , ou me dar algumas dicas de como fazer.

Irei aguardar , Obrigado desde ja pela ajuda , esclareceu bastante !

Tem msn ?
Cara tipoi para ler ou escrever na memoria,  usa-se a api ReadProcessMemory or WriteProcessMemory um exemplo.
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long

hProcess - passo basicamente o processo
lpBaseAddress - a base do endereço onde eu quero pegar
lpBuffer - o buffer que vou guardar
nSize - o tamanho da região que quero ler
lpNumberOfBytesWritten - até hoje não sei, o que isso faz.. de acordo com o MSDN esse parametro é ignorado