Inyeccion dll sin dll, by E0N. Problema: Edicion de Memoria. [Convertir a C#]

Iniciado por XSaMuXPH *-* Traigo uno encima! =D!, 13 Septiembre 2009, 18:43 PM

0 Miembros y 1 Visitante están viendo este tema.

XSaMuXPH *-* Traigo uno encima! =D!

Bien, ya muchos han de haber visto el código de E0N, el de inyección DLL sin DLL que bueno es no?  ;D.

Aquí un ejemplo del mismo :P.

#pragma hdrstop
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>

//Creamos un puntero a la api que queremos inyectar
typedef int (WINAPI *datMessageBoxA) (HWND, LPCTSTR, LPCTSTR, UINT);

//La estructura que inyectaremos
struct datos
{
datMessageBoxA apiMessageBoxA;
char titulo [100];
char mensaje [100];
};


//Declaración de funciones
DWORD GetAdres(char *module, char *function);

//La función que inyectaremos
DWORD inyectada (datos *data)
{
data -> apiMessageBoxA (0, data->mensaje, data->titulo, 0);
return 0;
}

//La función iyectora
void inyectora()
{
int pid; // Este es el pid del proceso en el que nos queremos inyectar
HANDLE proc; // El handle del proceso en el que inyectaremos
datos dat; // El tipo de dato de la estructura
DWORD TamFun; // El tamaño de la función a inyectar
void* esp; // Lugar de memoria donde copiaremos nuestra función

HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //Obtenemos el pid
PROCESSENTRY32 procinfo = { sizeof(PROCESSENTRY32) };
while(Process32Next(handle, &procinfo))
{
if(!strcmp(procinfo.szExeFile, "AVKTray.exe"))
{
CloseHandle(handle);
pid = procinfo.th32ProcessID;
}
}
CloseHandle(handle);

//Abrimos el proceso en el que nos inyectaremos

proc = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, false, pid);

//Metemos la dirección de la api en la estructura llamndo a la función GetAdres
dat.apiMessageBoxA = (datMessageBoxA) GetAdres ("USER32.DLL", "MessageBoxA");

//Inicializamos las variables que contendrán el mensaje
sprintf(dat.mensaje,"holaaaaaa!!!");
sprintf(dat.titulo,"titulo!!!");


//Reservamos espacio para nuestra estructura en el proceso a inyectar y la escribimos
datos *dat_ = (datos*) VirtualAllocEx(proc, 0, sizeof(datos), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(proc, dat_, &dat, sizeof(datos), NULL);

//Calculamos el tamaño de la función a inyectar
TamFun = (long unsigned int) inyectora - (long unsigned int)inyectada;

//Reservamos espacio para la función, escribimos en él y creamos un hilo
esp = VirtualAllocEx(proc, 0, TamFun, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(proc, esp, (void*)inyectada, TamFun, NULL);
CreateRemoteThread(proc, NULL, 0, (LPTHREAD_START_ROUTINE) esp, dat_, 0, NULL);
}

//La función main
void main()
{
inyectora();
}


//Función que nos devuelve un DWORD con la dirección de una api
DWORD GetAdres(char *module, char *function)
{
HMODULE dh = LoadLibrary(module);
DWORD pf = (DWORD)GetProcAddress(dh,function);
FreeLibrary(dh);
return pf;
}


Bien, ese código inyecta un msgbox hasta donde logre ver y probar, lo inyecta en procesos protegidos! como el hl.exe que tiene su protección "sXe Injected", bueno la pregunta mía es:

¿Ya que se puede inyectar un MsgBox, se podría inyectar un código que no solo muestre un mensaje sino que cambie un valor X en una dirección X en su memoria?

Sera esto posible?

Pues las palabras de E0N Fueron:

CitarDe todas formas si te permite mostrar el MessageBox, quiere decir que has podido usar un montón de apis "peligrosas" como WriteProcessMemory, CreateRemoteThread o VirtualAllocEx, con lo que facilmente podrías inyectarle una dll (por facilitar la tarea) y retocar ciertos valores en memoria para hacer trampas.

Según el debí haber ido a cheatengine.org los cuales son Cheaters profesionales, he ido pero como que les ha quedado grande el codigote de E0N, alguien aquí presente sabría cómo hacer ello?.

He aquí una demostración de una DLL en Delphi, que cambiaba valores en la memoria del proceso donde se inyectó:

library DllProyect;

uses
 SysUtils,  Windows,  Classes,  DllForm in 'Dll.pas' {DllForm};

{$R *.res}
var
 hProcess:THandle;
 hId:Cardinal;

procedure funcStartCheating;
 begin;
   MainForm:=TMainForm.Create(nil);
   MainForm.ShowModal;
 end;
begin
 hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,GetCurrentProcessID);
 CreateRemoteThread(hProcess,nil,0,@funcStartCheating,@funcStartCheating,0,hID);
end.


Bien ese es el código de la DLL, la cual me permite mostrar un Formulario para hacerme más fácil el trabajo de edición de memoria, he aquí el código de edición de memoria:

var
 MainForm: TMainForm;
 Memory: DWORD;
 j: integer;
 ZeroBytes: Array of Byte;

procedure TMainForm.Timer1Timer(Sender: TObject);
var
number: byte;
character: char;
j: integer;
Addresspointer: Dword;
begin

if Checkbox1.Checked=True then
begin
   Addresspointer:= PDWORD($0087A35C)^+$93;
   PBYTE(Addresspointer)^:=0;
end;

if Checkbox5.Checked=True then
begin
   CopyMemory(ptr(PDWORD($004023c1)^+$1),@ZeroBytes,8);
end;

if checkbox12.Checked = true then
 begin;
 PBYTE($00928D1E)^:=0;
end;

if checkbox10.Checked = true then
begin;
   CopyMemory(ptr($00010701),@ZeroBytes,10);
end;
end;

end.


Bien eso cambia el valor de la direccion X con el Valor X para lograr hacer trampas :P, ahora mi duda  es:

¿Cómo se hace ello con el codigo de Inyección DLL sin DLL?
¿Cómo integro tal codigo dentro de ese inyector?
¿Es posible?.

Según E0N si.
Espero alguien sepa de que estoy hablando y me pueda ayudar, sin mas que decir me despido con un tipico "Gracias de antemano" aunque no logren ayudarme un gracias nunca esta demas :P.

pd: me falto una pregunta Y la más importante:

¿SE PUEDE CAMBIAR ESTE CODIGO A C# 2008?

Hasta Luego!.

XSaMuXPH *-* Traigo uno encima! =D!

Dicen que la paciencia es una virtud, pues no la tengo  :-\.

Alguien enserio podría ayudarme???, hasta luego  :-(

XSaMuXPH *-* Traigo uno encima! =D!

sorry por el doble post xD...

haha :P como a cheat engine, a ustedes tambien les quedo grande xD (a que ahora si responden xDD!)

;)


Atrum

Pues la verdad no creo que se pueda exportar a C# ya que no maneja la memoria como C++, las operaciones de los punteros no veo de que forma se puedan exportar a C#, es como si programaras un exploit en C# o Visual Basic, no lo se, lo veo muy dificil.

Y pues en lo personal este code si me quedo grande   :P