Pasar 2 parámetros en inyección de código

Iniciado por Vaagish, 16 Julio 2014, 02:27 AM

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

Vaagish

Hi!

Alguien sabe como podría pasar dos parámetros por CreateRemoteThread? La inyección no es mediante dll, inyecto una función..

En MSDN dice:

Citar
HANDLE WINAPI CreateRemoteThread(
  _In_   HANDLE hProcess,
  _In_   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  _In_   SIZE_T dwStackSize,
  _In_   LPTHREAD_START_ROUTINE lpStartAddress,
  _In_   LPVOID lpParameter,
  _In_   DWORD dwCreationFlags,
  _Out_  LPDWORD lpThreadId
);


lpParameter [in]
A pointer to a variable to be passed to the thread function.

Y por ahi dicen que se podria pasar una estructura,, algo asi:

Código (cpp) [Seleccionar]
struct PARAMETER{
char* str1;
char* str2;
int num;
};


Yo debería pasar algo parecido en asm:

Código (asm) [Seleccionar]
invoke CreateRemoteThread, Process, 0, 0, lpProcAddress, lpParameter, 0, 0

Funcion a inyectar:

Código (asm) [Seleccionar]
INJECTED PROC lpParameter:DWORD
; Como separar esos dos datos?
ret
INJECTED endp

Eternal Idol

Podes usar VirtualAllocEx dos veces, una para el codigo y otra para datos (la estructura, mejor no uses punteros en la misma), WriteProcessMemory y finalmente CreateRemoteThread.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

No logro dar con el dato.. creo que me reservo el tamaño correcto, luego inyecto el primer dato, luego inyecto la función, pero no encuentro con olly el primer dato.. puede que al escribir dos veces los datos queden separados? Yo me estoy basando en esto de VirtualAllocEx:

CitarReturn value

If the function succeeds, the return value is the base address of the allocated region of pages.

O sea que al inyectar el primer dato, debería moverme dentro de ese espacio de memoria para escribir el segundo.. pero no..  :huh:

Eternal Idol

Es muy dificil saber que estas haciendo exactamente ... pero si tenes problemas hacela sencilla y llama DOS veces a VirtualAllocEx, una para los datos y otra para el codigo.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

Bueno, después de remar un dia rato con esto.. conseguí pasar esos dos parámetros,, me base en este code:

Citarhttp://foro.elhacker.net/net/inyeccion_dll_delphi_c_vb_masm32_c-t267823.0.html

En el ejemplo de C++ se pasa una estructura,, lo desensamble y me aclaro un poco..

En fin,, ahora solo tengo un problema importante.. (aparte del mental  :xD), mi intención en un principio era inyectar una función que resuelve la dirección de kernel32 buscándola en el peb para llamar a CopyFileA, luego se me ocurrió pasarle como parámetro la dirección de kernel32,, pero ahora que tengo todo resuelto me doy cuenta que no tiene sentido.. porque en ese proceso (el proceso inyectado, el proceso paciente digamos) puede estar en otra ubicación esa dirección,,, no??? O sea, tendría que resolver la dirección de Krn32 dentro de ese proceso si o si y no enviársela resuelta, no?

Saludos!

PD: Si esto fuera posible, podría pasarle la dirección de CopyFileA de una, y no buscar nada en ese proceso...

Eternal Idol

La direccion base de Kernel32.dll deberia ser siempre la misma en todos los procesos, puede cambiar entre diferentes booteos aunque eso es irrelevante para tu caso.

Address Space Layout Randomization (ASLR)
ASLR moves executable images into random locations when a system boots, making it harder for exploit code to operate predictably. For a component to support ASLR, all components that it loads must also support ASLR. For example, if A.exe consumes B.dll and C.dll, all three must support ASLR. By default, Windows Vista and later will randomize system DLLs and EXEs, but DLLs and EXEs created by ISVs must opt in to support ASLR using the /DYNAMICBASE linker option.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

Claro.. ahora que decis,, en el ejemplo ese tambien se envia una direccion.. debo estar usando un mov o un lea y por eso me cambia la direccion.. lo raro es que inyecto 2 datos, uno llega igual y el otro parecido  :xD igual hoy lo soluciono..

CitarLa direccion base de Kernel32.dll deberia ser siempre la misma en todos los procesos, puede cambiar entre diferentes booteos aunque eso es irrelevante para tu caso.
Lo mismo rige para las funciones exportadas? Ponele, si encuentro CopyFile (o la funcion que sea) en un proceso y le meto esa direccion a otro, se puede usar perfectamente, no?

Gracias EI!

Eternal Idol

Si, todas las direcciones de funciones son offsets que parten de la base de un modulo, CopyFileA/W estan dentro de una sección de codigo de un determinado modulo.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Vaagish

Lujo!! Quedo resuelto! No pongo code, porque no quiero masticar para otros, si alguien llega aca con la misma duda, ya sabe por donde buscar una posible solucion..

Saludos! Gracias!  ;D

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón