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

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pattern Scanner
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pattern Scanner  (Leído 1,919 veces)
Karman


Desconectado Desconectado

Mensajes: 673



Ver Perfil WWW
Pattern Scanner
« en: 6 Marzo 2011, 09:56 am »

Un Pattern Scanner es una función capaz de "encontrar" algo que nos interesa en un módulo externo (puede utilizarse incluso sobre otro proceso aunque ya es más complicado) sin importar la versión de ese módulo (dll,exe,etc.), la única condición para que nuestro Pattern Scanner funcione es que lo que tomamos de referencia no varíe en las distintas versiones de dicho módulo.

Lo primero que se debe hacer es definir que se quiere obtener (esto puede ser una variable o función de dicho módulo del cual no se tengan referencias para llegar), para hacerlo se puede hacer uso de ingeniería inversa (o sea, desensamblar el módulo).

Veamos un ejemplo (en nuestro propio módulo con el fin de visualizarlo): creamos un simple programa con una sola función:

Código
  1. #include <windows.h>
  2.  
  3. char titulo[]="titulo";
  4. char mensaje[]="un mensaje";
  5.  
  6. void funcionascanear(void){
  7.  MessageBox(0,mensaje,titulo,0);
  8. }
  9.  
  10. int main(void){
  11.  funcionascanear();
  12.  return 0;
  13. }

abrimos nuestro programa con ollydbg y buscamos nuestra función:

Código
  1. 004012D0  /$  55                 PUSH    EBP
  2. 004012D1  |.  89E5               MOV     EBP, ESP
  3. 004012D3  |.  83EC 18            SUB     ESP, 18
  4. 004012D6  |.  C74424 0C 00000000 MOV     DWORD PTR SS:[ESP+C], 0          ; |
  5. 004012DE  |.  C74424 08 00204000 MOV     DWORD PTR SS:[ESP+8], generico.0>; |ASCII "titulo"
  6. 004012E6  |.  C74424 04 07204000 MOV     DWORD PTR SS:[ESP+4], generico.0>; |ASCII "un mensaje"
  7. 004012EE  |.  C70424 00000000    MOV     DWORD PTR SS:[ESP], 0            ; |
  8. 004012F5  |.  E8 86080000        CALL    <JMP.&USER32.MessageBoxA>        ; \MessageBoxA
  9. 004012FA  |.  83EC 10            SUB     ESP, 10
  10. 004012FD  |.  C9                 LEAVE
  11. 004012FE  \.  C3                 RETN

en base a este código ASM crearemos un "patron" que nos lleve a dicha función (nuestro objetivo en este caso será modificar el mensaje)

Citar
55                            PUSH    EBP
89E5                         MOV     EBP, ESP
83EC 18                    SUB     ESP, 18
C74424 0C 00000000 MOV     DWORD PTR SS:[ESP+C], 0          ; |
C74424 08 00204000 MOV     DWORD PTR SS:[ESP+8], generico.0>; |ASCII "titulo"
C74424 04 07204000 MOV     DWORD PTR SS:[ESP+4], generico.0>; |ASCII "un mensaje"
C70424 00000000      MOV     DWORD PTR SS:[ESP], 0            ; |
E8 86080000             CALL    <JMP.&USER32.MessageBoxA>        ; \MessageBoxA
83EC 10                    SUB     ESP, 10
C9                            LEAVE
C3                            RETN

lo que está en rojo será nuestro patrón (se lo puede complicar más, y es preferible, pero para nuestro ejemplo servirá), por lo tanto generamos una función que lo detecte:

Código
  1. char *findmsgbypattern(){
  2.  unsigned char *p;
  3.  //dirección inicio / fin del escaneo
  4.  for(p=0x00401000;p<0x00401FFF;p++){
  5.    //nuestro patron
  6.    if(p[0]==0x55&&p[1]==0x89&&p[3]==0x83&&p[6]==0xC7&&p[14]==0xC7&&p[22]==0xC7){
  7.      //dirección de la variable tomada del código
  8.      return (char *)*(void**)&p[26];
  9.    }
  10.  }
  11.  return NULL;
  12. }

Un detalle a destacar de la función es que &p[26] nos devolverá la dirección de memoria de la instrucción, pero no de la variable, entonces mediante el *(void**) obtendremos la verdadera dirección.

Ahora ya podemos escanear nuestro código, y en caso de encontrar nuestra variable modificarla:

Código
  1. #include <windows.h>
  2.  
  3. char titulo[]="titulo";
  4. char mensaje[]="un mensaje";
  5.  
  6. void funcionascanear(void){
  7.  MessageBox(0,mensaje,titulo,0);
  8. }
  9.  
  10. char *findmsgbypattern(){
  11.  unsigned char *p;
  12.  //dirección inicio / fin del escaneo
  13.  for(p=0x00401000;p<0x00401FFF;p++){
  14.    //nuestro patron
  15.    if(p[0]==0x55&&p[1]==0x89&&p[3]==0x83&&p[6]==0xC7&&p[14]==0xC7&&p[22]==0xC7){
  16.      //dirección de la variable tomada del código
  17.      return (char *)*(void**)&p[26];
  18.    }
  19.  }
  20.  return NULL;
  21. }
  22.  
  23. int main(void){
  24.  char *msg=findmsgbypattern();
  25.  if(msg)
  26.    strcpy(msg,"mi mensaje");
  27.  funcionascanear();
  28.  return 0;
  29. }

Solo cabe aclarar que en el caso de modificar un string la variable original debe ser de un tamaño adecuado para nuestra modificación.

S2

PD: El ejemplo fue compilado con Mingw (GCC), es casi seguro que no funcione en otros compiladores (VC, etc), para hacerlo funcionar hay que rearmar el patrón.

PD2: Existen librerías que permiten buscar patrones de forma más sencilla, como por ejemplo (formato olly):

Código
  1. findpattern(dirinicio,dirfin,"XX????XX??????XX????XX");

pero lo que hacen al fin y al cabo es lo mismo.


« Última modificación: 9 Marzo 2011, 02:07 am por Karman » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Tutorial] Crear un pattern
Diseño Gráfico
Error_404 7 3,642 Último mensaje 13 Enero 2007, 05:05 am
por Error_404
validar email o dirección de correo con Pattern y Matcher « 1 2 »
Java
kinos 10 20,746 Último mensaje 4 Agosto 2009, 19:06 pm
por kinos
How to create Progressbar from Image Pattern
Programación Visual Basic
Mi4night 2 1,909 Último mensaje 13 Agosto 2010, 00:25 am
por Mi4night
OCR con pattern
.NET (C#, VB.NET, ASP)
arenoide 5 4,783 Último mensaje 18 Julio 2011, 13:35 pm
por arenoide
pattern html
Desarrollo Web
JS3 2 2,004 Último mensaje 23 Noviembre 2014, 17:54 pm
por JS3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines