Ir ao conteúdo
  • Cadastre-se

Read Process Memory


cobrapk

Posts recomendados

Galera, preciso de auxílio para conseguir ler e acessar a memória de outros processos.

Eu tenho um módulo que permite algo do gênero em vb.net mas de certa forma é meio limitado pois não ler float ou double.

 

Alguém pode me auxiliar como eu faço para ler dados simples de alguns andress sendo do tipo float e double ?

Link para o comentário
Compartilhar em outros sites

Em 05/03/2017 às 15:35, vangodp disse:

Cara nem sei se se pode fazer isso. Imaginou que se isso fosse possível o sistema operativo seria altamente vulnerável? O que sim acho que é possível, é que um processo pode ter acesso a um subprocesso.
Existe uma técnica chamada injeção de dll, busque no google pois não sei muito sobre tema.

 

Já vi alguns exemplos de injeção de dll mas em nenhuma encontrei o que busco.

O que quero saber é simplesmente um valor em um andress de algum programa.

 

Exemplo:

Verificar o valor salvo na memoria da calculadora.

 

Já vi alguns exemplos no youtube mas não está expresso de maneira clara, não é explicado.

Em vb.net eu sei fazer em dados simples de int, string e afins.

Mas não sei como fazer em variáveis float ou double.

Link para o comentário
Compartilhar em outros sites

12 horas atrás, vangodp disse:

https://www.youtube.com/watch?v=I0zPwg4iUDk

Sim... mas como falei pense que se isso fosse possível todos os programas seriam suscetíveis a ser "hackeados" de forma mais ou menos fácil. Não acha? Não obstante sim sei que se pode porém o caminho é longo pois ainda que você receba a memória de um programa possivelmente não saberíamos como interpreta-la pois receberíamos um bonito array de bytes no qual não saberíamos onde começa e onde termina cada tipo de dado.


Existe uma aplicação chamada cheatengine que detecta mudanças na memória de um programa pois ele abre os programas como um subprocesso permitindo receber e até alterar variáveis, talvez com esse programa você seja capaz de descobrir o offset de tal variável, coisa que depois seria possível aplicar uma injeção de DLL que seria algo parecido ao que você quer. Mas como falei eu não tenho muita ideia sobre isso porque nunca fiz, porém tem muitos videos e tutoriais por internet que explicam como faze-lo: https://www.youtube.com/watch?v=I0zPwg4iUDk

Este vídeo explica como obter e modificar a direção da variável. Busque tutorias sobre cheatengine e injeção DLL.

 

 

Eu conheço este cheatengine, eu o uso para encontrar os andress que pretendo fazer a verificação.

É mais ou menos isso que busco, mas ainda não obtive um resultado satisfatório.

Link para o comentário
Compartilhar em outros sites

Não é que todos programas estão sujeitos a serem hackeados. .-. alguns não permitem ser executado pela função ReadProcessMemory nem WriteProcessMemory. para poder ler voce utiliza:

 

BOOL WINAPI ReadProcessMemory( _In_  HANDLE  hProcess, _In_  LPCVOID lpBaseAddress, _Out_ LPVOID  lpBuffer, _In_  SIZE_T  nSize, _Out_ SIZE_T  *lpNumberOfBytesRead );

 

 

pra alterar utiliza

BOOL WINAPI WriteProcessMemory( _In_  HANDLE  hProcess, _In_  LPVOID  lpBaseAddress, _In_  LPCVOID lpBuffer, _In_  SIZE_T  nSize, _Out_ SIZE_T  *lpNumberOfBytesWritten );

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 07/03/2017 às 23:21, Anonymous Programmer disse:

Não é que todos programas estão sujeitos a serem hackeados. .-. alguns não permitem ser executado pela função ReadProcessMemory nem WriteProcessMemory. para poder ler voce utiliza:

 

BOOL WINAPI ReadProcessMemory( _In_  HANDLE  hProcess, _In_  LPCVOID lpBaseAddress, _Out_ LPVOID  lpBuffer, _In_  SIZE_T  nSize, _Out_ SIZE_T  *lpNumberOfBytesRead );

 

 

pra alterar utiliza

BOOL WINAPI WriteProcessMemory( _In_  HANDLE  hProcess, _In_  LPVOID  lpBaseAddress, _In_  LPCVOID lpBuffer, _In_  SIZE_T  nSize, _Out_ SIZE_T  *lpNumberOfBytesWritten );

 

 

Tu poderia me mostrar um exemplo de tal aplicação ?

Algum artigo ou qualquer coisa para eu me informar mais sobre isso, pois desconheço como fazer.

adicionado 49 minutos depois

