Página 2 de 2 PrimeiroPrimeiro 12
Resultados 11 a 20 de 20

Tópico: [Tutorial] Criando um editor/leitor de memória em C

  1. #11
    Hacker Avatar de FoXxD
    Data de Ingresso
    Jun 2006
    Posts
    1.159
    Post Thanks / Like

    Lightbulb Yeah!

    Muitoo bom, parabens pelo post ;D
    Mas uma dúvida...como utilizar a api ReadProcessMemory para ler strings na memória?
    Itachi Kun, tem jeito sim.

    Olhe só um simples exemplo:

    Código:
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    void lerMem(char *nJanela)
    {
    	HWND hIdent;
    	DWORD PID;
    	HANDLE hProc;
    	LPCVOID endereco = (LPCVOID) 0x00213204; //Endereço de memória
    	char ch;  //Armazenara 1 caractere por vez
    
    	hIdent = FindWindow(NULL, nJanela);
    
    	if (hIdent == NULL)
    	{
    		printf("Erro ao capturar identificador da janela.\n");
    		return;
    	}
    
    	//HWND Obtido.
    
    	GetWindowThreadProcessId(hIdent, &PID);
    
    	//PID Obtido.
    
    	hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
    
    	if (hProc == NULL)
    	{
    		printf("Erro ao abrir processo.\n");
    		return;
    	}
    
    	//Processo aberto
    	
    do{
    	if (!ReadProcessMemory(hProc, endereco, &ch, sizeof(ch), NULL))
                printf("Erro ao ler memoria.\n");
            else
            {
               printf("%c", ch);
               endereco++;
            }
    
    }while (ch != '\0');
    
    	CloseHandle(hProc);
    }
    Neste exemplo fiz com que o programa lesse cada caractere por vez e verificasse se ele é nulo ou não, porque se for nulo é o final da string.
    Esse é um método mais simples digamos assim, pelo menos acho.

    No ReadProcessMemory troquei o ==0 por ! antes da função que resulta na mesma coisa...

    O sizeof(ch) no penúltimo parâmetro vai assegurar a portabilidade retornando o tamanho do ch ou seja de um char, o que poderia ser feito no código do tutorial. Mas comumente um char = 1 byte.

    Se der tudo certo, printf irá exibir o caractere lido e incrementar a variável endereco em 1 para ler o próximo byte na memoria, isso se o caractere for diferente de nulo (\0) que indica o fim.

    Mais ou menos assim:

    00213204 = I
    00213205 = n
    00213206 = v
    00213207 = a
    00213208 = d
    00213209 = e
    0021320A = r
    0021320B = s
    0021320C = \0

    Agora se você sabe o total de caracteres a ser lidos, pode fazer o seguinte:

    Código:
    char str[9];
    ...
    ...
    if (!ReadProcessMemory(hProc, endereco, str, 8, NULL))
         printf("Erro ao ler memoria.\n");
    else
         printf("%s\n", str);
    Pode remover o do..while., ahh e observe que a string declarada é o tamanho dela +1 e na leitura é somente o tamanho dela.

    Segue o exemplo completo

    Código:
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    void lerMem(char *nJanela)
    {
    	HWND hIdent;
    	DWORD PID;
    	HANDLE hProc;
    	LPCVOID endereco = (LPCVOID) 0x00213204; //Endereço de memória
    	char str[9];  //Armazenara 1 caractere por vez
    
    	hIdent = FindWindow(NULL, nJanela);
    
    	if (hIdent == NULL)
    	{
    		printf("Erro ao capturar identificador da janela.\n");
    		return;
    	}
    
    	//HWND Obtido.
    
    	GetWindowThreadProcessId(hIdent, &PID);
    
    	//PID Obtido.
    
    	hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
    
    	if (hProc == NULL)
    	{
    		printf("Erro ao abrir processo.\n");
    		return;
    	}
    
    	//Processo aberto
    
            if (!ReadProcessMemory(hProc, endereco, str, 8, NULL))
                printf("Erro ao ler memoria.\n");
            else
               printf("%s\n", str);
    
    
    	CloseHandle(hProc);
    }

    --
    Voik, ótimo exemplo.
    --

    Abraços,
    FoXxD

  2. #12
    Veterano ingresso Avatar de pzn3d
    Data de Ingresso
    Jul 2007
    Posts
    2.990
    Post Thanks / Like
    Fala galera !
    Achei bem interessante mesmo o lance da leitura e edição da memória.
    O exemplo do Voik e do FoXxD foram de grande ajuda, só estava tendo trabalho pra achar o endereço da memória pra editar, como exemplo usado, o do Pinball.
    Não sei se essa dúvida se encaixa na do Itachi também porque pelo que me pareceu foi a dificuldade de achar uma string no programa usado, mas abri o editor Hexadecimal do TSearch, e busquei pelo nome do meu usuario do jogo pinball em Hexa.
    Ficando assim: 75736572
    E no caso editando o endereço de memoria para: 0x0001025578; //Endereço de memória


    Abraços e parabéns aos dois pela colaboração com a comunidade.

  3. #13
    Newbie Avatar de Voik
    Data de Ingresso
    Jul 2011
    Posts
    32
    Post Thanks / Like
    Então... o exemplo do FoXxD vai ler strings com no máximo length de 8 caracteres.

    O meu exemplo, ele consegue ler strings de qualquer tamanho.
    A ideia é:
    - 1º passo: Leia 16 bytes;
    - 2º passo: A string acabou? (Tem o byte 0x00?)
    - 3º passo: Se não acabou, volte ao 1º passo.

    Usei 16 bytes por questão de alinhamento, porém você pode colocar qualquer tamanho maior que 0.
    Última edição por pzn3d; 26 Jul 2011 às 17:18.

  4. #14
    Old School ingresso Avatar de .legaCy
    Data de Ingresso
    Jul 2009
    Posts
    4.966
    Post Thanks / Like
    Citação Postado originalmente por itachi kun Ver Post
    Valeu Voik, mas ainda to com algumas dúvidas aki heheh, desde que li o post to fuçando aqui com isso pra entender melhor...
    No caso do exemplo que vc fez vc definiu que o programa irá ler 10bytes no endereço desejado certo? Mas e se no caso a string que eu estou procurando tem menos ou mais de 10bytes, mesmo assim vai funcionar?
    No exemplo do Foxxd, acredito que funcionou perfeitamente pq o valor que ele procurava era um inteiro, e ele informou seu tamanho corretamente (int = 4 bytes (32bits))..
    Ali é o tamanho de um buffer, você pode ficar descarregando esse buffer em algum lugar e ler mais 10 bytes
    Faça uma doação em bitcoin: 14zQW8RrvuHoKjQp6Y4EBqA38yvPauwGwA
    Menos estado e mais progresso.

    Microsoft Technology Associate: Software Development Fundamentals (C#)

  5. #15
    Newbie Avatar de Voik
    Data de Ingresso
    Jul 2011
    Posts
    32
    Post Thanks / Like
    Agora que acabou a correria, pude ler o post do FoXxD inteiro.
    Na verdade, o primeiro código do FoXxD lê strings dinâmicas sim. (É que eu só tinha olhado o seu último código, sorry).

    Mas então... a diferença, é que o meu código é um pouquinho mais rápido, já que ele não faz sucessivas calls a ReadProcessMemory a cada caractere.
    Ele carrega num buffer logo 16 bytes, e vê se a string ta inteira ali.

    Isso é só questão de estilo de programação.

    []'s

  6. #16
    Newbie
    Data de Ingresso
    May 2011
    Localização
    São Paulo
    Posts
    62
    Post Thanks / Like
    Ah acho que consegui entender essa parte. O meu problema foi o seguinte, eu scaneava o valor no TSearch, e ai no meu programa tentava scanear ele tbm antes de alterá-lo. Nesse caso eu desconhecendo o endereço da memória onde está a string, funcionará da mesma forma?
    Por exemplo eu vou utilizar 10 bytes, e ai a cada 10 bytes da memória ele vai tentar encontrar a string?

  7. #17
    Old School ingresso Avatar de .legaCy
    Data de Ingresso
    Jul 2009
    Posts
    4.966
    Post Thanks / Like
    Citação Postado originalmente por itachi kun Ver Post
    Ah acho que consegui entender essa parte. O meu problema foi o seguinte, eu scaneava o valor no TSearch, e ai no meu programa tentava scanear ele tbm antes de alterá-lo. Nesse caso eu desconhecendo o endereço da memória onde está a string, funcionará da mesma forma?
    Por exemplo eu vou utilizar 10 bytes, e ai a cada 10 bytes da memória ele vai tentar encontrar a string?
    Cara ele vai copiar até 10bytes ,mesmo que a string ocupe 300 bytes ,só que vai ser lido e armazenado no buffer de 10 em 10bytes.
    Faça uma doação em bitcoin: 14zQW8RrvuHoKjQp6Y4EBqA38yvPauwGwA
    Menos estado e mais progresso.

    Microsoft Technology Associate: Software Development Fundamentals (C#)

  8. #18
    Hacker Avatar de FoXxD
    Data de Ingresso
    Jun 2006
    Posts
    1.159
    Post Thanks / Like
    itachi kun,

    Isso é só um leitor e editor de memória, ele vai ler um endereço de memória que você falar pra ele ler.
    Agora para fazer uma pesquisa na memória, você tem que usar um programa que faz isso pra você, neste caso eu apresentei o TSearch, mas tem um outro que recomendo e que é melhor que se chama Cheat Engine(cheatengine.org para download).
    Se você desconhece o endereço de memória que armazena a string precisa de um memory scan para achá-lo ( Cheat Engine, TSearch, Art Money )
    Num outro tópico talvez abordo sobre memory search.

  9. #19
    Lamer
    Data de Ingresso
    Sep 2010
    Posts
    7
    Post Thanks / Like
    FoXxD pode me dar uma ajuda nisso ?

    http://www.forum-invaders.com.br/vb/...tou-criando%21

  10. #20
    xlmtawubhsem
    Guest

    oizjcaogjicp

    peuterey Being of an appreciative nature, she liked to hear Vandeloup talk of his brilliant life in Paris, Vienna, London, and other famous cities, which to her were merely names ‘I wanted to speak to you on business, Madame,’ he said, taking out the letter; ‘the long-expected has come at last moncler ‘We’re quits now, my lady,’ and he turned to go ’ canada goose outlet ‘Only my arm,’ replied Mrs Villiers, in a faint voice; ‘he nearly broke it Vandeloup, sitting up to the table, and unrolling his napkin hollister italia ’ ’ http://www.trappenindustriesoest.nl/canadagoose/ Vandeloup, however, bore her scrutiny without moving a muscle of his face, so Madame at last withdrew her eyes, quite satisfied that his story was true It was a small room, with a flaring gas-jet, under which there was a dressing-table littered over with grease, paints, powder, vaseline and wigs, and upon it stood a small looking-glass‘How Biblical you are getting,’ said the young man, ironically; ‘but kindly stop speaking in parables, and tell me what position we are to occupy to each other hollister uk ‘I never knew a gold mine that wasn’t,’ retorted Vandeloup, dryly He used to stop here nearly all day doing business, with the small table before him covered with scrip, and the mantelpiece behind him covered with specimens of quartz, all labelled with the name of the place whence they came scarpe hogan ‘Yes, Madame,’ he replied in the same tongue, ‘both my friend and myself are from Paris, but we have not been long out here ’ Kate Spade Uk During his short stay he had made himself extremely popular with the men, as he always had a bright smile and a kind word for everyone, so they all felt like losing a personal friend He won’t stop at anything to get moneymoncler outlet I have no papers to prove myself, so my consul may think me — what you call — a scamp He had met Villiers at his hotel, when both of them being inebriated they swore eternal friendship bottes ugg pas cher ‘She’s got the nugget with her in the trap,’ he said to himself; ‘and she’s taken it to show Marchurst ‘I want you to think over what I have said, and when I do go, perhaps in a month or so, you will be ready to come with me ’ ’ ‘Here, you,’ cried a shrill female voice, as a woman dressed in a flaunting blue gown rushed up to the stall, ‘give us a pie quick; I’m starvin’; I’ve got no time to wait wzejjoqtsvdbbqrkvkykfulp rbuaurgqtbmekxrppcmspirt xbbavgkzydfdvleltstpsepw lvoamdtmcpammvndyuyvtdni

Tags para este Tópico

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •