Ir para conteúdo
  • Cadastre-se

ReadProcessMemory - Lendo Valores de memoria sem TibiaAPI


Posts Recomendados

Aew galera... vi que a maioria aqui programa com TibiaAPI e VB... entao, resolvi criar uns tutoriais pra ver se a galera se motiva a programar em Delphi, SEM usar a API.

Vo dar um exemplo SIMPLES de como ler um valor numeral (life do char por exemplo)... e como converter ele pra uma string ( converter é uma função muito simples do proprio delphi ;/ ).

Para seguir esse tutorial, é necessário ter noção básica de delphi, e obviamente, ter o delphi... não darei muitas explicações sobre "onde por o codigo" e sim "onde podemos usá-lo"... Antes de postar algo, por favor, leia o tópico todo (mesmo se nao entender algo...) para uma melhor avaliação x.X.. No final do tuto teremos o codigo completo (caso haja duvidas)...

Vamos lá:

ReadProcessMemory

É uma função capaz de ler memoria (ahh váa), vo explicar os parametros dela (não muito explicado... kkkk, só o bastante pra entenderem como usar), e dar um exemplo.

Entãao... hora de programar \o/

Crie um novo projeto no delphi... nele adicione uma label (aba standard) e um timer (aba system)...

Antes de começar a editar os componentes e suas ações, vamos inserir essas variaveis globais:

PH : THandle;

PID, ThID: DWORD;

H : THandle;

Vamos mudar a propriedade Name da label para Vida, e deixaremos o enabled do Timer em True e o Interval em 10 (não "muito rápido", mas, o essencial para o programa de exemplo funcionar...) Agora, abaixo do Implementation... colocaremos esta função, pra ser mais pratico de se ler...
function LerInt(Address: Integer): Integer;

var

  value:integer;

  ler :dword;

begin

H := FindWindow(nil, 'Tibia');

ThID := GetWindowThreadProcessId(H, @PID);

PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);

ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler);

Result:=value;

end;

Dê dois clickes no timer, para ir ao evento do OnTimer dele... e insira o seguinte código:
vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C));

Execute (apertando F9), com o tibia aberto... (ou abra o tibia depois...sei lá), e veja a leitura acontecendo \o/ Agora sim vo explicar x.X Declaramos variaveis globais para 'preencher' os parametros da leitura de memoria.... No código da função, começamos com a linha :
H := FindWindow(nil, 'Tibia');

A ideia é achar a janela do tibia, e dar esse 'valor' pra uma variavel Handle... que é para o primeiro paremetro da função de readprocessmemory. Podemos achar a janela pela classe ou pelo titulo (caption, ou texto da janela... se preferirem), por exemplo: se eu usar: H := FindWindow('Tibiaclient', nil); // classe da janela do tibia nesse caso, é a mesma coisa de usar: H := FindWindow(nil, 'Tibia'); //nome da janela do tibia Nessa parte do códigos, definimos que temos acesso total ao programa ( o tibia )...
PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);

E finalizando, temos a leitura... Usando o PH que é uma handle com acesso aos address do tibia, o address a ser lido, o retorno do valor, usando 4 bytes, e lendo com uma variavel dword... ( se não entendeu... siga a minha escrita e as cores, e vc entende... ) ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler); E temos o resultado:
Result:=value;

Analisando a função minha, temos isso:
function LerInt(Address: Integer): Integer;

Ou seja, LerInt(Address) retornando valor integer... Assim nosso timer atualiza o valor, com o seguinte código:
vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C));  // address de vida do tibia 8.7 (se meu address não estiver errado ;P) 

Ou seja, nossa label chamada vida, tem sua propriedade caption alterada para o valor lido... mas, o valor é Integer, e a caption aceita String, então convertemos usando a função IntToStr ... ( integer Para String ;/ ).... Bom, é isso galera, acredito que muitos conhecem o ReadProcessMemory, só tentei explicar um pouco o que sei sobre a função =] Se alguém teve duvida de aonde colocar cada code...No final, teremos um código mais ou menos assim:
 


unit Unit1;


interface


uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, ExtCtrls, StdCtrls;


type

  TForm1 = class(TForm)

    vida: TLabel;

    Timer1: TTimer;

    procedure Timer1Timer(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;


var

  Form1: TForm1;

  PH : THandle;

  PID, ThID: DWORD;

  H : THandle;


implementation


   function LerInt(Address: Integer): Integer;

var

  value:integer;

  ler :dword;

begin

  H := FindWindow(nil, 'Tibia');

  ThID := GetWindowThreadProcessId(H, @PID);

  PH := OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);

  ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler);

  Result:=value;

end;


{$R *.dfm}


procedure TForm1.Timer1Timer(Sender: TObject);

begin

   vida.caption := 'Vida: '+IntToStr(Lerint($0063FD5C));

end;


end.




OBS: o code é baseado naquele classico código da internet (tem em todos foruns quase X.X )... de ler e editar pontos no pinball do windows (mas, somente a parte de leitura)..., porém fiz algumas modifcações e transformei ele em uma função...

flw, abraços....

Qualquer duvida, sugestão ou correção... podem falar =]

Link para o post
Compartilhar em outros sites

Pra quem quer realmente aprender, aconselho estudar as funções que ele usa e também a função que ele criou LerInt, é possivel fazer varias alterações dependendo do objetivo da pessoa.

O tutorial está muito bem explicado e de fácil entendimento.

REP+

"A esperança é o sonho do homem acordado."

Aristóteles

Link para o post
Compartilhar em outros sites

Dragon, muito bom o tuto, gostei bastante, tem muita coisa que eu não intendi (ainda), mais ficou bacana!

:LOL: REP+

# Regras Gerais - TibiaKing.com #
Contato: [email protected]
Não respondo dúvidas via MP.


1C2tu.png4Tlqo.png1C2tu.png


 

Link para o post
Compartilhar em outros sites

Delphi é muito bom.

Fico impressionado quando o puncker me manda os programas que ele faz no delphi em questão de hora.

Vou ver se me interesso e baixo (de novo) o delphi pra mexer e.e'

Rep+

Link para o post
Compartilhar em outros sites
  • 4 years later...

gostei do post tentei algo parecido, porem da erro..

 

nessa linha :   ReadProcessMemory(PH, Ptr(Address), @Value, 4, Ler);

 

[DCC Error] Unit1.pas(36): E2033 Types of actual and formal var parameters must be identical

 

poderia ajudar ae vlw!!

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo