Professional Documents
Culture Documents
Siempre
Buscar
Ingresar
Noticias:
Inicio
Ayuda
Buscar
C alendario
Blog
Ingresar
Registrarse
anterior prximo
Pginas: [1]
Ir Abajo
Autor
I M P RI M I R
escafandra
Moderadores
pdfcrowd.com
12:08:03
Thank You
-Given: 103
-Receive: 734
Mensajes: 2,512
C alificaciones: +776/-0
Sexo:
- EL Hook en la IAT:
Quizs la forma mas sencilla sea el Hook en la IAT. La IAT es una Tabla en la
cabecera PE de todo ejecutable y DLL que contiene las direcciones de las API y
funciones que importa de forma esttica (en tiempo de compilacin).
Cambiando el valor de esas direcciones a una funcin Gancho tenemos
realizado el Hook. Es un mtodo muy estable pero requiere cambiar el valor de
la direccin en todos los mdulos del proceso que importen dicha API. No
funciona para API importada de forma dinmica, es decir con GetProcAddress.
- El Hook Trampoln:
Con esta tcnica modificamos instrucciones asm de la API para provocar un
salto a nuestro cdigo. Nuestro cdigo debe ser capaz de llamar, despus a la
API original sin provocar errores. Esta tcnica es algo mas compleja que la
anterior, funciona para APIs importadas tanto de forma esttica como dinmica
pdfcrowd.com
8BFF
55
8BEC
Lo ideal sera que esto fuera una constante, pero me encontrado APIs con
codificacin distinta en distintos PCs, posiblemente debido a las distintas
actualizaciones del S.O.
Otro buen punto, puede ser buscar una instruccin de salto (jmp) o llamada a
subrutina (call) pero lgicamente no la encontraremos en sitios fijos,
entorpeciendo un sistema automtico de Hook. Esto nos obliga, en cierta
forma, a proceder a un desensamblado de parte del cdigo, bien manual para
cada API, bien automtico. Nosotros vamos a usar un desensamblador de
pdfcrowd.com
En lnea
pdfcrowd.com
escafandra
Moderadores
Thank You
-Given: 103
-Receive: 734
Mensajes: 2,512
C alificaciones: +776/-0
Sexo:
pdfcrowd.com
var
// Puntero a un buffer que representa la API original
// Al hacer el Hook reservamos memoria y copiamos los 5 bytes
// y un salto a la API original
OMessageBox: PMESSAGEBOX = nil;
implementation
// La API hookeada
function NewMessageBox(hWnd: THandle; lpText, lpCaption: PCHAR; uType:
integer): Integer; stdcall;
begin
// OMessageBox representa la API original.
// Cambiamos parmetros para delatar el Hook...
Result:= OMessageBox(hWnd, 'MessageBox HOOKED ', lpCaption, uType or
MB_ICONEXCLAMATION);
end;
[/delphi]
El cdigo de bajo nivel:
Bueno, el resto del trabajo es el duro, bajo nivel y punteros.
El cdigo, que he escrito y os presento, automatiza este trabajo. Creo que si le
prestis atencin se puede entender bien.
[delphi]
// Calcula la direccin de la API original para llamar a la siguiente funcin
procedure InstallHook(HookAPI: Pointer; var ToAPI: Pointer; dllName, ApiName:
PCHAR; Resume: BOOL);
var
pdfcrowd.com
hLib: HMODULE;
API: PBYTE;
begin
hLib:= GetModuleHandle(dllName);
if hLib = 0 then hLib:= LoadLibrary(dllName);
if hLib <> 0 then
begin
API:= GetProcAddress(hLib, ApiName);
InstallHookFromAddr(HookAPI, ToAPI, API, Resume);
end;
end;
// Realiza el Hook a la API. Devuelve un puntero a la funcin puente ToAPI
// Si Resume = trae, el hook est operativo.
procedure InstallHookFromAddr(HookAPI: Pointer; var ToAPI: Pointer; API:
Pointer; Resume: BOOL);
var
NBytes: DWORD;
OldProtect: DWORD;
begin
// Bytes a sobreescribir de la API
NBytes := GetOverloadBytes(API);
// reservar memoria para ToAPI, el camino de vuelta...
ToAPI := VirtualAlloc(nil, NBytes+5, MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
// Preparar la funcin ToAPI
// Autorizo escribir en ToAPI, es un puntero a una funcin...
VirtualProtectEx(THandle(-1), ToAPI, NBytes+5, PAGE_EXECUTE_READWRITE,
OldProtect);
// Copio los primeros bytes de la api original
ASMmemcpy(ToAPI, API, NBytes);
// Escribo un salto relativo a la API original
PBYTE(DWORD(ToAPI) + NBytes)^:= $E9 ; //jmp
pdfcrowd.com
pdfcrowd.com
begin
if HookFunc = nil then exit;
API:= GetProcAddress(GetModuleHandle(dllName), ApiName);
if API <> nil then
ResumeHookFromAddr(HookFunc, API);
end;
[/delphi]
Ya tenemos hecho el Hook. Parte del cdigo no est expuesto. Quiero
comentar que la funcin GetOverloadBytes calcula el nmero de bytes que
debemos traspasar sin peligro al Buffer apuntado por ToAPI. Para calcularlo
usa un desensamblador de longitud de instruccin. Se puede prescindir de ello
pero se corre el riesgo de colgar la aplicacin vctima si la API hookeada
comienza con instrucciones completas en 6 bytes, por ejemplo; partiramos
una instruccin asm perdiendo el sentido del resto del cdigo...!
Ahora faltan las labores de limpieza. Deberamos ser capaces de deshacer el
hook dejando todo como estaba antes de nuestra intromisin.
[delphi]
// Suspende momentneamente el Hook sin desinstalar ToHook
// Restaura los Bytes de la API original guardados en ToAPI
procedure SuspendHookFromAddr(ToAPI, API: Pointer);
var
OldProtect: DWORD;
begin
if(ToAPI = nil) or (API = nil) then exit;
// Autorizo escribir en la API Hookeada
VirtualProtectEx(THandle(-1), API, 5, PAGE_EXECUTE_READWRITE,
OldProtect);
CopyMemory(API, ToAPI, 5);
VirtualProtectEx(THandle(-1), API, 5, OldProtect, PDWORD(nil)^);
end;
pdfcrowd.com
pdfcrowd.com
egostar
Administrador
En lnea
pdfcrowd.com
(trampoln)
Administrador
Thank You
-Given: 1199
-Receive: 647
Mensajes: 9,915
C alificaciones: +704/-7
Sexo:
coding my life
"Si no quieres que la gente se olvide de ti apenas te mueras, escribe algo que valga la
pena leerse o valga la pena escribirse."- Benjamin Franklin
"Los programadores hicimos un pacto con dios, el no hace sistemas y nosotros no
hacemos milagros."- Annimo
escafandra
Moderadores
pdfcrowd.com
(trampoln)
Moderadores
Thank You
-Given: 103
-Receive: 734
Te respondo en desorden...
Cita de: egostar en 05 de noviembre de 2012, 12:18:46
Se e st sobre e scribie ndo e l API ?
Ya lo iremos viendo...
Saludos.
pdfcrowd.com
En lnea
egostar
Follow members
gave a thank to your For this post, 1 member gave a thank you!
post:
cadetill
Moderadores
Thank You
-Given: 139
-Receive: 193
Mensajes: 946
C alificaciones: +199/-0
Sexo:
Delphius
Administrador
Thank You
-Given: 217
-Receive: 334
Mensajes: 4,133
Salu2
cadetill
pdfcrowd.com
Mensajes: 4,133
C alificaciones: +369/-2
Sexo:
El polimorfismo seguir
siendo parte de mi vida?
jeivarmarr
Registrado
jeivarmarr
Registrado
Thank You
-Given: 0
-Receive: 0
Mensajes: 4
C alificaciones: +0/-0
Sexo:
escafandra
Thank You
-Given: 0
-Receive: 0
Mensajes: 4
C alificaciones: +0/-0
Sexo:
Moderadores
En lnea
Una pregunta mas, para hacerlo a un proceso externo por ejemplo Calc.exe,
como lo hara?
En lnea
pdfcrowd.com
Mensajes: 2,512
C alificaciones: +776/-0
Sexo:
Saludos.
En lnea
c0lo
Miembro Platino
Thank You
-Given: 4
-Receive: 0
Hola escafandra,
Si uno deseara hacer el problema inverso, es decir, si uno se encuentro con
algunos Hooks en algunas apis como podra uno atacar o empezar a
desarrollar una solucin o hacer un unhook a dicha api o n-api?
pdfcrowd.com
Mensajes: 241
C alificaciones: +3/-0
Sexo:
Saludos
En lnea
Disculpen si no me expreso correctamente, pero se me chispoteo...
c0lo
Miembro Platino
pdfcrowd.com
Thank You
-Given: 4
-Receive: 0
Epa epa... creo que sufri un lapsus, Porque si deseo hacer el unhook solo
sobre escribo los bytes que inicialmente tenia la api o reconstruyo la api y listo.
Oh no?
Bueno mi pregunta es como puedo utilizar la misma api con su hook sin realizar
el hook, no recuerdo como se llama este metodo... Pero se podria?
Mensajes: 241
C alificaciones: +3/-0
Sexo:
Siempre aprendiendo ...
escafandra
Moderadores
Thank You
-Given: 103
-Receive: 734
Mensajes: 2,512
C alificaciones: +776/-0
Sexo:
En lnea
Hola c0lo si se podra reconstruir la API original. Pero puede ser algo
complicado. Deberemos desensamblar y seguir el cdigo haciendo nfasis en
los saltos. La API original tiene direcciones del orden 7EXXXXXXh y el resto del
cdigo (Hook) direcciones mas bajas. Si la API original est hookeada con un
jmp seguiremos el hook hasta encontrar el jmp de vuelta (salto relativo a
direcciones del orden de 7EXXXXXXh). Unas cuantas instrucciones antes nos
ensearn el clsico "paquete de inicio":
[asm]mov edi,edi
push ebp
mov ebp,esp
..... quizs mas instruciones
jmp XXXXX[/asm]
Ese paquete hasta el salto de vuelta (sin contar ste) ser lo que debemos
sobreescribir en la API Hookeada para devolverla a su estado original.
pdfcrowd.com
Saludos.
En lnea
Pginas: [1]
Ir Arriba
I M P RI M I R
anterior prximo
C omunidad Delphiaccess C OLABORAC IN Tutoriales (Moderador: egostar)
pdfcrowd.com
Ir a: => Tutoriales
ir
Temas recientes
Felicidades poliburro
Autor:
ELKurgan
08/02/2014
(20:20)
08/02/2014
(09:57)
08/02/2014
(09:45)
Divergente
Autor:
Fenareth
Foro: Bar-Tolo
08/02/2014
(09:09)
Autor:
Delphius
Foro: Encuestas
07/02/2014
(22:28)
Autor:
egostar
07/02/2014
(14:42)
Autor:
FerC astro
Foro: Bar-Tolo
07/02/2014
(14:06)
Autor:
poliburro
Foro: Delphi
07/02/2014
(13:21)
Autor:
munozfino
07/02/2014
(12:16)
Foro: Bar-Tolo
09/02/2014
(05:10)
pdfcrowd.com
pdfcrowd.com