Ir para conteúdo
Fórum Script Brasil
  • 0

Ponteiro


Guest - Jorge -

Pergunta

Quando derreferencio um ponteiro qualquer que não esteja num endereço reservado para o programa ocorre um erro -> 'Access Violation, read of address xxx ... ; alguém sabe como posso desabilitar esse erro e acessar a memória normalmente?

obs : eu uso o delphi 6.0;

obrigado.

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Vou dar um exemplo do problema que eu estou tendo. Veja o seguinte código:

"

procedure Form1.Button1Click(Sender : TObject);

Type

PC = ^Char;

var

I : Byte;

st : string;

begin

st:='';

for i:=0 to 50 do st:=st+PC($B5676+i)^;

Memo1.lines.add(st);

end;

"

esse código produzirá um erro tipo -> "Access violation at address 0044FC70 in module 'Project1.exe'. Read of address 000B5676".

Eu gostaria de saber se tem alguma maneira de evitar que esse erro aconteça e que eu possa acessar o endereço $B5676 normalmente e trabalhar com seu valor.

Obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

tem sim, agora porque este endereço, ele é dinâmico ou estático?

digo porque se for estático é só criar uma funçao pra ler o endereço de memória

no caso ser dinâmico, exemplo, o que você quer acessar, ler, gravar muda a cada execução do programa, ai você terá que obtê-lo primeiro

tenta assim exemplo

function memoryreadstring(_address: integer): string;

function bytetostr(_byte: byte): string;

var

i, n : integer;

begin

result := '00000000';

n := 128;

for i := 1 to 8 do

begin

if _byte >= n then

begin

result := '1';

Dec(_byte, n);

end;

n := n div 2;

end;

end;

var

pid: DWORD;

pidhandle: THandle;

str: array [0..255] of byte;

begin

getwindowthreadprocessid(Application.Handle, @pid);

pidhandle := openprocess(PROCESS_ALL_ACCESS, false, pid);

if (pidhandle = 0) then exit;

ReadProcessMemory(pidhandle, ptr(_address), @str[0], 255, 0);

result := bytetostr(str[0]);

closehandle(pidhandle);

end;

no seu caso seria... exemplo

procedure Form1.Button1Click(Sender : TObject);

var

I : Byte;

st: string;

begin

for i:=0 to 50 do

st := st+ memoryreadstring($B5676 + i);

Memo1.lines.add(st);

end;

seria mais ou menos isso?

vale lembrar o seguinte, você faz um loop até 50 lendo o endereço $B5676...

o q pode acontecer é que não há um ponteiro reservado do 0 até 50 com base nesse endereço, ai ele vai dar access violation

se ta fazendo um cheat? crack?

se você der maiores detalhes do que quer fazer talvez fique mais fácil ajudar

abraços

Link para o comentário
Compartilhar em outros sites

  • 0

O negócio da string era só um exemplo. Não precisa transformar byte em string, é só acessar o valor. E outra, o seu código deu erro de compilação. Mas precisa desse código todo só pra acessar um byte da memória?

E também gostaria de saber qual a capacidade de endereçamento do ponteiro do delphi, que acredito ter 32 bits. pergunto isso porque o ponteiro do Turbo Pascal também tem 32 bits, o que seria suficiente para endereçar 4GB; Mas não endereça mais doque 1MB. Isso porque o ponteiro do Turbo Pascal é dividido em 2 inteiros de 16 bits, o primeiro quantifica quantos segmento de 16 bytes deve contar a partir do endereço 0, e o segundo é quantos bytes deve somar a esse total, totalizando um pouco mais de 1MB. Por isso gostaria de saber quantos Megas o ponteiro do delphi é capaz de endereçar; se segue o mesmo sistema ou não, e se é capaz de acessar toda a RAM ou apenas uma parte ou tipo. E também, o ponteiro do Pascal eu acessava qualquer endereço da forma como eu exemplifiquei sem qualquer erro ou impedimento. Obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

essa função q passei é mais válida para trabalhar com memoria em aplicativos externos, tipo pra se fazer cheat e tal

sobre o erro de compilacao deve ser na linha

ReadProcessMemory(pidhandle, ptr(_address), @str[0], 255, 0);

acredito q seja um bug no compilador do delphi, pra resolver isso no delphi 6 declare uma variavel global tipo

var

zero: DWORD = 0;

ai você coloca

ReadProcessMemory(pidhandle, ptr(_address), @str[0], 255, zero);

horrivel não é?, mas eu não achei outra solucao o compilador não passa ali e o valor é o mesmo

realmente eu não entendi o porque do $B5676 então vo passar uns exemplos trabalhando com ponteiros

tipo

variavel global

i: integer;

no oncreate você coloca i := 0; por exemplo

procedure TForm1.FormCreate(Sender: TObject);

begin

I := 0;

end;

function soma(n :Integer): integer;

var

pi: ^Integer;

begin

pi := @i;

pi^ := n + pi^;

result := pi^;

end;

pra usar a função exemplo

procedure TForm1.Button1Click(Sender: TObject);

begin

showmessage(IntToStr(Soma(10)));

end;

exemplo inutil porque era mais facil fazer i := i + 10 aahuhuah

porém é pra você ver mais ou menos como trabalha com ponteiros

outro exemplo

procedure TForm1.Button1Click(Sender: TObject);

var

i: integer;

buff: string;

buffptr: pchar;

begin

buff := 'Script Brasil';

i := 1;

buffptr := addr(buff);

for i := 0 to length(buff) do

begin

showmessage(buffptr^);

inc(i);

inc(buffptr);

end;

//vai mostrar uma mensagem letra por letra do valor da variavel buff

end;

sobre o que você falou sobre a capacidade do ponteiro do delphi eu já não sei te responder, não tenho experiência com isso pois só mexi uma vez com essa parte pra aprender a fazer cheat de jogo então a parte teórica não sei nada.

sei q não vai resolver os exemplos mais talvez ajude

abraços

Link para o comentário
Compartilhar em outros sites

  • 0

É, eu sei como trabalhar com ponteiros, o problema é só o access violation.

Ah, o seu código tem um errinho, você incrementa i dentro do loop for que usa i como variavel de controle o que produz um erro. Mas não importa.

Tem como você me passar o seu email? Que aí eu passo um programa que eu escreví em pascal pra você ter uma idéia doque eu estou querendo fazer.

Link para o comentário
Compartilhar em outros sites

  • 0

Iaew?

Cara, eu tentei procurar alguma coisa sobre o aquelas procedures doidas que voce usou para ler a memória mas nem na ajuda do Delphi eu achei. Será que dava para você me dizer o que faz cada uma e oque significam seus parametros?

O Delphi tem as seguintes declarações :

function GetWindowThreadProcessId( hWnd : HWND; lpdwProcessId : Pointer = nil ) : Cardinal;

function OpenProcess( dwDesiredAcess : Cardinal; bInheriteHandle : LongBool; dwProcessId : Cardinal ) : Cardinal;

function ReadProcessMemory( hProcess : Cardinal; const lpBaseAddress : Pointer; lpBuffer : Pointer; nSize : Cardinal; var lpNumberOfBytesRead : Cardinal ) : LongBool;

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

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

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...