O meu conhecimento em c++ é muito pequeno, eu somente aprendi C na faculdade e foi superficial já que meu curso é Engenharia Civil.

 

Buscando um pouco na net eu encontrei isso:

#include <iostream>

#define WIN32_LEAN_AND_MEAN		// exclude rarely used Windows headers
#include <Windows.h>
#include <TlHelp32.h>

DWORD FindProcessId(const std::string& processName);

int main( )
{
	const std::string process{ "Target.exe" };

	DWORD processID{ FindProcessId( process ) };
	if( procID == -1 ) {
		std::cerr << "ERROR! Couldn't find " << process << "\n";
		return -1;
	}

	std::cout << process << " process id = " << processID << "\n";
}

DWORD FindProcessId(const std::string& processName)
{
	/* https://msdn.microsoft.com/en-au/library/windows/desktop/ms682489 */
	// take a snapshot of all the processes
	HANDLE hSnap{ CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ) };
	if( !hSnap || hSnap == INVALID_HANDLE_VALUE ) return -1;

	/* https://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx */
	PROCESSENTRY32 pe;						// store info about process
	pe.dwSize = sizeof( PROCESSENTRY32 );	// must set this to sizeof( PROCESSENTRY32 )

	/* https://msdn.microsoft.com/en-us/library/windows/desktop/ms684834(v=vs.85).aspx */
	// traverse the processes
	if( !Process32First( hSnap, &pe ) ) {
		/* https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx */
		CloseHandle( hSnap );
		return -1;
	}
	do {
		// case insensitive string compare, returns 0 if strings match
		if( _stricmp( processName.c_str( ), pe.szExeFile ) == 0 ) {
			CloseHandle( hSnap );
			return pe.th32ProcessID;	// process id
		}
		/* https://msdn.microsoft.com/en-us/library/windows/desktop/ms684836(v=vs.85).aspx */
	} while( Process32Next( hSnap, &pe ) );

	// couldn't find process
	CloseHandle( hSnap );
	return -1;
}
Edit & Run

Mas não funcionou.

Link para o comentário
Compartilhar em outros sites

Bom o que pra utilizar a função ReadProcessMemory ou WriteProcessMemory da API kernel32.dll você precisa passar para ela argumentos que ela necessita.

 

Analisando o primeiro poste que te mandei. Vejamos 

 

ReadProcessMemory( _In_  HANDLE  hProcess, _In_  LPCVOID lpBaseAddress, _Out_ LPVOID  lpBuffer, _In_  SIZE_T  nSize, _Out_ SIZE_T  *lpNumberOfBytesRead );

 

Primeiro Argumento ela pede uma HANDLE de um Processo ( um identificador de um processo ) como vamos conseguir esse identificador através de programação? utilizando a função GetWindowThreadProcessId sem progamação você pode simplesmente visualizar no monitor de recursos do seu computador vai ter uma lista de programas em execução é seus respectivos PID ( Processo Identificador ). porém para automatizar nosso programa utilizaremos a API.

 

 

Analisando a Função GetWindowThreadProcessId elá requer uma HANDLE de uma função e uma Variavel para retornar o valor do PID. ou seja ainda temos que encontrar outro valor primeiro.. que fica a cargo da função FindWindow. a função FindWindow requer uma Classe é o nome da Janela somente. por tanto vamos la!. lembrando que ela retorna o valor da nossa HANDLE.

 

HWND hProcess;

hProcess = FindWindow(0,"Calculadora"); (a função vai procurar a PID do processo cujo nome da janela seja Calculadora, o primeiro argumento seria a classe. coloca 0 o segundo argumento o Nome da janela em char ) assim ja temos o valor da HWND. que e necessario para Preencher  a GetWindow.....

 

DWORD hPid;

GetWindowThreadProcessId(hProcess,&hPid); ( primeiro argumento HWND ja capturado. segundo argumento uma variavel para receber o PID de retorno ).

 

 

agora que ja temos o hPid vamos executar o processo.

 

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,0,hPid);

 

pronto agora ja temos o HANDLE para a WriteProcess... é ReadProcess...

 

ReadProcessMemory(hProcess,(LPVOID)0x00400000,&VariavelParaReceberValor,256,BytesLidos);

 

Portanto primeiro argumento a HANDLE Segundo Local onde você quer ler os bytes. Terceiro Total de bytes a ser lido. Quarto Uma variavel para receber o valor de total de bytes lidos!. é pronto pra Usar a WriteProcess.. você simplesmente em vez de colocar uma variavel para receber o valor. coloca uma variavel com o valor.

 

 

utilize sempre o site da microsoft para conhecer melhor as funções da API do windows. ela é de extrema importância para qualquer programador.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...