Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Migalha

Ler o valor de um endereço de memória em vb

Recommended Posts

Bom dia a todos,

 

Gostaria de saber como faço um programa em VB para apenas ler o conteúdo de um endereço de memória de um outro programa que está rodando e apresentar esse valor enquanto ele muda com o tempo.

 

Desde já agradeço a atenção

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Migalha, primeiramente, seja bem vindo ao fórum.

 

Tente dar uma olhada nesse link e ver se é isso que precisa:

 

http://www.forum-invaders.com.br/phpBB/vie...346&start=0

 

Abraços...

 

Meu amigo, muito obrigado pela pronta resposta, sou totalmente leigo no assunto, pra ter uma idéia o ultimo programa que fiz foi em QBasic.

Vou ler com atenção o artigo e ver se consigo aplicar alguma coisa, ele é completo demais para o meu caso (acho).

Para começar queria fazer um programa que eu apenas indicasse o processo em uso (acho que é necessário) e o endereço de memória desse processo que quero obter o valor.

 

Desde de já agradeço a atenção

 

Migalha

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Migalha, primeiramente, seja bem vindo ao fórum.

 

Tente dar uma olhada nesse link e ver se é isso que precisa:

 

http://www.forum-invaders.com.br/phpBB/vie...346&start=0

 

Abraços...

 

Meu amigo, muito obrigado pela pronta resposta, sou totalmente leigo no assunto, pra ter uma idéia o ultimo programa que fiz foi em QBasic.

Vou ler com atenção o artigo e ver se consigo aplicar alguma coisa, ele é completo demais para o meu caso (acho).

Para começar queria fazer um programa que eu apenas indicasse o processo em uso (acho que é necessário) e o endereço de memória desse processo que quero obter o valor.

 

Desde de já agradeço a atenção

 

Migalha

 

 

Pesquisando na net encontrei esse código eu executo ele mas só aparece uma janela, poderia me dizer o que esse programa faz?

Imports System.Runtime.InteropServices
Public Class WindowsAPI
	Public Const PROCESS_ALL_ACCESS = &H1F0FFF

	<DllImport("kernel32.dll")> _
	Public Shared Function ReadProcessMemory(ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, <Out()> ByVal lpBuffer As Byte(), ByVal nSize As UIntPtr, ByVal lpNumberOfBytesRead As IntPtr) As Boolean
	End Function

	<DllImport("kernel32.dll", CallingConvention:=CallingConvention.StdCall, CharSet:=CharSet.Auto, SetLastError:=True)> _
	Public Shared Function ReadProcessMemory(ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, ByVal lpBuffer As IntPtr, ByVal iSize As Integer, ByRef lpNumberOfBytesRead As Integer) As Boolean
	End Function

	<DllImport("kernel32.dll", SetLastError:=True)> _
	Public Shared Function OpenProcess(ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Boolean, ByVal dwProcessId As Integer) As IntPtr
	End Function

	<DllImport("kernel32.dll", SetLastError:=True)> _
	Public Shared Function CloseHandle(ByVal handle As IntPtr) As Boolean
	End Function
End Class

Public Class MemoryReader
	Public Shared Function GetStructure(Of T)(ByVal TargetProcess As Process, ByVal Address As Integer) As T
		'Create a variable to store the number of bytes written
		Dim lpBytesWritten As Integer = 0
		'Allocate memory to hold the structure
		Dim buffer As IntPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(GetType(T)))
		'Open the process for reading
		Dim procPtr As IntPtr = WindowsAPI.OpenProcess(WindowsAPI.PROCESS_ALL_ACCESS, False, TargetProcess.Id)
		'Read the data into the previously created buffer
		WindowsAPI.ReadProcessMemory(procPtr, New IntPtr(Address), buffer, Marshal.SizeOf(GetType(T)), lpBytesWritten)
		'Marshal the pointer to the return structure type
		Dim retValue As T = CType(Marshal.PtrToStructure(buffer, GetType(T)), T)
		'Free up the allocated memory
		Marshal.FreeCoTaskMem(buffer)
		'Close the process handle
		WindowsAPI.CloseHandle(procPtr)
		'Return the object
		Return retValue
	End Function
End Class

Public Class Class1
	'This is an example structure.
	<StructLayout(LayoutKind.Sequential)> _
	Public Structure SomeStruct
		Dim ID As Integer
		<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=24)> _
		Dim Name As String
	End Structure

	Public Function GetStructure() As SomeStruct
		'Get a process object
		'Obviously this is not how it would be done, but for this
		'example it will suffice
		Dim p As Process = Process.GetProcessById(100)
		'Now we will read the structure form memory address 1000000 in or fake process
		Return MemoryReader.GetStructure(Of SomeStruct)(p, 1000000)
	End Function
End Class
Foi neste site que encontrei:

http://www.vbforums.com/showthread.php?t=556677

 

Desde já agradeço qualquer ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa, bem complicado isso, você tem o endereço de memória em hexa? Como você vai saber o endereço? Pois pode mudar de execução para execução.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa, bem complicado isso, você tem o endereço de memória em hexa? Como você vai saber o endereço? Pois pode mudar de execução para execução.

 

Com o Programa Tsearch eu descobri um endereço E5E36C... mas acessá-lo eu não sei...

Se tiver alguma ídeia agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que eu entendi do código, vocë troca o valor 1000000 pelo endereço, ali onde usa o GetProcess voce troca o 100 pelo ID do processo que criou a variavel e cria uma STRUCT idêntica ao do outro programa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.