Ir al contenido


Foto

Inyeccion de codigo a un proceso (sin dll)


  • Por favor identifícate para responder
4 respuestas en este tema

#1 BrainDeath

BrainDeath

    Member

  • Miembros
  • PipPip
  • 28 mensajes

Escrito 22 noviembre 2009 - 02:48

Hola... aqui un problemita me he encontrado un codigo en el que inyecta a un bloc de notas.. ahora el problema es que solo funciona con console application e inyecta el codigo directo,lo que quiero es que en vez de inyectar puros messagebox inyecte un form y ese form haga su trabajo usando edicion de memoria ya sea editando codigos,leyendo codigos usando botones etc... He intentado modificarlo pasandolo a una aplicacion normal pero sin ningun resultado :s



delphi
  1. {
  2. Process Hijacking by Aphex
  3.  
  4. Greets to dildog for giving me the idea.
  5. }
  6.  
  7. program Project1;
  8.  
  9. {$IMAGEBASE $13140000}
  10.  
  11. uses
  12. Windows;
  13.  
  14. function Main(dwEntryPoint: Pointer): longword; stdcall;
  15. begin
  16. {now we are in notepad}
  17. LoadLibrary('kernel32.dll');
  18. LoadLibrary('user32.dll');
  19. MessageBox(0, 'Hello, now I am in the memory of another process!', 'Hijacked Process', 0);
  20. MessageBox(0, 'Now we can do anything we want. ', 'Hijacked Process', 0);
  21. MessageBox(0, 'You can even delete the original exe and these message boxes will still be here.', 'Hijacked Process', 0);
  22. MessageBox(0, 'See?', 'Hijacked Process', 0);
  23. MessageBox(0, 'Told you.', 'Hijacked Process', 0);
  24. MessageBox(0, 'Ok, bye.', 'Hijacked Process', 0);
  25. MessageBox(0, 'I''ll close notepad for you ', 'Hijacked Process', 0);
  26. ExitProcess(0);
  27. Result := 0;
  28. end;
  29.  
  30. procedure Inject(ProcessHandle: longword; EntryPoint: pointer);
  31. var
  32. Module, NewModule: Pointer;
  33. Size, BytesWritten, TID: longword;
  34. begin
  35. Module := Pointer(GetModuleHandle(nil));
  36. Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage;
  37. VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE);
  38. NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  39. WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten);
  40. CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID);
  41. end;
  42.  
  43. var
  44. ProcessHandle, PID: longword;
  45. StartupInfo: TStartupInfo;
  46. ProcessInfo: TProcessInformation;
  47.  
  48. begin
  49. {lets make a new process}
  50. CreateProcess(nil, 'notepad', nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);
  51. {give it some time to wake up}
  52. Sleep(500);
  53. {and hijack it!}
  54. GetWindowThreadProcessId(FindWindow('Notepad', nil), @PID);
  55. ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
  56. Inject(ProcessHandle, @Main);
  57. CloseHandle(ProcessHandle);
  58. {we have a copy of ourself running in notepad so we can exit}
  59. end.



Saludos.. Espero su ayuda  :embarrassed:
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 22 noviembre 2009 - 03:46

Bien, no es tarea fácil o que quieres, es decir inyectar un form sin dll.
La técnica que estás usando inyecta un módulo completo, en este caso tu aplicación de consola enterita, esto es útil para inyectar poco código.

En este minitutorial, expuse una técnica para inyectar código directamente, pero sin inyectar un módulo entero, sólo la función que queramos ejecutar, es mas complejo. También se trata de inyectar códigos simples o con API.

Si se desea usar código mas complejo y que a su vez use dlls se debería optar por la inyección con dll, es mas segura y estable.

De todas formas, con la técnica que usas, podrías inyectar un formulario pero ten en cuenta que inyectas toda la aplicación, con lo que tendrás que ser cuidadoso y economicista en el código. La función inyectora no tiene porqué estar en lo inyectado pero al ser simple no importa mucho.

Saludos.


  • 0

#3 BrainDeath

BrainDeath

    Member

  • Miembros
  • PipPip
  • 28 mensajes

Escrito 22 noviembre 2009 - 05:45

Bien, no es tarea fácil o que quieres, es decir inyectar un form sin dll.
La técnica que estás usando inyecta un módulo completo, en este caso tu aplicación de consola enterita, esto es útil para inyectar poco código.

En este minitutorial, expuse una técnica para inyectar código directamente, pero sin inyectar un módulo entero, sólo la función que queramos ejecutar, es mas complejo. También se trata de inyectar códigos simples o con API.

Si se desea usar código mas complejo y que a su vez use dlls se debería optar por la inyección con dll, es mas segura y estable.

De todas formas, con la técnica que usas, podrías inyectar un formulario pero ten en cuenta que inyectas toda la aplicación, con lo que tendrás que ser cuidadoso y economicista en el código. La función inyectora no tiene porqué estar en lo inyectado pero al ser simple no importa mucho.

Saludos.


Exactamente, me entendiste lo que quiero hacer es inyectar un form sin dll cheque tu codigo pero no lo entendi completamente solo se que usa freelibrary para liberar la dll al proceso inyectado pero no vi algo de inyeccion de codigo directo ps lo que quiero es no tener la dll aparte.

Saludos..
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 22 noviembre 2009 - 06:09

cheque tu codigo pero no lo entendi completamente solo se que usa freelibrary para liberar la dll al proceso inyectado pero no vi algo de inyeccion de codigo directo ps lo que quiero es no tener la dll aparte.


Pues no leíste bien:

En un momento dado, se me presentó la necesidad de escribir un código que liberase una librería dll de un proceso ajeno al mio. ...decidí realizar una inyección directa, es decir sin dlls, del código necesario para liberar la dll del proceso deseado.

Lo que aquí publico son las bases de la inyección directa de código, prescindiendo de dlls.


El ejemplo sobre el que baso los ejemplos es precisamente inyectar el código correspondiente a la liberación de una dll ajena en otro proceso, pero puede ser cualquier otro. Ese ejemplo define una función que se inyectará, en este caso DWORD __stdcall InjFreeLibrary(TParamFL* P); y una función que ejecuta el proceso inyector, en este caso BOOL FarFreeLibrary(DWORD Pid, char* DllName); que inyectará InjFreeLibrary en el proceso anfitrión Pid y ejecutará dicha función inyectada.

¿No viste la inyección? :s :|

Saludos.
  • 0

#5 BrainDeath

BrainDeath

    Member

  • Miembros
  • PipPip
  • 28 mensajes

Escrito 22 noviembre 2009 - 06:16

cheque tu codigo pero no lo entendi completamente solo se que usa freelibrary para liberar la dll al proceso inyectado pero no vi algo de inyeccion de codigo directo ps lo que quiero es no tener la dll aparte.


Pues no leíste bien:

En un momento dado, se me presentó la necesidad de escribir un código que liberase una librería dll de un proceso ajeno al mio. ...decidí realizar una inyección directa, es decir sin dlls, del código necesario para liberar la dll del proceso deseado.

Lo que aquí publico son las bases de la inyección directa de código, prescindiendo de dlls.


El ejemplo sobre el que baso los ejemplos es precisamente inyectar el código correspondiente a la liberación de una dll ajena en otro proceso, pero puede ser cualquier otro. Ese ejemplo define una función que se inyectará, en este caso DWORD __stdcall InjFreeLibrary(TParamFL* P); y una función que ejecuta el proceso inyector, en este caso BOOL FarFreeLibrary(DWORD Pid, char* DllName); que inyectará InjFreeLibrary en el proceso anfitrión Pid y ejecutará dicha función inyectada.

¿No viste la inyección? :s :|

Saludos.


Jejeje ahora si ya lo entendi entonces parece que ste metodo si me funcionaria intentare editarlo ami manera para que funcione Gracias..

Saludos.  :cheesy:
  • 0




IP.Board spam blocked by CleanTalk.