Karpoff Spanish Tutor 1999-2002

Programa:

NetxRay 3.0 (Demo)


 

PROTECCION: Limitación de paquetes capturados a mostrar
Descripcion: Solo una de las tantas limitaciones
Dificultad: Medio
DOWNLOAD: http://www.logixcomms.co.uk
Herramientas: OllyDbg, spy++
CRACKER: Tamoxifeno    FECHA: 27/01/2002

 

 INTRODUCCION

Buenas a todos, para que sea un gran debut me reservé una perlita para los que nos gustan las redes...nada mejor que disponer de un Sniffer sin limitaciónes para ver los paquetes capturados!!! . Puesto que no he podido encontrar quien lo haya hecho ( si alguien sabe donde encontrar el crack completo, que me ahorre el trabajo y me avise, gracias!!!), que mejor que hacerlo uno mismo asi que manos a la obra. Aclaro que utilizo el Ollydbg pués es increiblemente potente utilizando el entorno de Windows, y con un excelente manejo para: patchear el codigo, hacer dumps de toda la memoria utilizada por la aplicación, busquedas y cambios en la misma (limitación que encontré en el W32Dasm), analisis Heuristico del codigo, incorporar archivos ".lib" para reconocer funciones "inline" tipo "strlen" de C (usando el scan object file) y muchas más características potentísimas. ...en fin lo mejor que he encontrado.

 

 

 AL ATAKE

Como lo que el programa restringe es el número de items que se cargan en el Listbox de los paquetes que se capturaron, lo interesante sería primero ver si efectivamente no se cargan esos paquetes porque no se levantan de la red (lo cual sería un problema) o simplemente se levantan todos los que circulan por la red pero solo se limita el número de ellos que se muestran.Poniendome  en el lugar del programador que realizó esta limitación, sería muy incómodo tener que tocar el código de captura pués es el código fundamental del programa, y sería más sencillo capturar todo y sólo mostrar unas pocas (5) de estas tramas!!!

Un inconveniente que no he solucionado aún en programas que utilicen las MFC es el tema de los ordinales, por lo cual (al menos por ahora) utilizo el archivo "mfc42.def" para encontrar el nombre de la función correspondiente al ordinal que busco (si alguien sabe alguna forma más comoda solo avise!).

Comento al menos para mi es un poco más complicado trabajar con programas que utilicen las MFC por todo  lo que las mismas clases mantienen oculto, aunque teniendo los fuentes de las MFC que vienen con el VStudio es más sencillo.

Lo primero es entonces ver donde se crea la ventana que mostrará las capturas (así como también hubiese estado bien ver donde se le indica al ListBox que agrege un item con SendMessage y LB_ADDSTRING), para ello primero debemos saber que ventana es la que se crea , para lo cual podermos poner un breakpoint en CreateWindowEx dentro del modulo mfc42.dll y a la vez investigar con el spy++ el tipo de clase a la que pertenece la ventana nueva y sus controles. Luego de encontrar inspeccionar vemos que la clase de la ventana nueva es "Afx:400000:b:1456:6:4f07" , y la que contiene el ListBox es una SubClasificación de la está última que que se llama "NetXVList" , por lo que buscamos donde se crea esta ventana...y encontramos

 

004844CF . PUSH 0
004844D1 . PUSH NETXRAY.0059D3B4 ; ASCII "NetXVList"
004844D6 . MOV ECX, EBX
004844D8 . CALL <JMP.&MFC42.#2124>
004844DD .MOV EBP, DWORD PTR SS:[ESP+10]

donde MFC42.#2124 es el ordinal de la función mfc "CWnd::Create" como se ve en el .def que además pone unos cuantos caracteres raros: "?Create@CWnd@@UAEHPBD0KABUtagRECT@@PAV1@IPAUCCreateContext@@@Z @ 2124 NONAME"

 

Ok, un gran avance, pero lo importante está por venir...seguimos analizando y vemos como crea el resto de los controles en esa ventana, llama distintas APIs y algunas mfc hasta que se llega a :

 

004846D2 .>LEA ECX, DWORD PTR DS:[ESI+48]
004846D5 .>CALL <JMP.&MFC42.#6242> ; SubClassWindow-CWnd
004846DA >>MOV ECX, DWORD PTR DS:[ESI+A8]
004846E0 .>PUSH 1 ; /Erase = TRUE
004846E2 .>PUSH 0 ; |pRect = NULL
004846E4 .>PUSH ECX ; |hWnd
004846E5 .>CALL NEAR DWORD PTR DS:[<&USER32.InvalidateRect>] ; \InvalidateRect
004846EB .>PUSH 5
004846ED .>MOV ECX, EDI
004846EF .>CALL <JMP.&MFC42.#6215> ; ShowWindow
004846F4 .>MOV ECX, EBP
004846F6 .>CALL 00463260         ;            <========== AQUI ESTA!!!!!!!!!
004846FB .>LEA EDI, DWORD PTR DS:[ESI+178]
00484701 .>MOV EBX, EAX
00484703 .>MOV ECX, EDI
00484705 .>MOV DWORD PTR SS:[ESP+14], EBX
00484709 .>CALL 004C0B80           
0048470E .>MOV EDX, DWORD PTR DS:[ESI+198]
00484714 .>PUSH 0 ; /lParam = 0
00484716 .>PUSH 0 ; |wParam = 0
00484718 .>PUSH 602 ; |Message = MSG(602)
0048471D .>PUSH EDX ; |hWnd
0048471E .>CALL NEAR DWORD PTR DS:[<&USER32.SendMessageA>] ; \SendMessageA
00484724 .>PUSH EBX
00484725 .>MOV ECX, EDI
00484727 .>CALL 00482D30 ; Set ByteArray Size

vemos que llama a una funcion con el "CALL 00463260", y vemos con que nos encontramos...

 

00463260 MOV ECX, DWORD PTR DS:[ECX+58]
00463263 TEST ECX, ECX
00463265 JE SHORT 00463277
00463267 CALL 00492C10                ; <= AQUI ESTA LA OTRA FUNCION!!!!
0046326CCMP EAX, 5 ; Mostrar más de 5 tramas?
0046326F JLE SHORT 00463279
00463271 MOV EAX, 5      ;Si => limita a 5
00463276 RETN
00463277 XOR EAX, EAX
00463279 RETN

donde se ve que llama a una función que retorna un valor en EAX donde el programa compara para ver si es mayor a 5, y en ese caso reemplaza EAX por 5 ...sospechoso... podría indicar que de aqui me limita el número de tramas a mostrar. Pero más evidente será si miramos la función que llama:

 

00492C10 MOV EAX, DWORD PTR DS:[ECX+3C] ; Puntero a estructura?
00492C13 MOV EAX, DWORD PTR DS:[EAX+10] ; EAX = *(p + Offset)  (Nro de tramas a mostrar)

00492C16 RETN

Aqui se ve que el puntero que pone en EAX viene a ser algún tipo de estructura o clase que no he descubierto pero que indica lo siguiente: por un lado con un offset de +10 encuentra ahí el número de tramas a mostrar (nunca mayor a 5, osea que en algún otro lado hay otra limitación) y lo devuelve en EAX, pero también vemos que en un offset -18 está el número total de tramas levantadas!!!. Esto ultimo se ve haciendo un dump de la zona de memoria del puntero DWORD PTR DS:[ECX+3C], y sobre todo se encuentra que luego vienen las tramas que ha levantado (se puede reconocer fácilmente los ping en memoria), y para mejor, si por ejemplo estuve haciendo muchos ping  seguidos y han sido capturados N tramas, vemos que en el dump aparecen las N tramas!!!! es decir que , como mi intuición de programador me indicaba, siempre captura todas las tramas pero muestra algunas. Llegado este punto las opciones son claras, por un lado tenemos la función que limita a 5 las tramas a mostrar , y por otro la que devuelve el número a de tramas disponibles que a su vez también está limitada (en alguna otra parte del código). 

Es hora de  "patchear" el codigo... es muy interesante el encontrarnos con tantos nop's cercanos a la función pues permitirán utilizarlos para agregar algunas lineas de código. 

Primero quitamos esa comprobación respecto a 5, por lo que ponemos la función del siguiente modo:

 

00463260 MOV ECX, DWORD PTR DS:[ECX+58]
00463263 TEST ECX, ECX
00463265 JE SHORT 0046326D
00463267 CALL 00492C10             ; Llama a la función patcheada !!!
0046326C RETN ;               retorna que muestre todos los paquetes capturados

0046326D XOR EAX, EAX
0046326F RETN

Luego modificamos la segunda función, para que cada vez que sea llamada copie de está estructura el valor del número de tramas capturadas donde está el valor del número de tramas a mostrar, y además devuelva este valor en EAX. De esta forma cada vez que se llame a esta función (se la llama por todos lados) nos aseguramos de mantener anulada la limitación. Para realizar esto necesitamos utilizar un registro (elijo el ESI) 

por lo que recurro a los nop's existentes para agregar los push/ pop para este registro y el resto : 

 

00492C10 PUSH ESI   ; Salvo ESI
00492C11 MOV ESI, DWORD PTR DS:[ECX+3C] ; Puntero a Estructura !!!
00492C14 MOV EAX, DWORD PTR DS:[ESI-18] ; Offset a Tramas Capturadas (y queda en EAX)
00492C17 MOV DWORD PTR DS:[ESI+10], EAX ; Copio a Offset Tramas a Mostrar
00492C1A POP ESI    ; Restauro ESI
00492C1B RETN ; quedó en EAX que muestré todas!!!

Ahora no queda más que utilizar un editor hexa para cambiar las lineas de codigo por las nuevas que les acabo de mostrar y ya estará listo el nuevo ejecutable.Obviamente hay muchas cosas que no entraron en este tutorial pero que fueron haciendo que llegue a estás conclusiones (como dumps de memoria , y pruebas de distinto tipo como el buscar donde se agregan los items al ListBox, etc)

Bueno, espero disfruten este magnifico Sniffer (al menos hasta que aparezca la restricción de los 30 días, pero esa será otra historia)

Espero haber sido claro por ser la primera vez...

                               Tamoxifeno@data54.com

 

Saludos:

- A mi piojito hermoso      

- La gente de la 30 y del Fhelipe

- Karpoff  , nuMIT y los que colaboran en el crack,  a quienes no conozco pero de quienes siempre se aprende.

     

 

 

Karpoff Spanish Tutor: Pagina dedicada a la divulgacion de informacion en Castellano, sobre Ingenieria Inversa y Programacion. Email "Colabora con tus Proyectos"
www.000webhost.com