elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Temas
Páginas: 1 2 3 4 [5] 6 7 8 9 10
41  Seguridad Informática / Análisis y Diseño de Malware / Inyecciones de código en memoria en: 6 Enero 2016, 23:26 pm
Inyecciones de código en memoria

Conocimientos previos:
     
-ASM
      -WinApi

Contenido:
1-   ¿Qué es la inyección de código en memoria?
2-   ¿Cómo realizarla?
     2.1- Teoría
     2.2 -Práctica
3-   Ejemplos de inyecciones
4-   Despedida


1- ¿Qué es la inyección de código en memoria?

La inyección de código en memoria consiste  en que otro proceso ejecute el código que nosotros queramos.


2- ¿Cómo realizarla?

2.1 - Teoria
Para realizar la inyección lo que haremos será crear   un espacio en el proceso donde queremos inyectar el código  con la api VirtualAllocEx a continuación escribiremos nuestro código con WriteProcessMemory y finalmente lanzamos el hilo con CreateRemoteThread

2.2- Práctica
Para poner en práctica la teoría anterior vamos a inyectar nuestra funcion en el proceso del buscaminas y haremos que nuestra función haga un MessageBox:

Código
  1. format PE GUI 4.0
  2. entry start
  3.  
  4. include 'win32ax.inc'
  5.  
  6.        Ventana db 'Buscaminas',0
  7.        idproc dd ?
  8.        ID dd ?
  9.  
  10.        TamFun dd ?
  11.        DirFun dd ?
  12.  
  13. start:
  14.        invoke FindWindow,NULL,Ventana
  15.        invoke GetWindowThreadProcessId,eax,addr idproc   ;idproc = identficador del proceso
  16.        invoke OpenProcess,PROCESS_ALL_ACCESS,0,[idproc]
  17.        mov [ID],eax
  18.  
  19.        invoke LoadLibrary,"user32.dll" ;cargamos user32.dll
  20.        invoke GetProcAddress,eax,"MessageBoxA" ;obtenemos la dirección de la api
  21.        mov [mMessageBoxA],eax  ; movemos la dirección de la api a la variable que hay dentro de la funcion qeu inyectaremos
  22.  
  23.        mov eax,final  ;Obtenemos el tamaño de la función
  24.        sub eax,Inyectado
  25.        mov [TamFun],eax
  26.  
  27.        invoke VirtualAllocEx,[ID],0,[TamFun],MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE  ;generamos el espacio dentro del proceso
  28.        mov [DirFun],eax
  29.        invoke WriteProcessMemory,[ID],eax,Inyectado,[TamFun],0 ;escribimos nuestro código en el proceso
  30.        invoke CreateRemoteThread,[ID],0,0,[DirFun],0,0,0  ;Lanzamos el hilo.
  31.  
  32.        ret
  33.  
  34.        proc Inyectado
  35.             call offset  ;Técnica del offset delta.
  36.             offset:
  37.             pop ebx
  38.             sub ebx,offset
  39.             push ebx ebx
  40.             pop ecx edx
  41.  
  42.             add ecx,titulo
  43.             add edx,cuerpo
  44.  
  45.             push 0
  46.             push ecx
  47.             push edx
  48.             push 0
  49.  
  50.             call [ebx+mMessageBoxA]
  51.  
  52.  
  53.             ret
  54.  
  55.             titulo db 'Me inyecte!',0
  56.             cuerpo db 'Este Mensage sale del buscaminas ^^',0
  57.  
  58.             mMessageBoxA dd ? ;variable que contiene la dirección de MessageBoxA@user32.dll
  59.        endp
  60.        final:
  61.  
  62. data import
  63.     library kernel32,'Kernel32.dll',\
  64.             user32,'user32.dll'
  65.  
  66.     import user32,MessageBoxA,'MessageBoxA',\
  67.            FindWindow,'FindWindowA',\
  68.            GetWindowThreadProcessId,'GetWindowThreadProcessId'
  69.  
  70.     import kernel32,OpenProcess,'OpenProcess',\
  71.            GetModuleHandle,'GetModuleHandleA',\
  72.            GetProcAddress,'GetProcAddress',\
  73.            VirtualAllocEx,'VirtualAllocEx',\
  74.            WriteProcessMemory,'WriteProcessMemory',\
  75.            CreateRemoteThread,'CreateRemoteThread',\
  76.            LoadLibrary,'LoadLibraryA'
  77. end data  

