Página 1 de 1

Inyeccion Windows 7 by NvK

Publicado: 21 Jun 2014, 11:43
por NvK
Ésta es una version de injección lista para hooks en ring 3 y funcional en windows 7, realmente el código fue parte programado en C, y como me gustan ambos lenguajes hice mi propia version para delphi(ya que no encontre ninguna version de éste estilo en la red), más adelante y con tiempo dare un ejemplo de hooking, por ahora solo cubriré las necesidades basicas de inyeccion.

Dll
procedure EntryPoint(Reason : DWORD);
begin
  if Reason = DLL_PROCESS_ATTACH then
    MessageBox($0, 'Dll injected!', 'Done', 0);
end;

begin
  DllProc:= @EntryPoint;
  EntryPoint(DLL_PROCESS_ATTACH);
end.
unit
unit nvk_inj;

{$H+}
{$O+}
{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  SysUtils,
  WINDOWS,
  TlHelp32;
  
type
  PNT_THREAD_BUFFER = ^NT_THREAD_BUFFER;
  NT_THREAD_BUFFER  = record

  Size     : Cardinal;
  Unknown1 : Cardinal;
  Unknown2 : Cardinal;
  Unknown3 : PCardinal;
  Unknown4 : Cardinal;
  Unknown5 : Cardinal;
  Unknown6 : Cardinal;
  Unknown7 : PCardinal;
  Unknown8 : Cardinal;
end;

var _NtCreateThreadEx : function (var lpThreadId: Thandle;
                          DesiredAccess:DWORD;
                          lpThreadAttributes:Pointer;
                          hProcess:THandle;
                          lpStartAddress:TFNThreadStartRoutine;
                          lpParameter: Pointer;
                          CreateSuspended:Boolean;
                          dwStackZero: Cardinal;
                          lpStartCommit: Cardinal;
                          dwCreationFlags: Cardinal;
                          var NTbuf:NT_THREAD_BUFFER): Cardinal; stdcall;
function NtCreateThreadEx(hProcess: Cardinal; lpStartAddress, lpParameter: Pointer): THandle;
function InjectStr(Hnd : THandle; Str : Pchar) : Pointer;
procedure InjectThread(Hnd: THandle; Dll: Pchar);
function GetPid(procName : string) : Cardinal;

implementation

function
  NtCreateThreadEx(hProcess: Cardinal; lpStartAddress, lpParameter: Pointer) : THandle;
var
  tmp1, tmp2: DWORD;
  Hnd : THandle;
  NTbuf : NT_THREAD_BUFFER;
begin
  NTbuf.Size:= Sizeof(NT_THREAD_BUFFER);
  tmp1:= 0;
  tmp2:= 0;
  NTbuf.Unknown1:= $10003;
  NTbuf.Unknown2:= $8;
  NTbuf.Unknown3:= @tmp2;
  NTbuf.Unknown4:= $0;
  NTbuf.Unknown5:= $10004;
  NTbuf.Unknown6:= 4;
  NTbuf.Unknown7:= @tmp1;
  NTbuf.Unknown8:= $0;

  _NtCreateThreadEx:= GetProcAddress(LoadLibrary('ntdll.dll'), 'NtCreateThreadEx');
  _NtCreateThreadEx(Hnd, $1FFFFF, nil, hProcess, lpStartAddress, lpParameter, False, 0, 0, 0, NTBuf);
  Result:= Hnd;
end;

function InjectStr(Hnd : THandle; Str : Pchar) : Pointer;
var
  lpNumberOfBytesWritten : DWORD;
begin
  Result:= VirtualAllocEx(Hnd, nil, Length(Str)+1, MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if WriteProcessMemory(Hnd, Result, Str, Length(Str)+1, lpNumberOfBytesWritten)<>True then
    Result:= nil;
end;

procedure
  InjectThread(Hnd: THandle; Dll: Pchar);
begin
  NtCreateThreadEx(Hnd, GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'), InjectStr(Hnd, Dll));
end;
// Version generica para encontrar el id de un proceso...
function GetPid(procName : string) : Cardinal;
var
  hSnap : THandle;
  PE32  : TPROCESSENTRY32;
begin
  Result      := 0;
  hSnap       := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
  PE32.dwSize := sizeof(PROCESSENTRY32);
  Process32First(hSnap, PE32);
  while Process32Next(hSnap, PE32) do
    begin
      if PE32.szExeFile = procName then
        Result:= PE32.th32ProcessID;
    end;
  CloseHandle(hSnap);
end;
Main
program InjectioTest;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  WINDOWS,
  nvk_inj;

var
  PID : Cardinal;
  Hnd : THandle;
begin
  // Para inyectar
  PID := GetPid('cmd.exe');
  if PID=INVALID_HANDLE_VALUE then Exit;
  WriteLn('Proceso: ', PID);

  Hnd:= OpenProcess(PROCESS_ALL_ACCESS, false, PID);
  if Hnd=INVALID_HANDLE_VALUE then
    Exit;
	
  InjectThread(Hnd, 'D:\\Dll.dll');
  WaitForSingleObject(Hnd, INFINITE);
  //VirtualFreeEx(Hnd, Paddr, 15, MEM_RELEASE);
  CloseHandle(Hnd);
  WriteLn('Terminado!');

  ReadLn;
end.
Recuerden compilar primero la dll, luego la inyeccion(con su respectiva ruta).
Imagen

Pruebenlo y diganme sus resultados.

Re: Inyeccion Windows 7 by NvK

Publicado: 21 Jun 2014, 14:37
por Pink
Brillante como siempre bro :) se retoca un poco y queda lista para inyectar código directamente.

Saludos bro

Re: Inyeccion Windows 7 by NvK

Publicado: 23 Jun 2014, 04:50
por joselin
con NtCreateThreadEx se puede inyectar en procesos system?
en este momento no tengo win7 para probar.

Re: Inyeccion Windows 7 by NvK

Publicado: 29 Jun 2014, 00:30
por strup
Como es costumbre en ti, trayendonos siempre aportes de muy buena calidad, cualquiera que sepa uno de tus lenguajes no hay duda que aprenderia mucho leyendo tus codes, un saludo fiera