Hoy vengo con un pequeño gran problema...
Estoy trabajando en una inyeccion sin DLL, bueno es de "sin DLL" me refiero a que no uso el clásico método de LoadLibrary, todo perfecto lo logro hacer en el propio proceso, pero surge un problema.
Al principio WriteProcessMemory no le prestaba atención, y pasaba directamente a CreateRemoteThread, me destruía el proceso. use NTCreateRemote, NTCreateRemoteEx e incluso use la API Kernel RtlCreateUserThread pero todas me devolvían el mismo resultado, el proceso dejaba de funcionar.
Comence a leer acerca del tema y descubrí que se debía a que se entraba a una zona en memoria que no contenía función alguna o incompleta; lo que me hizo enfocarme a WriteProcessMemory me devolvía el error 299 ERROR_PARTIAL_COPY, hasta ahora no encuentro nada en internet; incluso use API de mayor nivel como NTWriteVirtualMemory y de nuevo me fue al Kernel usando ZwWriteVirtualMemory todas me devolvía error las últimas dos el error 487 "Área de memoria inválida".
He intentado cambiar la protección de memoria, usar otra API para pedir memoria, pero todas me devuelven el mismo resultado...
Dejo un retazo de código.

Código: Seleccionar todo

Result := False;
  hProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_VM_READ{PROCESS_ALL_ACCESS}, False, dwPID);

  if hProcess = 0 then Exit;
  pRemoteDLL := VirtualAllocEx(hProcess, nil {pMemFile}, dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  //VirtualProtectEx(hProcess, pRemoteDLL, dwSize, PAGE_EXECUTE_READWRITE, nil);

  if pRemoteDll = nil then Exit;
  //Result := WriteProcessMemory(hProcess, pRemoteDLL, pMemFile, dwSize, dwRet);
  dwRet := ZwWriteVirtualMemory(hProcess, pRemoteDLL, pMemFile, dwSize, @dwWriteRet);
  lasterror;
  //NewCreateRemoteThread(hProcess, nil, 0, pStartPoint, nil, 0, dwRet);
  //MyCreateRemoteThread(hProcess, nil, 0, pStartPoint, nil, 0, @dwRet);
  CreateRemoteThread(hProcess, nil, 0, pStartPoint, nil, 0, dwRet);
  //lasterror;

  Result := True;
Aclaro que uso el SE_DEBUG_ENABLE y salto el UAC corriendo con privilegios de Admin

Saludos y gracias!
We do what we must, because, we can-> [www.youtube.com/watch?v=Y6ljFaKRTrI]
Pasa a saludar: NeoDark-Labs.BlogSpot.mx
<<<<Proyectos en curso>>>>
[+]Restauración de SSDT
[+]Driver v3 - Ocultar drivers
[+]Anti-rootkit
El proceso de hecho en varios, pensé que era por la característica de windows de Protected Process pero intente con la calculadora, chrome, delphi y una aplicación vacía solo con un form. Intento inyectar una función, logre hacer funcionar el CreateRemoteThread lo que no logro hacer es escribir en un proceso externo.
Saludos!
We do what we must, because, we can-> [www.youtube.com/watch?v=Y6ljFaKRTrI]
Pasa a saludar: NeoDark-Labs.BlogSpot.mx
<<<<Proyectos en curso>>>>
[+]Restauración de SSDT
[+]Driver v3 - Ocultar drivers
[+]Anti-rootkit
Es que veo cosas raras que has hecho en tu código. En todo caso te dejo uno mio que he traducido de c++ (Inyección By E0N). Inyecta un msgbox en notepad. El código, lo he comentado por lo que no creo que tengas problemas de entender. En win7 usa "SetDebugPrivileges".

Código: Seleccionar todo

PMsgBox = Function(iHandle: HWND; lpTitulo: LPCTSTR; lpTexto: LPCTSTR;
    uType: UINT): Integer; StdCall;

  TMSGBOX = Record
    Msgbox: PMsgBox;
    sTitulo: Array [0 .. MAX_PATH] Of Char;
    sTexto: Array [0 .. MAX_PATH] Of Char;
  End;

  PTMSGBOX = ^TMSGBOX;

Var
  Form1: TForm1;

  Function GetAddress(sModulo: String; sFunction: String): DWORD;

Implementation

{$R *.dfm}

Function Inyectada(tMSG: PTMSGBOX): Integer; StdCall;
Begin
  tMSG.Msgbox(0, tMSG.sTitulo, tMSG.sTexto, 0);
  Result := 0;
End;

Procedure Inyectora;
Var
  dwPID: DWORD;
  hThread: THandle;
  hProcess: THandle;
  dwExitCode: DWORD;
  tProcEntry: TProcessEntry32;
  tMSG: TMSGBOX;
  BytesWritten: SIZE_T;
  ptStruct: Pointer;
  ptEsp: Pointer;
  uTamFun: UINT;
Begin
  dwExitCode = 0;
  uTamFun := 0;
  hProcess := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  tProcEntry.dwSize := Sizeof(tProcEntry);

  If Process32First(hProcess, tProcEntry) Then
  Begin
    Repeat
      If tProcEntry.szExeFile = 'notepad.exe' Then
      Begin
        dwPID := tProcEntry.th32ProcessID;
        Break;
      End;
    Until Not Process32Next(hProcess, tProcEntry);
  End;

  CloseHandle(hProcess);

  // obtenemos el handle del proceso
  hProcess := OpenProcess(PROCESS_CREATE_THREAD Or PROCESS_VM_OPERATION Or
    PROCESS_VM_WRITE, False, dwPID);

  // obtenemos el puntero de la api
  tMSG.Msgbox := PMsgBox(GetAddress('USER32.DLL', 'MessageBoxA'));

  // inicializamos el msgbox
  StrCopy(tMSG.sTitulo, PChar('ALERTA'));
  StrCopy(tMSG.sTexto, PChar('Inyectado!'));

  // reservamos espacio para nuestra estructura
  ptStruct := VirtualAllocEx(hProcess, Nil, SizeOf(TMSGBOX), MEM_RESERVE Or
    MEM_COMMIT, PAGE_READWRITE);

  // escribimos nuestra estructura
  WriteProcessMemory(hProcess, ptStruct, @tMSG, SizeOf(TMSGBOX), BytesWritten);

  // calculamos el tamaño de nuestra funcion
  uTamFun := UINT(@Inyectora) - UINT(@Inyectada);

  // reservamos espacio para nuestra funcion
  ptEsp := VirtualAllocEx(hProcess, Nil, uTamFun, MEM_RESERVE Or MEM_COMMIT,
    PAGE_EXECUTE_READWRITE);

  // escribimos nuestra funcion
  WriteProcessMemory(hProcess, ptEsp, @Inyectada, uTamFun, BytesWritten);

  // creamos el hilo remoto
  hThread := CreateRemoteThread(hProcess, Nil, 0, ptEsp, ptStruct, 0,
    PDWORD(Nil)^);

  If hThread <> 0 Then
  Begin
    // esperamos hasta que se cree el hilo
    WaitForSingleObject(hThread, INFINITE);
    // obtenemos el estado de terminacion del hilo
    GetExitCodeThread(hThread, dwExitCode);
    // liberamos el handle del hilo creado
    CloseHandle(hThread);
    // liberamos el espacio en el proceso
    VirtualFreeEx(hProcess, ptStruct, 0, MEM_RELEASE);
    VirtualFreeEx(hProcess, ptEsp, 0, MEM_RELEASE);
  End;

  // liberamos el handle del proceso
  CloseHandle(hProcess);
End;

Function GetAddress(sModulo: String; sFunction: String): DWORD;
Var
  dwAdr:  DWORD;
  tMod:   HMODULE;
Begin
  tMod := LoadLibrary(PChar(sModulo));
  dwAdr := DWORD(GetProcAddress(tMod, PChar(sFunction)));
  FreeLibrary(tMod);

  Result := dwAdr;
End;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
  Inyectora;
End;
Cualquier cosa, avisa. Saludos.
El secreto de mi éxito es Jesús
te dejo el source de una conexion inversa con inyeccion en el navegador
probado en xp y windows 7 profecional solamente esta el codigo y no los ejecutables para evitar dudas .
lo consegui de una pagina ya desaparecida ojala sea de ayuda
[Enlace externo eliminado para invitados]
paresco malo ,pero soy bueno
Orlando, amigo, aquí te dejo una función de inyección, que termine hace poco, totalmente funcional. Lógicamente dependiendo del arquitectura del OS te tocara compilar de una o de otra manera para el correcto funcionamiento. Por cierto, cuando comentabas sobre ejecutar con permisos admin o aplicar "SetDebugPrivileges", todo eso no hace falta colega. funciona y sin ellos.

Link: http://www.indetectables.net/viewtopic.php?f=98&t=42362


Saludo.
El secreto de mi éxito es Jesús
Gracias por sus respuestas, descubrí en parte el problema la funcion trabaja correctamente (no se por que devuelve ese error) pero el problema estaba a la hora que media el tamaño del archivo y lo metía en el proceso me falto reconstruir la IAT y las secciones, aun no lo logro hacer funcionar pero estoy en eso.

Saludos y gracias por sus respuestas !
We do what we must, because, we can-> [www.youtube.com/watch?v=Y6ljFaKRTrI]
Pasa a saludar: NeoDark-Labs.BlogSpot.mx
<<<<Proyectos en curso>>>>
[+]Restauración de SSDT
[+]Driver v3 - Ocultar drivers
[+]Anti-rootkit
Yo creo que el error es que no estas reservando espacio para tu función.
entonces cuando intentas copiar el codigo, no se consigue el area.
Imagen
Responder

Volver a “Delphi”