Como se puede apreciar no es muy difícil pero si plantea un problema grande y es que  nuestro ejecutable sabe en que dirección se encuentra la variable mMessageBoxA cuando compilamos pero al inyectar el código la dirección de la variable cambiara… y nuestra función fallara -_- para eso se usa la tecnica del Delta Offset para recalcular la dirección de las variables y que nuestro código se ejecute bien este en la dirección que este. Para entender que hace el delta Offset pinchar Aquí

3- Ejemplo de inyecciónes

Un simple ejemplo que lanza la calculadora, se inyecta en su proceso cambia el nombre a la ventana y hace un MessageBox

Código
  1. Format PE GUI 4.0
  2. entry start
  3. include 'win32ax.inc'
  4.  
  5. calc db 'c:\windows\system32\calc.exe',0
  6. pi PROCESS_INFORMATION ?
  7. sin STARTUPINFO ?
  8. TamFun dd ?  ;tamaño de la funcion...
  9. DirFun dd ? ; dirección de la funcion
  10. DirUser dd ?
  11.  
  12. start:
  13.        invoke CreateProcessA,0,calc,0,0,0,0,0,0,sin,pi
  14.        invoke Sleep,2000
  15.        invoke LoadLibrary,"user32.dll"
  16.        mov [DirUser],eax
  17.  
  18.        invoke GetProcAddress,[DirUser],"MessageBoxA"
  19.        mov [mMessageBoxA],eax
  20.        invoke GetProcAddress,[DirUser],"FindWindowA"
  21.        mov [mFindWindow],eax
  22.        invoke GetProcAddress,[DirUser],"SetWindowTextA"
  23.        mov [mSetWindowTextA],eax
  24.  
  25.        mov ebx,final  ;obtenemos el Tamaño de la función
  26.        sub ebx,Inyectada
  27.        mov [TamFun],ebx
  28.  
  29.        invoke VirtualAllocEx,[pi.hProcess],0,[TamFun],MEM_COMMIT+MEM_RESERVE,PAGE_EXECUTE_READWRITE
  30.        mov [DirFun],eax
  31.        invoke WriteProcessMemory,[pi.hProcess],eax,Inyectada,[TamFun],0
  32.        invoke CreateRemoteThread,[pi.hProcess],0,0,[DirFun],0,0,0
  33.        ret
  34.  
  35.        proc Inyectada
  36.                call offset
  37.                offset:
  38.                pop ebx
  39.                sub ebx,offset
  40.                push ebx
  41.                pop ecx
  42.  
  43.                add ecx,Calculadora
  44.  
  45.                push ecx
  46.                push NULL
  47.                call [ebx+mFindWindow]
  48.  
  49.                push ebx
  50.                pop ecx
  51.  
  52.                add ecx, TituloVen
  53.  
  54.                push ecx
  55.                push eax
  56.                call [ebx+mSetWindowTextA]
  57.  
  58.                push ebx ebx
  59.                pop edx ecx
  60.  
  61.                add ecx,TituloMsg
  62.                add edx,CuerpoMsg
  63.  
  64.                push 0
  65.                push ecx
  66.                push edx
  67.                push 0
  68.  
  69.                call [ebx+mMessageBoxA]
  70.                ret
  71.  
  72.                TituloMsg db 'Inyectado!',0
  73.                CuerpoMsg db 'El código inyectado Cambio el nombre a la ventana',0
  74.                TituloVen db 'Este es un título falso',0
  75.                Calculadora db 'Calculadora',0
  76.  
  77.                mMessageBoxA dd ?  ;Dirección MessageBox
  78.                mFindWindow dd ?   ;dirección fundwindow
  79.                mSetWindowTextA  dd ? ;Dirección de SetWindowText
  80.        endp
  81.        final:
  82. data import
  83.     library kernel32,'kernel32.dll'
  84.  
  85.     import kernel32,CreateProcessA,'CreateProcessA',\
  86.            Sleep,'Sleep',\
  87.            GetModuleHandle,'GetModuleHandleA',\
  88.            GetProcAddress,'GetProcAddress',\
  89.            VirtualAllocEx,'VirtualAllocEx',\
  90.            WriteProcessMemory,'WriteProcessMemory',\
  91.            CreateRemoteThread,'CreateRemoteThread',\
  92.            LoadLibrary,'LoadLibraryA'
  93. end data    

4- Despedida
Bueno, ya solo queda la despedida…. Jajaja pues eso que espero que les sea utíl  el tuto, la barrera de lo que podais hacer con las inyecciones de código la poneis vosotros ;)

Saludos.
42  Programación / .NET (C#, VB.NET, ASP) / Email y C#. en: 4 Enero 2016, 17:31 pm
Buenas, alguien sabe alguna manera de enviar un correo desde C#?

He probado de la siguiente manera y no lo consigo, el servidor me responde que necesito una conexion segura.

Código
  1. using System;
  2. using System.Net.Mail;
  3. using System.Net;
  4.  
  5. namespace Email
  6. {
  7.    class Program
  8.    {
  9.        static void Main(string[] args)
  10.        {
  11.            MailMessage email = new MailMessage();
  12.            MailAddress emisor = new MailAddress("x@gmail.com");
  13.  
  14.            email.Subject = "desde c#";
  15.            email.To.Add("x4@hotmail.com");
  16.            email.From =  emisor;
  17.            email.Body = "Este es el cuerpo del mensaje";
  18.  
  19.            SmtpClient SMTP = new SmtpClient("smtp.gmail.com");
  20.            NetworkCredential credenciales = new NetworkCredential("x@gmail.com","xxx");
  21.  
  22.            SMTP.Port = 587;
  23.            SMTP.EnableSsl = true;
  24.            SMTP.Credentials = credenciales;
  25.  
  26.            try
  27.            {
  28.                SMTP.Send(email);
  29.                Console.WriteLine("Enviado!");
  30.            }
  31.            catch (Exception e)
  32.            {
  33.                Console.WriteLine(e.Message);
  34.            }
  35.  
  36.            Console.Read();
  37.  
  38.        }
  39.    }
  40. }
  41.  

saludos.
43  Seguridad Informática / Análisis y Diseño de Malware / Anubis Killer PE v0.1 Binario+Source en: 31 Diciembre 2015, 12:18 pm
¿Cuantas veces te preguntaste como funciona el RunPE Killer de psymera?

Bién pues ahora lo puedes descubrir, he creado este programa que funciona de forma similar. Es decir, desempaqueta el archivo que contiene un cripter.



Entorno gráfico programado en C y la DLL en FASM.

Espero que lo disfruten y aprendan.

Descarga Binario:
http://www.mediafire.com/download/3f7nyj0hs96hi1t/KillerPEv0.1.rar

Descarga Source:
http://www.mediafire.com/download/0etz5z2v7djchvc/Killer+PE.rar

saludos :P

44  Foros Generales / Foro Libre / Feliz navidad. en: 21 Diciembre 2015, 09:01 am
Feliz Navidad a todos los usuarios de este gran foro.  ;-)

Que estos dias llenen las casas de alegría y felicidad y que intentemos este proximo año ser un poco mas buenos >:D


saludos!!

45  Foros Generales / Foro Libre / Agresion a Rajoy. en: 17 Diciembre 2015, 07:43 am
http://www.elmundo.es/espana/2015/12/16/5671a79a268e3e257b8b46ac.html


No tardarán en sacar el GIF. :laugh:
46  Seguridad Informática / Análisis y Diseño de Malware / El arte del API Hooking. en: 12 Diciembre 2015, 21:18 pm
Bueno, en este texto voy a intentar explicar de que se trata el API hooking.

Una descripción rapida de lo que es este metodo sería algo así: realizar un gancho a una función del sistema para poder modificar su retorno o bién sus parametros.

¿Que podemos hacer con este metodo?

Pues de todo lo que se nos ocurra desde ocultar archivos, procesos, hasta espiar conversaciones de skype, bloquear llamadas al sistema de detecminados procesos, etc.


¿Que nociones debo tener para aplicar correctamente esta técnica?


Se deberá tener nociones de ensamblador, ademas el ejemplo que aquí usare esta en FASM, además de saber manejar un poco Ollydbg.


¿En que consiste dicha técnica?

Consiste en modificar los primeros bytes de la funcion que queremos hookear,  en esos primeros bytes escribiremos un salto a nuestra funcion (Que emulara la función original pero con los parametros que nosotros queramos).

Para modificar los primeros bytes de la API deberémos dar permisos de escritura y ejecución ya que si no no podremos escribir nuestro salto.


Dicho todo esto pasemos al código y a aprender su funcionamiento.

En este caso hookearemos la API  MessageBoxA, para ello crearemos nuestro propio ejecutable:

Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.        msg1            db 'hola',0
  5.  
  6.  
  7. .code
  8. start:
  9.  
  10.    invoke MessageBoxA,0,msg1,0,0
  11.    ret
  12.  
  13. .end start                    

la salida del programa es la siguiente:



Obtetivo: que nuestro programa cante lo que nosotros queramos.

El primer paso será ver el inicio de la API desde el olly DBG para que cuando nosotros escribamos el salto no dejemos ninguna instruccion a medias (si dejamos alguna instruccion a medias nuestro programa petara)

Asique abrimos OllyDbg y vemos que contiene el inicio de la API.



A nosotros en realidad solo nos interesan los primero 5 bytes, que es lo que ocupa el salto (jmp + Direccion).

En este caso nos viene perfecto ya que las 3 primeras instrucciones:

Código
  1. mov edi, edi
  2. push ebp
  3. mov ebp, esp

Ocupan exactamente 5 bytes.

Bien, copiamos esas 3 instrucciones y las guardamos en un archivo de texto para no olvidarlas, ya que nos harán falta mas adelante.

Una vez hecho esto, lo que haremos será lo siguiente, obtendremos la dirección de MessageBoxA, y sobreescribiremos sus primeros bytes para que salte a nuestra función.

Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.        msg1            db 'hola',0
  5.        USER32          db 'USER32.DLL',0
  6.        funcion         db 'MessageBoxA',0
  7.        dirfun          dd ?
  8.        proteccion      dd ?
  9.  
  10. .code
  11. start:
  12.  
  13.    call Hook
  14.  
  15.    invoke MessageBoxA,0,msg1,0,0
  16.    ret
  17.  
  18.    proc Hook
  19.        invoke LoadLibrary, USER32
  20.        invoke GetProcAddress,eax,funcion   ; Obtenemos la  direccion de la función
  21.        mov [dirfun],eax
  22.  
  23.        mov ebx,eax
  24.  
  25.        mov eax, mMessageBox     ; Calculamos el salto relativo.
  26.        sub eax,ebx
  27.        sub eax,5
  28.  
  29.  
  30.        push eax
  31.  
  32.        invoke VirtualProtect,[dirfun],5,PAGE_EXECUTE_READWRITE,addr proteccion   ; damos derechos de acceso.
  33.  
  34.        pop eax
  35.  
  36.        mov ebx, [dirfun]
  37.  
  38.        mov byte[ebx],0xE9  ;escribimos un jmp al inicio de la API verdadera
  39.        inc ebx
  40.        mov dword[ebx],eax   ; escribimos el salto que tiene que dar en el inicio de la api verdadera
  41.        add ebx,4
  42.  
  43.        ret
  44.    endp
  45.  
  46.    proc mMessageBox     ; Funcion que saltará cuando el programa llame a la API Original
  47.  
  48.        ret
  49.    endp
  50.  
  51. .end start    


