Ir al contenido


Foto

Function Hook - Delphi 4 / KOLDetours

delphi api hook

Mejor respuesta fatetmpmgecs , 25 febrero 2022 - 02:42

Ya pude inyectar!, era por lo que habia comentado de la parte que tuve que cambiar de koldetours era:


delphi
  1. VirtualProtect(Code,Size,Permission,@Result); //LondWord(Result) por @Result

El parametro guarda los derechos actuales del espacio de memoria, en C seria &old_protect y en delphi @old_protect solo para aclarar a quien le sirva. 

Ir al mensaje completo


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

#1 fatetmpmgecs

fatetmpmgecs

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 23 febrero 2022 - 11:43

Primero que todo he llegado a este foro de delphi y he encontrado muchos articulos interesantes y por eso me anime a solicitar un poco de guia.

 

Estoy tratando de hookear algunas function con KOLDetours de una dll, no tengo mucho conocimiento sobre delphi.

 

Para ilustrar un poco mi contexto:

 

dll ejemplo de la funcion que quiero hookear


delphi
  1. library dll_target;
  2.  
  3. uses
  4. SysUtils,
  5. Classes;
  6.  
  7. function fun(a: integer): integer; stdcall;
  8. begin
  9. Result := a + 1;
  10. end;
  11.  
  12. exports
  13. fun;
  14. end.

dll proxy:


delphi
  1. library dll_proxy;
  2. uses
  3. SysUtils,
  4. Classes,
  5. KOLDetours;
  6.  
  7. function fun(a: integer): integer; stdcall external 'dll_target.dll';
  8. function fun_proxy(a: integer): integer; stdcall;
  9. begin
  10. Result := a + 2;
  11. end;
  12. begin
  13. InterceptCreate(@fun, @fun_proxy);
  14. end.

app


delphi
  1. function fun(a: integer): integer; stdcall external 'dll_target.dll';
  2. begin
  3. fun(1);
  4. end. 

Como se ve estoy tratando de hookear a fun cuando es llamada en app, la compilacion sucede sin imprevistos pero a la hora de inyectar(CreateRemoteThread) la dll se presenta un mensaje de violacion de acceso.

 

Otra duda que tengo es necesario usar la misma version de delphi de la dll original?, Gracias.


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 24 febrero 2022 - 01:31

Bien venido fatetmpmgecs,
 

Como se ve estoy tratando de hookear a fun cuando es llamada en app, la compilacion sucede sin imprevistos pero a la hora de inyectar(CreateRemoteThread) la dll se presenta un mensaje de violacion de acceso.

 
Otra duda que tengo es necesario usar la misma version de delphi de la dll original?, Gracias.


Parece que tu problema se inicia con la inyección de la dll. Existen varios métodos y el que tu quieres usar en con CreateRemoteThread pero no has puesto nada del código que te da el error.
En el foro tienes información sobre el uso de CreateRemoteThread para inyectar una dll. Mira esto: InjectCRT

Sobre el asunto de si puedes inyectar una dll de diferentes versiones de delphi, te respondo que por supuesto, como si se escribió en otro lenguaje, pero si tienen una limitación. No puedes inyectar una dll escrita para 64 bits en una aplicación de 32 bits y viceversa.

 

Saludos.


  • 0

#3 fatetmpmgecs

fatetmpmgecs

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 24 febrero 2022 - 10:42

Gracias escafandra por introducirme, el error es:

 

 

 

Version:1.0 StartHTML:0000000105 EndHTML:0000000710 StartFragment:0000000538 EndFragment:0000000674

The instruction at 0x4DABDAE referenced memory at 0x60BB28. The memory could not be written -> 0060BB28 (exc.code c0000005, tid 2940)

 

0x60BB28


php
  1. dll_target.dll:0060BB28 dll_target_fun proc near
  2. dll_target.dll:0060BB28
  3. dll_target.dll:0060BB28 arg_0= dword ptr 8
  4. dll_target.dll:0060BB28
  5. dll_target.dll:0060BB28 push ebp
  6. dll_target.dll:0060BB29 mov ebp, esp
  7. dll_target.dll:0060BB2B mov eax, [ebp+arg_0]
  8. dll_target.dll:0060BB2E inc eax
  9. dll_target.dll:0060BB2F pop ebp
  10. dll_target.dll:0060BB30 retn 4
  11. dll_target.dll:0060BB30 dll_target_fun endp

0x4DABDAE


php
  1. dll_proxy.dll:04DABDAE mov byte ptr [edx], 0E9h
  2. dll_proxy.dll:04DABDB1 inc edx
  3. dll_proxy.dll:04DABDB2 mov esi, edx
  4. dll_proxy.dll:04DABDB4 dec esi
  5. dll_proxy.dll:04DABDB5 add esi, 5
  6. dll_proxy.dll:04DABDB8 sub ecx, esi
  7. dll_proxy.dll:04DABDBA mov [edx], ecx
  8. dll_proxy.dll:04DABDBC add edx, 4
  9. dll_proxy.dll:04DABDBF sub eax, 5
  10. dll_proxy.dll:04DABDC2 test eax, eax
  11. dll_proxy.dll:04DABDC4 jle short loc_4DABDCF

Creo que es cuando trata de escribir el salto en la funcion, lo que no habia dicho era que me toco cambiar L1202 en koldetours


delphi
  1. VirtualProtect(Code,Size,Permission,Result);

por


php
  1. var
  2. backup: Pointer;
  3. ...
  4. VirtualProtect(Code,Size,Permission,backup);
  5. Result := Longword(backup)

por que en delphi4 no me compilaba, puede que sea por eso.

 

Aun que con la duda que me resolvistes puedo tratar con otras libs por que me limitaba a delphi4 (y muchas libs no son compatibles alparecer) o incluso  otro lenguaje como sugieres pero ya que no se mucho delphi voy aprovechar para aprender un poco, solo que obtendre otra version mas reciente que no me presente tantos errores al compilar.

 

Tambien tengo otra duda, he visto en algunas partes que implementan este codigo que tan necesario es en delphi?


delphi
  1. procedure DllEntry(pReason:DWORD);
  2. begin
  3. case pReason of
  4. DLL_PROCESS_ATTACH: CreateIntercepts();
  5. DLL_PROCESS_DETACH: RemoveIntercepts();
  6. DLL_THREAD_ATTACH:;
  7. DLL_THREAD_DETACH:;
  8. end;
  9. end;
  10.  
  11. begin
  12. DllProc:= @DllEntry;
  13. DllEntry(DLL_PROCESS_ATTACH);
  14. end.

Muchas Gracias!.


Editado por fatetmpmgecs, 24 febrero 2022 - 10:48 .

  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 25 febrero 2022 - 08:18

Tambien tengo otra duda, he visto en algunas partes que implementan este codigo que tan necesario es en delphi?


delphi
  1. procedure DllEntry(pReason:DWORD);
  2. begin
  3. case pReason of
  4. DLL_PROCESS_ATTACH: CreateIntercepts();
  5. DLL_PROCESS_DETACH: RemoveIntercepts();
  6. DLL_THREAD_ATTACH:;
  7. DLL_THREAD_DETACH:;
  8. end;
  9. end;
  10.  
  11. begin
  12. DllProc:= @DllEntry;
  13. DllEntry(DLL_PROCESS_ATTACH);
  14. end.

En ocasiones el desarrollador de la dll necesita que se ejecute cierto código cuando es cargada por un proceso o cuando es descargada. En el caso de un hook con inyección dll,  querremos realizarlo al cargar la librería. 

 

No es necesario escribir todo lo que muestras sino sólo DLL_PROCESS_ATTACH para arrancar el hook y DLL_PROCESS_DETACH si quieres liberar el hook al liberar la dll. 

 

Saludos.


  • 0

#5 fatetmpmgecs

fatetmpmgecs

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 25 febrero 2022 - 08:36

En ocasiones el desarrollador de la dll necesita que se ejecute cierto código cuando es cargada por un proceso o cuando es descargada. En el caso de un hook con inyección dll,  querremos realizarlo al cargar la librería. 

 

No es necesario escribir todo lo que muestras sino sólo DLL_PROCESS_ATTACH para arrancar el hook y DLL_PROCESS_DETACH si quieres liberar el hook al liberar la dll. 

 

Saludos.

 

Ok, en mi caso no creo que necesite implemetarlo ya que no ocupo liberar la dll despues de cargada, Gracias por responder!.


  • 0

#6 fatetmpmgecs

fatetmpmgecs

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 25 febrero 2022 - 02:42   Mejor respuesta

Ya pude inyectar!, era por lo que habia comentado de la parte que tuve que cambiar de koldetours era:


delphi
  1. VirtualProtect(Code,Size,Permission,@Result); //LondWord(Result) por @Result

El parametro guarda los derechos actuales del espacio de memoria, en C seria &old_protect y en delphi @old_protect solo para aclarar a quien le sirva. 


  • 1

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 25 febrero 2022 - 02:55

Ya pude inyectar!, era por lo que habia comentado de la parte que tuve que cambiar de koldetours era:


delphi
  1. VirtualProtect(Code,Size,Permission,@Result); //LondWord(Result) por @Result

El parametro guarda los derechos actuales del espacio de memoria, en C seria &old_protect y en delphi @old_protect solo para aclarar a quien le sirva. 

 

Excelente, gracias por compartir. 

 

Saludos

 

PD, Lo marco como resuelto. (y)


  • 0

#8 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 25 febrero 2022 - 06:37

Ya pude inyectar!, era por lo que habia comentado de la parte que tuve que cambiar de koldetours era:


delphi
  1. VirtualProtect(Code,Size,Permission,@Result); //LondWord(Result) por @Result

El parametro guarda los derechos actuales del espacio de memoria, en C seria &old_protect y en delphi @old_protect solo para aclarar a quien le sirva.

 

 
Una aclaración sobre el tema, hay que distinguir entre inyectar y hacer un hook.
 
La inyección de código se refiere a colocar código ageno al proceso en su espacio de direcciones. Se inyecta bien con una dll o de forma directa (sobre esto tienes dos tutoriales en el foro).
 
Cuando hablamos de hook (detours) nos referimos a interceptar una API o función del proceso desviando su código hacia otro código previamente inyectado. Windows dispone de otros tipos de hook en su propia API previstas en el S.O. que permiten interceptar teclado, ratón, mensajes y otras cosas, pero no son objeto de este hilo.
 
Es este segundo proceso en el que es necesario ajustar los permisos de memoria y preferiblemente con VirtualProtectEx. Aquí tienes un tutorial de cómo realizar un hook a la API sin herramientas externas y a bajo nivel: 
HOOK a la API en delphi y en C (trampolín)
 
Saludos.


  • 0

#9 fatetmpmgecs

fatetmpmgecs

    Newbie

  • Miembros
  • Pip
  • 6 mensajes

Escrito 25 febrero 2022 - 07:14

 
Una aclaración sobre el tema, hay que distinguir entre inyectar y hacer un hook.
 
La inyección de código se refiere a colocar código ageno al proceso en su espacio de direcciones, para luego obligar al proceso a ejecutar ese código inyectado. Se inyecta bien con una dll o de forma directa (sobre esto tienes dos tutoriales en el foro).
 
Cuando hablamos de hook (detours) nos referimos a interceptar una API o función del proceso desviando su código hacia otro código previamente inyectado. Windows dispone de otros tipos de hook en su propia API previstas en el S.O. que permiten interceptar teclado, ratón, mensajes y otras cosas, pero no son objeto de este hilo.
 
Es es este segundo proceso en el que es necesario ajustar los permisos de memoria y preferiblemente con VirtualProtectEx. Aquí tienes un tutorial de cómo realizar un hook a la API sin herramientas externas y a bajo nivel: 
HOOK a la API en delphi y en C (trampolín)
 
Saludos.

 

(y) ... Probare APIHook parace mas ligera gran aporte!.


  • 0




IP.Board spam blocked by CleanTalk.