_MemorySearch()

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Charlie19
Aprendiz de Mago
Mensajes: 30
Registrado: 12 Ene 2010, 22:59

_MemorySearch()

Mensaje por Charlie19 »

Hola a todos!
Ya hacia un tiempo que no me pasaba por aqui! Y bueno al surgirme la duda he pensado que como aqui siempre ayudan!!
Miren estoy intentando crear un "lector de memoria" muy simple ( tipo cheat engien pero simple claro)
Para mi mini scrip tengo la ayuda de la include NomadMemory.au3 que va muy bien para leer el valor que hay en una adress, canviarlo etc..
Entonces tengo 2 preguntas
1.- Como se hace para que haga lo mismo que con las adress pero con los pointer's...
Adjunto mi code de pointer's!

Código: Seleccionar todo

$Datos1 = GUICtrlRead($Combo1)
$Datos2 = GUICtrlRead($Input1)
$a = StringLen($Datos2)
If $a = 8 Then
	$aa = StringMid($Datos2, 3, 6)
ElseIf $a = 6 Then
	$aa = $a
Else
	MsgBox(1, "ERROR", "Revisa tu adress!")
EndIf

Func _pointer()
$wow = ('0x' & $aa)
$McDonalds = GUICtrlRead ( $Input2 )
$hprocess = _MemoryOpen ( $PID )
$Write = _MemoryPointerWrite ( $wow,$hprocess ,0, $McDonalds)
If @error Then
	MsgBox(1, "ERROR", "No se puedo escrbir en la memoria!")
EndIf
EndFunc

Func _leerpointer()
$wow = ('0x' & $aa)
$jprocess = _MemoryRead( $wow ,_MemoryOpen ( $PID ), 0)
$Label4 = GUICtrlCreateLabel($jprocess, 8, 128, 124, 17)

EndFunc
Porcierto lo unico que he canviado de _MemoryWrite a _pointer ha sido que añadi el cero aqui "$Write = _MemoryPointerWrite ( $wow,$hprocess ,---->>>0 <<<----, $McDonalds)"( como decia la .au3). ASi que un mal funcionamiento de todo eso de la PID y eso no es. Eso lo tengo yo ya controlado!

2.- Hay algun otro NomadMemory.au3 que me pueda ayudar a conseguir una Func para buscar valores a partir de la adress ya que alli solo hay para Adress ---> Valor! Bueno como creo que todo el mundo tiene el NomadMemory no lo adjunto pero si no lo tienen avisenme!.
Yo personalmente creo que no hay pero me podrian facilitar alguna heramienta para poder continuar este NomadMemory ?? Por todo eso de las Dll, yo... :smt037

Que puedo hacer?? :smt031
Sin error no hay esfuerzo, sin esfuerzo no se programa!
Avatar de Usuario
Alastor
Aprendiz de Mago
Mensajes: 59
Registrado: 13 Dic 2009, 14:27
Ubicación: Zaragoza, España
Contactar:

Re: _MemorySearch()

Mensaje por Alastor »

si lo que quieres en tu primera pregunta es leer un pointer, yo hice esta funcion (aunque creo que el nuevo nomadmemory.au3 tiene una mejor)

Código: Seleccionar todo

;==================================================================================
; Function:			_Pointer($ah_Handle, $iv_Address, $p_offset1 = '', $p_offset2 = '', $p_offset3 = '', $p_offset4 = '')
; Description:		Returns a Adress on which the given Values point to by using _MemoryRead().
; Parameter(s):		$ah_Handle - An array containing the Dll handle and the handle
;								 of the open process as returned by _MemoryOpen().
;					$$iv_Address - The adress of the basic adress.
;					$p_offset1 to 4 - The offset of the next leveled Pointer.
; Return Value(s):	On Success - Returns the Adress of the pointed Adress
;					On Failure - Returns 0
;					@Error - 0 = No error.
;							 1 = Invalid $ah_Handle.
;							 2 to 5 = _MemoryRead (1st to 4th pointer) returned @Error.
;									  See @Extended for the _MemoryRead's Error-Code.
; Author(s):		Alastor & FichteFoll
; Note(s):
;==================================================================================

Func _Pointer($ah_Handle, $iv_Address, $p_offset1 = '', $p_offset2 = '', $p_offset3 = '', $p_offset4 = '')

	If Not IsArray($ah_Handle) Then Return SetError(1, Default, False)

	Local $p_pointer = _MemoryRead($iv_Address, $ah_Handle, 'long') + $p_offset1 ;First Level
		If @error Then Return SetError(2, @error, False)
	If $p_offset2 <> '' Then $p_pointer = _MemoryRead($p_pointer, $ah_Handle, 'long') + $p_offset2 ;Second Level
		If @error Then Return SetError(3, @error, False)
	If $p_offset3 <> '' Then $p_pointer = _MemoryRead($p_pointer, $ah_Handle, 'long') + $p_offset3 ;Third Level
		If @error Then Return SetError(4, @error, False)
	If $p_offset4 <> '' Then $p_pointer = _MemoryRead($p_pointer, $ah_Handle, 'long') + $p_offset4 ;Fourth Level
		If @error Then Return SetError(5, @error, False)

	Return SetError(0, Default, $p_pointer)
EndFunc   ;==>_Pointer
Aprendiendo AutoIt y C++
Charlie19
Aprendiz de Mago
Mensajes: 30
Registrado: 12 Ene 2010, 22:59

Re: _MemorySearch()

Mensaje por Charlie19 »

Hombre ...
Holas Alastor !!
Hacia mucho que no te veia escribir, gracias por esta FUNC que es simple y "contrae" la funcion original del NomadMemory
  • _MemoryRead
    _MemoryPointerRead
Y es mucho mas simple de usar! :) La probe y funiona muy bien pero de momento con el _MemoryRead me vale !!
La pregunta que me queda y que nadie me responde es:
¿Hay algun tipo de _MemorySearch() para poder encontrar Adress desde un value que tu das ??¿?¿?
Supongo que sera muy complicado :/ Pero gracias de todas maneras Alastor por passarte a contestar algo ;)
Sin error no hay esfuerzo, sin esfuerzo no se programa!
Avatar de Usuario
Alastor
Aprendiz de Mago
Mensajes: 59
Registrado: 13 Dic 2009, 14:27
Ubicación: Zaragoza, España
Contactar:

Re: _MemorySearch()

Mensaje por Alastor »

No creo que haya nada del tipo _MemorySearch()
lo único que se me ocurre, es hacer _MemoryRead() en toda la memoria del proceso y luego filtrar los resultados con StringInStr()
Aprendiendo AutoIt y C++
Charlie19
Aprendiz de Mago
Mensajes: 30
Registrado: 12 Ene 2010, 22:59

Re: _MemorySearch()

Mensaje por Charlie19 »

Ya entinedo pero para hacer eso el programa tardaria muchoo ?? Bueno ya entiendo que algo tarda pero tampoco es plan de que se este 5 horas para encontrar todos los 3456!
Oks...entonces como deberia programar el _MemoryRead() para que me leyera toda la memoria ?? ..porque la adress ($iv_Address) qual seria ??
O bien se tendria que crear otra "Func"?
:smt003 Merci Alastor por contestarme en mis preguntas y a todo el foro tambien gracias :)
Sin error no hay esfuerzo, sin esfuerzo no se programa!
Avatar de Usuario
Alastor
Aprendiz de Mago
Mensajes: 59
Registrado: 13 Dic 2009, 14:27
Ubicación: Zaragoza, España
Contactar:

Re: _MemorySearch()

Mensaje por Alastor »

seria con un for algo asi (no probado, luego lo mirare mas, que ahora me voy con prisa)

Código: Seleccionar todo

For $i = 0 To 22500 Step 4
_MemoryRead('0x' & Hex(0x00400000 + $i) ; (no he puesto el resto de parametros)
Next
(Y luego pasar el filtro)
Aprendiendo AutoIt y C++
Charlie19
Aprendiz de Mago
Mensajes: 30
Registrado: 12 Ene 2010, 22:59

Re: _MemorySearch()

Mensaje por Charlie19 »

Miratelo mejor pork lo he probado pero me da "de resultado" 0 !!
Sin error no hay esfuerzo, sin esfuerzo no se programa!
Charlie19
Aprendiz de Mago
Mensajes: 30
Registrado: 12 Ene 2010, 22:59

Re: _MemorySearch()

Mensaje por Charlie19 »

Holas, mis progressos en el tema son estos

Código: Seleccionar todo

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiComboBox.au3>
#include <NomadMemory.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 161, 105, 192, 124)
$Button1 = GUICtrlCreateButton("Mirar", 40, 72, 75, 25, $WS_GROUP)
$Combo1 = GUICtrlCreateCombo("", 8, 8, 145, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
$list = ProcessList()
For $j = 1 To $list[0][0]
	_GUICtrlComboBox_AddString($Combo1, $list[$j][0])
Next
$res = 0
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$Datos1 = GUICtrlRead($Combo1)
			
			$list = ProcessList()
			For $h = 1 To $list[0][0]

				If $list[$h][0] = $Datos1 Then
					$PID = $list[$h][1]
				EndIf

			Next
			_MemoryOpen($PID)
			For $i = 0 To 4294967295
				$read = _MemoryRead('0x' & Hex(0x00000000 + $i), _MemoryOpen($PID), "dword") ; (no he puesto el resto de parametros)


				FileWriteLine("tessst.txt", @CR & Hex(0x00000000 + $i) & "VALUE" & $read & @CRLF)


			Next

	EndSwitch
WEnd

Jaja ya see que es una burrada pork escanea desde la adreess 0x00000000 hasta 0xFFFFFFFF pero asi sacare todos los values, ... o no o me daran 0 todos ???
Hay algun error aparte de que em tardaria mucho ??¿?¿
I bueno se podria hacer en otro leguaje mas pontente para estalviar tiempo..?? O bien concretar la zona de busqueda ( desde la 0x00400000 hasta la 0x00456754 (nose me lo invento)) ?
Porfavor respondan Alastor o el foro !! Ayuda!
Sin error no hay esfuerzo, sin esfuerzo no se programa!
Avatar de Usuario
Alastor
Aprendiz de Mago
Mensajes: 59
Registrado: 13 Dic 2009, 14:27
Ubicación: Zaragoza, España
Contactar:

Re: _MemorySearch()

Mensaje por Alastor »

Adjunto una Beta que he hecho acerca de lo que quieres hacer, el rango a buscar tiene que ser pequeño o no funcionará
Adjuntos
MemorySearch [Beta 1].rar
[Beta]
(2.31 KiB) Descargado 199 veces
Aprendiendo AutoIt y C++
Charlie19
Aprendiz de Mago
Mensajes: 30
Registrado: 12 Ene 2010, 22:59

Re: _MemorySearch()

Mensaje por Charlie19 »

Tioo nose como agradecerte tu trabajo :smt038 :smt038 :smt038
Gracias por preocuparte el programa talvez tarda un poco si vas de 0x0400000 al 0x7FFFFFF pero igualmente vale la pena!! No se si ya estabas planteandote un trabajo asi o es para aportar PERO DE VERDAD QUE MUCHSA GRACIAS!
Eres divino tiooo !! :) NOs vemos
Sin error no hay esfuerzo, sin esfuerzo no se programa!
Responder