El texto esta comentado pero de igual forma puntualizaré algunas cosillas.

1- Para poder escribir sobre la API original es OBLIGATORIO dar derechos de escritura, en este ejemplo esto se hace con VirtualProtect
2- Tendremos que calcular el salto relativo a nuestra función,  como se ve claramente en el código
3- Llegados a este punto ya tenemos establecido el hook por lo que si probamos a ejecutar el programa de arriba no imprimira nada en pantalla, ya que hemos roto los primeros bytes de la API, es más, queda totalmente inutilizada llegados a este punto.

Ahora tendremos que programar la funcion mMessageBox, para que cante lo que nosotros queramos.

Algunos datos que tenemos que tener en cuenta es que los valores que se introdujeron en la pila sigue ahí, junto con la dirección de retorno de la función, nosotros tendremos que recuperar la funcion de retorno para que el programa siga su ejecución correctamente.

Para aplicar esto debemos saber que, al realizar un call lo que hace el procesador es introducir en la pila la siguiente instruccion que se ejecutara cuando la función a la que llamamos retorne. Por eso lo que nosotros hacemos será recuperarla, introducir lo que nosotros queramos que cante la API, ejecutar los primeros bytes originales de la API y saltar a la dirección original de la API + 5 bytes (recordemos que en esos primeros 5 bytes esta el hook, por eso los emulamos desde nuestra funcion).

Ahí va el código completo del hook comentado.

Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.        msg1            db 'hola',0
  5.        USER32          db 'USER32.DLL',0
  6.        funcion         db 'MessageBoxA',0
  7.        dirfun          dd ?
  8.        proteccion      dd ?
  9.        msghook         db 'API Hookeada!',0
  10.  
  11. .code
  12. start:
  13.  
  14.    call Hook
  15.  
  16.    invoke MessageBoxA,0,msg1,0,0
  17.    ret
  18.  
  19.    proc Hook
  20.        invoke LoadLibrary, USER32
  21.        invoke GetProcAddress,eax,funcion   ; Obtenemos la  direccion de la función
  22.        mov [dirfun],eax
  23.  
  24.        mov ebx,eax
  25.  
  26.        mov eax, mMessageBox     ; Calculamos el salto relativo.
  27.        sub eax,ebx
  28.        sub eax,5
  29.  
  30.  
  31.        push eax
  32.  
  33.        invoke VirtualProtect,[dirfun],5,PAGE_EXECUTE_READWRITE,addr proteccion   ; damos derechos de acceso.
  34.  
  35.        pop eax
  36.  
  37.        mov ebx, [dirfun]
  38.  
  39.        mov byte[ebx],0xE9  ;escribimos un jmp al inicio de la API verdadera
  40.        inc ebx
  41.        mov dword[ebx],eax   ; escribimos el salto que tiene que dar en el inicio de la api verdadera
  42.        add ebx,4
  43.  
  44.        ret
  45.    endp
  46.  
  47.    proc mMessageBox     ; Funcion que saltará cuando el programa llame a la API Original
  48.        pop eax       ; obtenemos la direccion de retorno que introdujo el call
  49.  
  50.        pop ebx       ; sacamos los parametros original que se pasaron a la API
  51.        pop ebx
  52.        pop ebx
  53.        pop ebx
  54.  
  55.        push 0       ; Introducimos los parametros que queremos que ejecute nuestra API
  56.        push 0
  57.        push msghook
  58.        push 0
  59.  
  60.        push eax     ; Introducimos la direccion de retorno original
  61.  
  62.        mov edi, edi    ; Ejecutamos los 5 primeros bytes originales de la API
  63.        push ebp
  64.        mov ebp, esp
  65.  
  66.        mov ebx, [dirfun]   ; Calculamos el salto hacia la API original
  67.        add ebx,5
  68.  
  69.        jmp ebx           ; Saltamos a la direccion de la API original + 5 bytes
  70.  
  71.        ret
  72.    endp
  73.  
  74. .end start

Ejecutamos nuestro programa y veremos que solo cantará lo que nosotros queramos.  :D



¿Pero, como puedo hookear una función que esta en otro proceso?

Estando en su mismo proceso, esto se puede conseguir inyectando nuestra DLL con el hook en el proceso o bién desde una inyección de código.

Bueno pues de momento eso ha sido todo, lo he intentado explicar de manera simple y para que se entienda bien.

Decir también que los ejemplos han sido desarrollados y probados en una máquina x64 con Windows 7.

Cualquier duda o colsulta será respondida gustosamente.

saludos!

47  Programación / Ingeniería Inversa / Problema con OllyDbg y ejecutables en FASM en: 12 Diciembre 2015, 20:26 pm
Bueno pues el caso es que cuando cargo mi programa hecho en FASM para debuguearlo antes me carga una serie de instrucciones y unos SYSENTER que no los he programado yo y de hecho en ocasiones nisiquiera salen las instrucciones verdaderas que yo programe o ni aparecen  :huh:

alguien sabe algo?

saludos.
48  Programación / Programación General / [RETO] Algoritmo de compresión en: 17 Febrero 2015, 08:55 am
Bueno, pues como esta la cosa muy parada y viendo una interesante pregunta que han realizado hace poco (esta), he pensado que se podría realizar un concurso en el que los usuarios tendrían que desarrollar un software de compresión/descompresión, en el que, el algoritmo que mas comprima los archivos gana.

Reglas:

-El código tiene que ser liberado.
-No vale usar librerías de terceros.

¿Os animáis?
49  Sistemas Operativos / GNU/Linux / Donde se guarda la contraseña Wifi en Ubuntu. en: 17 Febrero 2015, 08:38 am
Seguro que mas de uno se lo a preguntado, tienes que conectar algún otro aparato que no sea el PC al WIFI y no tienes a mano el router  :silbar: :rolleyes:

Bien, a mi me paso y por suerte encontré la solución. Se guarda en la siguiente ruta:

/etc/Network Manager/system-connections/

Dentro de ella aparecerán los archivos con los nombres de las redes a las que nos hemos conectado, basta con abrir el archivo de nuestra red y encontraremos toda su configuración e información.

Código:
[connection]
id=NOMBRE_DE_LA_RED
uuid=XXXXXXXX-0e74-4e4b-a363-XXXXXXXX
type=802-11-wireless

[802-11-wireless]
ssid=WLAN_XXXX
mode=infrastructure
mac-address=00:19:XX:XX:XX
security=802-11-wireless-security

[802-11-wireless-security]
key-mgmt=wpa-psk
auth-alg=open
psk=CONTRASEÑA

[ipv4]
method=auto

[ipv6]
method=auto


Espero que a alguien le sirva.

saludos!
50  Seguridad Informática / Análisis y Diseño de Malware / Hook API Calculando cantidad opcodes. en: 5 Febrero 2015, 16:45 pm
Bueno este código lo tenía por ahí de hace un par de años, y al final lo voy a perder así que aquí os lo dejo por a alguien le sirve.

Código
  1. ; Programado por mDrinky o Juan fary.
  2. ; drinky.94@hotmail.com
  3.  
  4. include 'win32ax.inc'
  5.  
  6. ; Instrucciones a las que es capaz de sacar la longitud.
  7.  
  8. ; mov esp,ebp                          = 0x8B  2 bytes
  9. ; push ebp                             = 0x55  1 byte
  10. ; mov Reg,DWORD                        = 0xB8 + Registro   5 bytes
  11. ; ret                                  = 0xC3 1 byte
  12. ; ret Numero                           = 0xC2 2 bytes
  13. ; mov dword[Direccion],Numero          = 0x83 7 bytes
  14.  
  15. .data
  16.    DLL  db 'USER32.DLL',0
  17.    API  db 'MessageBoxA',0
  18.    MsgHook  db 'Api Hookeada',0
  19.  
  20.    ApiBuena  dd ?
  21.    CanSalto  dd ?
  22.    oPer  dd ?
  23.    Salto  dd ?
  24.  
  25. .code
  26. start:
  27.    invoke LoadLibraryA,DLL
  28.    invoke GetProcAddress,eax,API
  29.    mov [ApiBuena],eax
  30.  
  31.    push MiFuncion
  32.    Call Hookear
  33.  
  34.    push 0
  35.    push 0
  36.    push 0
  37.    push 0
  38.  
  39.    call [MessageBoxA]
  40.  
  41.    push 0
  42.    call [ExitProcess]
  43.  
  44.  
  45. MiFuncion:
  46.    pop ecx
  47.  
  48.    add esp,0xC
  49.  
  50.    push 0
  51.    push 0
  52.    push MsgHook
  53.    push 0
  54.  
  55.    push ecx
  56.  
  57.    ApiVerdadera:
  58.    db 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90
  59.  
  60.    push eax
  61.  
  62.    mov eax,[ApiBuena]
  63.    add eax,[CanSalto]
  64.    mov [Salto],eax
  65.  
  66.    pop eax
  67.  
  68.    jmp [Salto]
  69.  
  70.  
  71. proc Hookear,FunHook
  72.  
  73.    mov ecx,0
  74.  
  75.    NumOpcode:
  76.  
  77.    cmp byte[eax],0x8B
  78.    jne NoOp1
  79.  
  80.    add ecx,2
  81.    add eax,2
  82.  
  83.    NoOp1:
  84.  
  85.    cmp byte[eax],0x55
  86.    jne NoOp2
  87.  
  88.    add ecx,1
  89.    add eax,1
  90.  
  91.    NoOp2:
  92.  
  93.    cmp byte[eax],0xB8
  94.    jb NoOp3
  95.    cmp byte[eax],0xBD
  96.    ja NoOp3
  97.  
  98.    add ecx,5
  99.    add eax,5
  100.  
  101.    NoOp3:
  102.  
  103.    cmp byte[eax],0xC3
  104.    jne NoOp4
  105.  
  106.    add ecx,1
  107.    add eax,1
  108.  
  109.    NoOp4:
  110.  
  111.    cmp byte[eax],0xC2
  112.    jne NoOp5
  113.  
  114.    add ecx,2
  115.    add eax,2
  116.  
  117.    NoOp5:
  118.  
  119.    cmp byte[eax],0x83
  120.    jne NoOp6
  121.  
  122.    add ecx,7
  123.    add eax,7
  124.  
  125.    NoOp6:
  126.  
  127.    cmp ecx,5
  128.    jb NumOpcode
  129.  
  130.    mov [CanSalto],ecx
  131.  
  132.    invoke VirtualProtect,[ApiBuena],20,PAGE_EXECUTE_READWRITE,addr oPer
  133.    invoke VirtualProtect,ApiVerdadera,20,PAGE_EXECUTE_READWRITE,addr oPer
  134.  
  135.    mov eax,[ApiBuena]
  136.    mov edx,ApiVerdadera
  137.  
  138.    mov ecx,0
  139.  
  140.    GuardarBytes:
  141.    mov bl,byte[eax+ecx]
  142.    mov byte[edx+ecx],bl
  143.  
  144.    inc ecx
  145.  
  146.    cmp ecx,[CanSalto]
  147.    jne GuardarBytes
  148.  
  149.    mov eax,[ApiBuena]
  150.  
  151.    mov byte[eax],0x68
  152.    inc eax
  153.  
  154.    mov ebx,dword[FunHook]
  155.    mov dword[eax],ebx
  156.  
  157.    add eax,4
  158.  
  159.    mov byte[eax],0xC3
  160.  
  161.    ret
  162. endp
  163.  
  164. .end start

No recalcula todas las API pero si la gran mayoría.

saludos.
Páginas: 1 2 3 4 [5] 6 7 8 9 10
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines