Uso de API's ReadProcessMemory y WriteProcessMemory

Iniciado por aaronduran2, 5 Mayo 2008, 13:15 PM

0 Miembros y 3 Visitantes están viendo este tema.

~~

Citary bueno ya que esta el hilo abierto estaria lindo quien tenga otros ejemplo lo ponga a continuacion para hacer una pequeña recopilacion sobre el uso de estas dos apis.

que no entiendes? Yo tengo codes pero en C o asm, si te vale...

A ver, el uso de estas dos apis es muy simple, me autocito de un tuto de rootkits q escribí, ya de paso pongo algunas apis relaccionadas q os serán utiles:

Citar
OpenProcess:

HANDLE OpenProcess(
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance flag
DWORD dwProcessId // process identifier
);

Esta es la documentación que Microsoft nos proporciona sobre este api. Ahora os la
detallo un poco:
Valor de retorno: El valor devuelto es el manejador del proceso, explicado de una
forma simple es la forma que tendremos en el código para referirnos al proceso. El
valor que devuelve lo almacenaremos en una variable del tipo HANDLE.
DWORD dwDesiredAccess: Es el modo de apertura del proceso, en nuestro caso
nos daremos todos los privilegios con PROCESS_ALL_ACCESS.
BOOL bInheritHandle: Toma valor true (hereda) o false (no hereda). Nosotros
pondremos false.
DWORD dwProcessId: Es el PID del proceso, luego veremos como obtenerlo con el
nombre del proceso.


VirtualAllocEx:

Sirve para reservar espacio en la memoria de un proceso.

LPVOID VirtualAllocEx(
HANDLE hProcess, // process within which to allocate memory
LPVOID lpAddress, // desired starting address of allocation
DWORD dwSize, // size, in bytes, of region to allocate
DWORD flAllocationType, // type of allocation
DWORD flProtect // type of access protection
);

Valor de retorno: La dirección donde empezaremos a escribir con
WriteProcessMemory.

HANDLE hProcess: El manejador del proceso en el cual vamos a escribir. Es el valor
que nos devuelve OpenProcess.
LPVOID lpAddress: La dirección donde empezamos a reservar espacio, lo
dejaremos en NULL.
DWORD dwSize: El tamaño en bytes de la región que queremos reservar, en
nuestro caso será el tamaño de la cadena que contiene la ruta de la dll a inyectar.
DWORD flAllocationType: El motivo por el cual queremos reservar la memoria, en
nuestro caso MEM_COMMIT|MEM_RESERVE.
DWORD flProtect: El tipo de protección, en nuestro caso PAGE_READWRITE.


WriteProcessMemory:

Sirve para escribir en la memoria anteriormente reservada.
BOOL WriteProcessMemory(
HANDLE hProcess, // handle to process whose memory is written to
LPVOID lpBaseAddress, // address to start writing to
LPVOID lpBuffer, // pointer to buffer to write data to
DWORD nSize, // number of bytes to write
LPDWORD lpNumberOfBytesWritten // actual number of bytes
//written
);

Valor de retorno: Ver LPDWORD lpNumberOfBytesWritten.
HANDLE hProcess: El valor devuelto por OpenProcess.
LPVOID lpBaseAddress: La dirección por donde empezaremos a escribir. Es el valor
devuelto por VirtualAllocEx.
LPVOID lpBuffer: Lo que queremos escribir, en nuestro caso la ruta de nuestra dll.

DWORD nSize: El tamaño en bytes de lo que queremos escribir, es decir el tamaño
en bytes de la ruta de nuestra dll.
LPDWORD lpNumberOfBytesWritten: Es el numero de bytes que se han escrito
correctamente, así como el valor de retorno, nosotros lo dejaremos en NULL ya que
no nos interesa.

Y ReadProcessMemory es lo mismo q WritePM pero para leer xD
Poned dudas mas concretas ;)

1S4ludo

LeandroA

CitarPoned dudas mas concretas

no se si me lo preguntas a mi?, yo en realidad si entiendo, tampoco soy un experto, pero lo que propuese fue codear un poco.

yo utilize estas apis en algunas ocasiones para pasar msg a controles como listview del systema, u otras.

en fin si tuviera que decirte una duda en concreto, ahora, que por falta de tiempo no me puse a imbestigar, es como obtener el codigo html del iExplorer, se que de alguna manera se puede porque tengo una aplicacion en vb que lo hace(lamentablemente no tengo el codigo)
     la duda es en que parte de la memoria tendria que leer y de que tamaño.

Saludos


Tughack

#12
Cita de: LeandroA en  6 Mayo 2008, 03:01 AM
CitarPoned dudas mas concretas

no se si me lo preguntas a mi?, yo en realidad si entiendo, tampoco soy un experto, pero lo que propuese fue codear un poco.

yo utilize estas apis en algunas ocasiones para pasar msg a controles como listview del systema, u otras.

en fin si tuviera que decirte una duda en concreto, ahora, que por falta de tiempo no me puse a imbestigar, es como obtener el codigo html del iExplorer, se que de alguna manera se puede porque tengo una aplicacion en vb que lo hace(lamentablemente no tengo el codigo)
     la duda es en que parte de la memoria tendria que leer y de que tamaño.

Saludos



Hola Leandro, pues eso no tiene k ver con leer memoria.

Acabo de escribirte un ejemplo, aver si lo entiendes.

Option Explicit

Dim SWs As New SHDocVw.ShellWindows
Dim IE As SHDocVw.InternetExplorer

Private Sub Command1_Click()
    For Each IE In SWs
        DoEvents
        If IE.readyState = READYSTATE_COMPLETE Then
            If IE.LocationURL = "http://www.elhacker.net/" Then
                Text1.Text = IE.document.body.innerHTML
                Exit For
            End If
        End If
    Next IE
End Sub



En las "references" anade la "Microsoft HTML Object Library" y el ""Microsoft Internet Controls".

Saludos

seba123neo

tambien se puede hacer directamente con api's,pero esto se desvio del tema me parece... :P
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Tughack

Cita de: seba123neo en  6 Mayo 2008, 03:46 AM
tambien se puede hacer directamente con api's,pero esto se desvio del tema me parece... :P

Con apis? Bueno entonces pone esas apis aki  :rolleyes:

seba123neo

es con la libreria wininet.dll,lo vi muy util cuando lo postearon en un foro:

Option Explicit
Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternetSession As Long, ByVal sURL As String, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
Private Const IF_FROM_CACHE = &H1000000
Private Const IF_MAKE_PERSISTENT = &H2000000
Private Const IF_NO_CACHE_WRITE = &H4000000
Private Const BUFFER_LEN = 256

Public Function CodigoWeb(Pagina As String) As String
Dim sBuffer As String * BUFFER_LEN, iResult As Integer, sData As String
Dim hInternet As Long, hSession As Long, lReturn As Long
hSession = InternetOpen("vb wininet", 1, vbNullString, vbNullString, 0)
If hSession Then hInternet = InternetOpenUrl(hSession, Pagina, vbNullString, 0, IF_NO_CACHE_WRITE, 0)
If hInternet Then
iResult = InternetReadFile(hInternet, sBuffer, BUFFER_LEN, lReturn)
sData = sBuffer
Do While lReturn <> 0
iResult = InternetReadFile(hInternet, sBuffer, BUFFER_LEN, lReturn)
sData = sData + Mid(sBuffer, 1, lReturn)
Loop
End If
iResult = InternetCloseHandle(hInternet)
CodigoWeb = sData
End Function

Private Sub Form_Load()
MsgBox CodigoWeb("http://www.google.com.ar")
End Sub


saludos.



La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Tughack

Ya sabia k ibas a poner eso, pero con eso tienes k abrir una nueva instancia, no es lo mismo k puse yo.

Con lo k puse yo puedes elijir kualkier instancia ya abierta o incluso crear una nueva y manejar todo lo k kieras. Investigalo y veras k es mejor.

No quiero decir k lo k has puesto no es util, simplemente no es lo mejor para esto k ha pedido Leandro.

Saludos

seba123neo

es util para el que no quiere agregar referencias externas,a mi no me gusta agregar muchas cosas,trato de hacerlo todo con codigo por eso me parecio bueno..tambien hay otra forma muy corta con la libreria XML agregandola como referencia,bue y con el control Inet con una linea de codigo..pero no me gusta  ::)

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

LeandroA

Cita de: TughackOption Explicit

Dim SWs As New SHDocVw.ShellWindows
Dim IE As SHDocVw.InternetExplorer

Private Sub Command1_Click()
    For Each IE In SWs
        DoEvents
        If IE.readyState = READYSTATE_COMPLETE Then
            If IE.LocationURL = "http://www.elhacker.net/" Then
                Text1.Text = IE.document.body.innerHTML
                Exit For
            End If
        End If
    Next IE
End Sub

jaja :laugh: buenisimo era eso, ahora que recuerdo Cobein en una vuelta me habia pasado algo parecido con  SHDocVw.ShellWindows pero no savia como hacer el For Each IE In SWs, la verdad que me la iva a complicar mucho, lamentablemnte esto no va a servir obtener los script o para firefox u opera. pero bueno me safa.

Saludos y muchas gracias

PD:el que quiera puede seguir agregando algunos ejemplos mas de ReadProcessMemory y WriteProcessMemory para tenerlos a mano, no estarian de mas.


seba123neo

Leandro,te queria preguntar,una vez vi que pusiste un codigo para poder saber en que icono del escritorio se hizo click,usando estas 2 api's,y despues vi que tenias un codigo para sacar los items de un listview de visual sabiendo su hwnd,pero tiraba error para uno de windows,¿ya lo corregiste?,la verdad siempre quise hacer eso y la otra vez encontre un codigo que lo hace con estas 2 api's y es re-cortito,no tira error con los de windows,ahora estoy viendo si le puedo sacar tambien el icono del listview...

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson