Você está na página 1de 11

aRC-FL-Cdigo Fuente 001 Acceso desprotegido en Windows XP Pgina 1 de 11

aRC-FL-Cdigo Fuente 001 (22/03/2006)

Acceso desprotegido en Windows XP


(por Furious Logic [aRC])
Advertencia

ntes de poner en prctica el presente documento y cualquier material asociado al mismo, sea ste de naturaleza tangible o intangible usted debe estar totalmente de acuerdo con todos los trminos y condiciones siguientes:

Del software Cualquier software se proporciona tal como est, sin ninguna garanta expresa ni implcita de ningn tipo. aRC no garantiza ni asume responsabilidad alguna en cuanto a la integridad o exactitud de cualquier informacin contenida en el software. Ni los miembros ni los colaboradores ni los invitados aRC se hacen responsables por el uso que se le pueda dar al software. Al examinar, copiar, ejecutar, instalar o utilizar el software, el lector est aceptando su total conformidad con todos los trminos y condiciones enunciados. Del documento Al abrir este documento, el lector acepta incondicionalmente su total y exclusiva responsabilidad legal, de acuerdo a las leyes vigentes en su pas, por el uso de las tcnicas experimentales, educativas y/o de investigacin aqu vertidas en materia de programacin especializada de computadoras. En caso de discrepar con alguno de los puntos descritos, deber eliminar inmediatamente el presente documento y todo material asociado al mismo.

Agradecimientos
A Lotus Word Pro de Lotus Corporation, incluido en la suite de oficina Lotus Millenium 9.7. A FontLab Studio 5.0 de Fontlab Ltd. por permitirnos asignar permiso completo a las fuentes true type protegidas contra copia A Acrobat 7.0 Professional de Adobe Systems Incorporated por su excelente resultado en la creacin del documento electrnico en formato PDF. A Corel Corporation por su producto Corel Paint Shop X que nos ha sido imprescindible para la generacin de las pantallas que hemos incluido en este documento.

Objetivo
Demostrar la hiptesis de que la compatibilidad que las aplicaciones recientes de 32 bits arrastran con programas de 16 bits, constituye un enorme forado en la seguridad de nuestros sistemas, porque si bien es cierto que los programas de 32 bits son restringidos, los programas de 16 bits tienen las puertas de acceso abiertas.
aDVANCED rESEARCH cOMMUNITY (aRC)

http://www.arc666.com

aRC-FL-Cdigo Fuente 001 Acceso desprotegido en Windows XP Pgina 2 de 11

Introduccin
A raz de una pregunta realizada por guan en la lista CRACKSLATINOS, hemos seleccionado el tema del acceso al BIOS por ser uno de los ms grandes problemas que tienen los programadores. Sin embargo, explicada la tcnica, es muy fcil para el programador pensar en decenas de modificaciones al cdigo ncleo que permitan que un programa de 32 bits implemente uno de 16 bits para obtener acceso a lo que hasta el momento le ha sido prohibido en windows familia NT (NT/2000/XP/2003).

Prueba 1 de acceso a memoria: Memoria BIOS


Adjuntamos el Ejemplo 001 \En Delphi\Ejem_001.dpr realizado bajo Delphi, un compilador de 32 bits. El ejemplo intenta acceder al rea de memoria en donde comnmente los fabricantes de programas BIOS ubican la fecha del mismo. Cdigo: // Ejemplo 001 por Furious Logic [aRC] program Ejem_001; uses Windows, SysUtils; // para MessageBox // para try-except

var Fecha_BIOS : String; begin try Fecha_BIOS := String(PChar(Ptr($FFFF5))); except Fecha_BIOS := 'No hay acceso a esta direccin de memoria' ; end; MessageBox( 0, @Fecha_BIOS[1], 'Fecha del BIOS', MB_ICONINFORMATION ); end. Como se puede observar, este sencillo programa intenta leer la direccin de memoria que guarda la fecha del BIOS: F000h:FFF5h, que convertida a direccin absoluta es: dir_absoluta = segmento*10h + desplazamiento = F000h*10h + FFF5h = FFFF5h Compilemos el programa Delphi utilizando compilar.bat o si lo prefiere, desde la misma interfase grfica Delphi. Si ejecutamos el programa bajo Windows 9x/ME obtendremos acceso y el resultado ser la fecha del programa BIOS de la computadora: (no todos los fabricantes utilizan esta direccin de memoria)

Prueba 1a: Resultado bajo Windows Por el contrario, al ejecutarlo bajo Windows familia NT (NT/2000/XP/2003), el acceso directo a todo el rango de memoria del BIOS est bloqueado (para programas de 32 bits) y obtenemos un resultado diferente.

aDVANCED rESEARCH cOMMUNITY (aRC)

http://www.arc666.com

aRC-FL-Cdigo Fuente 001 Acceso desprotegido en Windows XP Pgina 3 de 11

Prueba 1b: Resultado bajo Windows familia NT (NT/2000/XP/2003) Si volvemos a ver el cdigo fuente, notaremos que el bloque try-except ha capturado la excepcin EXCEPTION_ACCESS_VIOLATION que ocurre cuando se intenta leer o escribir en una direccin virtual a la que no se tiene acceso (consultar la documentacin Platform SDK).

Prueba 2 de acceso a memoria: Memoria BIOS


Abrimos una consola de comandos e intentaremos realizar la misma prueba anterior, pero esta vez manualmente con la ayuda del programa debug.exe, un programa depurador muy elemental, que se incluye en todas las versiones Windows. En la consola de comandos cargaremos debug y dentro de l escribiremos el comando d F000:FFF5 (d es la letra inicial de dump, "volcar" ). Para salir escribimos el comando q (letra inicial del comando quit, "salir") Si el sistema operativo es Windows 9x/ME el resultado es que tendremos acceso irrestricto a la memoria BIOS de la computadora correspondiente a la fecha del mismo.

Prueba 2a: Resultado bajo Windows 9x/ME Equivale al mismo resultado obtenido desde Delphi. Es decir, tenemos acceso a la direccin de memoria del BIOS en donde est grabada la fecha. No obstante, cuando realizamos el mismo procedimiento utilizando una plataforma Windows familia NT (NT/2000/XP/2003), no ocurre la excepcin EXCEPTION_ACCESS_VIOLATION, sino que obtenemos acceso irrestricto al rea de memoria en donde se guarda la fecha del BIOS.

aDVANCED rESEARCH cOMMUNITY (aRC)

http://www.arc666.com

aRC-FL-Cdigo Fuente 001 Acceso desprotegido en Windows XP Pgina 4 de 11

Prueba 2b: Resultado bajo Windows familia NT (NT/2000/XP/2003) Qu sucedi con la memoria protegida? No obtuvimos ningn aviso o advertencia alguna. No hay proteccin alguna? Es un resultado muy interesante.

Hiptesis
Sabemos que Delphi es un programa de 32 bits. Sabemos que Debug es un programa de consola de 16 bits. Al parecer, el arrastrar compatibilidad con programas de 16 bits por parte de windows, crea un hoyo, o ms bien un forado del tamao de una cantera, dentro de los sistemas operativos Windows familia NT (NT/2000/XP/2003), lo que podra servir para cualquier propsito. Entonces, es probable que los programas de consola de 16 bits tengan las puertas abiertas, en tanto que para los programas de 32 bits estas mismas puertas estn cerradas? O es que Microsoft proporciona libre acceso exclusivamente al programa Debug y/o depuradores de su mismo gnero?

Experimento
Utilizando un compilador de 16 bits tal como Turbo C++ 1.0 o cualquier otro compilador de 16 bits, vamos a intentar acceder a la misma memoria del BIOS bajo Windows familia NT (NT/2000/XP/2003). Adjuntamos el programa \En Turbo C++\Ejem_002.cpp, realizado bajo Turbo C++, un compilador de 16 bits. Cdigo: // Ejemplo 002 por Furious Logic [aRC] #include "stdio.h" typedef unsigned char byte; int main (void) { byte far *mem_fecha_bios; char fecha_bios[9]; // 8 caracteres dd/mm/aa + NULL mem_fecha_bios = (byte far *) 0xF000FFF5; for ( register byte i=0; i<8; i++ ) { fecha_bios[i] = mem_fecha_bios[i]; } fecha_bios[8] = '\0'; printf( "%s", &fecha_bios ); return 0; }
aDVANCED rESEARCH cOMMUNITY (aRC)

http://www.arc666.com

aRC-FL-Cdigo Fuente 001 Acceso desprotegido en Windows XP Pgina 5 de 11 En este caso estamos utilizando la direccin con segmento y desplazamiento unidos como F000FFF5h, copiamos 8 caracteres desde esa direccin, agregamos un caracter nulo de terminacin de cadena e imprimimos el resultado copiado.

Experimento: Resultado bajo Windows familia NT (NT/2000/XP/2003) Resulta innecesario probarlo bajo Windows 9x/ME porque bajo esa plataforma no hay restriccin alguna sea en 32 bits o en 16 bits. ejem_002.exe es un programa de consola de 16 bits y no debemos confundirlo con los programas de consola generados por Delphi, Dev-C++, HLA, Visual C++, C++Builder, entre otros. Estos ltimos crean programas de consola de 32 bits (formato ejecutable PE), en cambio ejem_002.exe es un programa de consola en formato ejecutable D.O.S. compilado con Turbo C++.

Deduccin y tesis 1
Hemos demostrado uno de los problemas que acarrea el mantener compatibilidad con programas de 16 bits: el libre acceso a lo que pareciera protegido. Utilizando nuestras deducciones como punto de partida, planteamos la idea de crear un programa de 32 bits que sea capaz de aprovechar las facilidades que se le otorgan a los programas de 16 bits. Para lograrlo necesitaremos utilizar ambos 2 compiladores, el de 16 bits y el de 32 bits. Es posible que est pensando en unir el cdigo objeto .obj del compilador de 16 bits al compilador de 32 bits, pero ello lo incorporar automticamente en el cdigo de 32 bits y nuevamente el acceso est restringido. Una solucin prctica y fcil de implementar, es crear un programa de 32 bits que capture la salida de un programa de consola de 16 bits. Es til cuando necesitamos un resultado. Utilizando Delphi uniremos nuestro programa de 16 bits con nuestro programa de 32 bits. Adjuntamos el programa en \tesis 1\project1.dpr cuyo cdigo es: //... procedure TForm1.SpeedButton1Click(Sender: TObject); var tmp : PChar; res : TResourceStream; sInfo : TStartupInfo; pInfo : TProcessInformation; h_salida : THandle; begin // Extraemos el programa de 16 bits en el directorio temporal GetMem( tmp, MAX_PATH ); GetTempPath( MAX_PATH, tmp );
aDVANCED rESEARCH cOMMUNITY (aRC)

http://www.arc666.com

aRC-FL-Cdigo Fuente 001 Acceso desprotegido en Windows XP Pgina 6 de 11 res := TResourceStream.CreateFromID( HInstance, 100, RT_RCDATA ); lstrcat( tmp, PChar('prueba.exe') ); res.SaveToFile( tmp ); res.Free; // Ejecutamos con salida hacia un temporal y borramos el programa FillChar( sInfo, SizeOf(TStartupInfo), 0 ); sInfo.cb := SizeOf( TStartupInfo ); sInfo.dwFlags := STARTF_USESHOWWINDOW; sInfo.wShowWindow := SW_HIDE; CreateProcess( nil, PChar(tmp + ' > salida'), nil, nil, false, HIGH_PRIORITY_CLASS, nil, nil, sInfo, pInfo ); WaitForSingleObject( pInfo.hProcess, INFINITE ); CloseHandle( pInfo.hThread ); CloseHandle( pInfo.hProcess ); DeleteFile( tmp ); // Leemos la salida h_salida := FileOpen( 'salida', fmOpenRead ); FileRead( h_salida, tmp^, 8 ); FileClose( h_salida ); DeleteFile( 'salida' ); Edit1.Text := Copy( tmp, 1, 8 ); FreeMem( tmp ); end; //... El programa muestra el siguiente formulario:

Y el cdigo mostrado lneas arriba corresponde a la pulsacin del botn Funcin 16 bits. Lo que hemos hecho es agregar el programa que tiene acceso completo (el de 16 bits en Turbo C++), como parte de los recursos del programa de 32 bits. Al presionar el botn, extraemos ese pequeo programa hacia la ruta de archivos temporales de windows, lo ejecutamos y en seguida lo eliminamos. El hecho particular es que estamos redirigiendo la salida por consola del programa de 16 bits hacia un archivo que arbitrariamente llamamos 'salida'. El archivo 'salida' contiene la fecha del BIOS devuelta por nuestro programa de 16 bits. Leemos el archivo 'salida', copiamos su contenido hacia el campo de texto de nuestro formulario y borramos el archivo 'salida'. Primero compile los recursos con compilar_recursos.bat y luego compile el cdigo Delphi. Como se puede apreciar, la tcnica es muy sencilla y el poder de nuestro programa se basa casi exclusivamente en el contenido del programa de 16 bits, el ncleo. En el ncleo podemos incluir interrupciones, salida/entrada hacia puertos, acceso directo a disco, etc.

Tesis 2: TASM + MASM32


El rendimiento de la aplicacin de 16 bits puede ser mejorado si programamos directamente en ensamblador. En cambio, el rendimiento de la aplicacin de 32 bits es de por s ptimo debido a su reducido cdigo. No obstante, tambin podramos migrarla hacia lenguaje ensamblador. Actualmente el programa de 16 bits ejem_002.exe pesa 8,870 bytes y el programa de 32 bits project1.exe pesa 404,480 bytes (incluyendo en su seccin recursos a ejem_002.exe).
aDVANCED rESEARCH cOMMUNITY (aRC)

http://www.arc666.com

aRC-FL-Cdigo Fuente 001 Acceso desprotegido en Windows XP Pgina 7 de 11 TASM: El ncleo en 16 bits Empecemos por reducir el tamao del programa de 16 bits utilizando Turbo Assembler 5.0 (TASM) en lugar de Turbo C++. Adjuntamos el programa en \tesis 2\TASM\fec_bios.asm cuyo cdigo fuente es: .model tiny .stack 100h .data fecha db .code .8086 inicio: mov mov mov and call call mov int

"00/00/00$"

ax,@data ds, ax es, ax sp, not 3 obtener_fecha_bios mostrar ax, 4C00h 21h

obtener_fecha_bios proc push es mov ax, 0F000h mov es, ax mov bp, 0FFF5h xor bx, bx sig: mov al, es:[bp] mov fecha[bx], al inc bp inc bx cmp bx, 8 jb sig pop es ret obtener_fecha_bios endp mostrar proc mov mov int ret mostrar endp end dx, offset fecha ah, 9h 21h

inicio

Compilamos con compilar.bat o si preferimos hacerlo manualmente utilizamos los comandos: tasm fec_bios.asm e tlink fec_bios.obj e No debemos confundir la pareja tasm/tlink con la pareja tasm32/tlink32, ya que estos ltimos son para compilar y obtener programas en 32 bits; en tanto que los primeros son para compilar y generar un resultado ejecutable de 16 bits. Al compilar habremos obtenido el archivo ejecutable fec_bios.exe cuyo peso es de 579 Bytes. Es decir, hemos reducido el programa original en Turbo C++ ejem_002.exe de 8,870 Bytes a tan solo un 6.5% de su tamao original utilizando TASM. El lector puede probar reemplazar Turbo C++ por cualquier otro compilador o intrprete de 16 bits que conozca bien para desarrollar su programa ncleo. En el caso particular de que utilice Turbo Pascal, asegrese de que sea la versin 7.1 para evitar un bug que la versiones anteriores presentan debido a la elevada velocidad de los microprocesadores actuales.
aDVANCED rESEARCH cOMMUNITY (aRC)

http://www.arc666.com

aRC-FL-Cdigo Fuente 001 Acceso desprotegido en Windows XP Pgina 8 de 11 MASM32: La interfase El programa interfase creado en Delphi para la tesis 1 ser mejorado en cuanto a tamao, utilizando MASM32 8.2 SP2a en su lugar. Adjuntamos el programa en el directorio \tesis 2\MASM32\ que para beneficio del lector est realizado bajo RadAsm 2.2.07. Cdigo fuente central: .elseif (uMsg==WM_COMMAND) .if (wParam==BTN_FUNCION) ; Extraemos el programa de 16 bits en el directorio temporal invoke FindResource,hInstance,200,RT_RCDATA push EAX invoke LoadResource,hInstance,EAX invoke LockResource,EAX mov res,EAX invoke GetTempPath,MAX_PATH,addr tmp invoke lstrcat,addr tmp,addr fecha_bios invoke _lcreat,addr tmp,0 mov h_archivo,EAX pop EAX invoke SizeofResource,hInstance,EAX invoke _lwrite,h_archivo,res,EAX invoke _lclose,h_archivo ; Ejecutamos con salida hacia un temporal y borramos el programa invoke RtlZeroMemory,addr sInfo,sizeof STARTUPINFO mov sInfo.cb,sizeof STARTUPINFO mov sInfo.dwFlags,STARTF_USESHOWWINDOW mov sInfo.wShowWindow,SW_HIDE invoke lstrcpy,addr aux,addr tmp invoke lstrcat,addr aux,addr canalizar invoke CreateProcess,NULL,addr aux,NULL,NULL,FALSE, HIGH_PRIORITY_CLASS,NULL,NULL,addr sInfo,addr pInfo invoke WaitForSingleObject,pInfo.hProcess,INFINITE invoke CloseHandle,pInfo.hThread invoke CloseHandle,pInfo.hProcess invoke DeleteFile,addr tmp ; Leemos la salida invoke RtlZeroMemory,addr tmp,sizeof STARTUPINFO invoke _lopen,addr salida,OF_READ mov h_salida,EAX invoke _lread,h_salida,addr tmp,8 invoke _lclose,h_salida invoke DeleteFile,addr salida invoke SendDlgItemMessage,hWin,EDT_FECHA,WM_SETTEXT,0, addr tmp .endif Con esta traduccin del cdigo de Delphi hacia MASM32 hemos obtenido un archivo ejecutable interfase.exe de 6,144 Bytes (incluyendo el ncleo de 16 bits dentro de su seccin recursos) que al compararlo con project1.exe de 404,480 Bytes significa que hemos reducido su tamao al 1.5%

aDVANCED rESEARCH cOMMUNITY (aRC)

http://www.arc666.com

aRC-FL-Cdigo Fuente 001 Acceso desprotegido en Windows XP Pgina 9 de 11

Tesis final: Mejorar el ncleo de 16 bits utilizando Debug


La tesis final que planteamos nos permitir reducir los 579 Bytes del programa ncleo de 16 bits a tan solo 49 Bytes de cdigo. Al mismo tiempo, modificaremos ligeramente el cdigo en MASM32 para evitar utilizar la seccin recursos. Debug: El ncleo de 16 bits Si migramos nuestro cdigo ncleo en TASM hacia Debug, obtendremos un reducido cdigo de tan solo 49 bytes. Adjuntamos el programa como \tesis final\nucleo.com escrito ntegramente con Debug. La forma de codificarlo se muestra aqu:

El comando a proviene de assembly ("ensamblar") y se utiliza para ensamblar directamente. El comando n de name ("nombre") y se emplea para asignarle un nombre al archivo. El comando r proviene de registers ("registros") y se utiliza para ver/modificar los registros. El comando w proviene de write ("escribir") y se utiliza para grabar nuestros cambios. El registro CX deber contener la cantidad de bytes a escribir en el archivo especificado por el comando n. Cuando escribimos en el Debug estamos hacindolo directamente en el archivo. Es decir, no hay nada que compilar. Escribimos los mnemnicos y estos sern grabados en su formato hexadecimal como parte del archivo ejecutable que deber ser .com obligatoriamente. En trminos de porcentajes, el ncleo anterior hecho en TASM ha sido reducido de 579 Bytes a tan solo 49 Bytes lo que gracias al programa Debug se interpreta como una reduccin a un 8.5% de su tamao previo.
aDVANCED rESEARCH cOMMUNITY (aRC)

http://www.arc666.com

aRC-FL-Cdigo Fuente 001 Acceso desprotegido en Windows XP Pgina 10 de 11 MASM32: Mejorar la interfase Con MASM32 ya tenemos un cdigo bastante reducido, pero intentaremos reducirlo un poco ms aplicando una modificin ligera para evitar la necesidad de agregar algo a la seccin recursos. Adjuntamos el programa en el directorio \tesis final\MASM32\interfase.asm cuyo contenido principal es: //... ; Creamos el archivo a partir de una variable invoke GetTempPath,MAX_PATH,addr tmp invoke lstrcat,addr tmp,addr nucleo invoke _lcreat,addr tmp,0 mov h_archivo,EAX invoke _lwrite,h_archivo,addr programa,49 invoke _lclose,h_archivo ; Ejecutamos con salida hacia un temporal y borramos el programa invoke RtlZeroMemory,addr sInfo,sizeof STARTUPINFO mov sInfo.cb,sizeof STARTUPINFO mov sInfo.dwFlags,STARTF_USESHOWWINDOW mov sInfo.wShowWindow,SW_HIDE invoke lstrcpy,addr aux,addr tmp invoke lstrcat,addr aux,addr canalizar invoke CreateProcess,NULL,addr aux,NULL,NULL,FALSE, HIGH_PRIORITY_CLASS,NULL,NULL,addr sInfo,addr pInfo invoke WaitForSingleObject,pInfo.hProcess,INFINITE invoke CloseHandle,pInfo.hThread invoke CloseHandle,pInfo.hProcess invoke DeleteFile,addr tmp ; Leemos la salida invoke RtlZeroMemory,addr tmp,sizeof STARTUPINFO invoke _lopen,addr salida,OF_READ mov h_salida,EAX invoke _lread,h_salida,addr tmp,8 invoke _lclose,h_salida invoke DeleteFile,addr salida invoke SendDlgItemMessage,hWin,EDT_FECHA,WM_SETTEXT,0, addr tmp //... Lo que hemos hecho es almacenar los 49 Bytes que componen el programa nucleo.com en una variable. Es esta variable la que grabamos directamente en un archivo. Compilamos y obtenermos un archivo ejecutable de 5,120 Bytes. Es decir 1 KiB, 1,024 Bytes, menos que el programa anterior de 6,144 Bytes.

Conclusiones
Windows XP est totalmente desprotegido, sealndonos una puerta que podemos utilizar para reingresar al mundo del acceso irrestricto a direcciones de memoria, acceso directo al hardware, ejecucin de interrupciones de software, etc. Al mismo tiempo hemos aprendido como probar y optimizar la implementacin de una tcnica determinada. Tomamos como punto de partida un compilador de alto nivel para probar una tcnica sin tener que preocuparnos demasiado por la sintaxis. Si la tcnica funciona, migramos el cdigo hacia un compilador de nivel ms bajo que nos permita mejorar su rendimiento (tamao del ejecutable y velocidad de respuesta). Esta tcnica robustece nuestros conocimientos en todos los compiladores involucrados. Finalmente, hemos aprendido a integrar el contenido de un programa como parte de una variable para ahorrar algunos bytes de tamao que se agregaran si utilizamos la seccin recursos. La desventaja de esta tcnica se encuentra en que los programas de 16 bits no son tan veloces como los programas de 32 bits. Por lo tanto, si lo que buscamos es rendimiento para un concurso de programacin optimizada, aconsejamos crear un driver en lenguaje ensamblador, que por otra parte requiere ms lneas de cdigo y mayores conocimientos que la solucin rpida que hemos presentado.
aDVANCED rESEARCH cOMMUNITY (aRC)

http://www.arc666.com

aRC-FL-Cdigo Fuente 001 Acceso desprotegido en Windows XP Pgina 11 de 11

Derechos de autor
El presente documento puede ser libremente distribuido nicamente con fines educativos, experimentales y/o de investigacin, siempre que se mantenga inalterado en su contenido y se reconozca la autora del mismo a Furious Logic [aRC]. Los nombres y/o marcas de productos utilizados en este documento son mencionados nicamente con fines de identificacin y son propiedad de sus respectivos creadores. Las preguntas, consultas, sugerencias y correcciones son todas bienvenidas aunque las respuestas puedan tardar unos das en llegarles. El autor puede ser contactado en: Email: furiouslogic@eml.cc Furious Logic miembro de

Web aRC: http://www.arc666.com IRC aRC: Dalnet #aRC666 Lista aRC: arc3000-subscribe@googlegroups.com KopyLight (k) 2003,2006 LIMA - PERU "Porque buscamos la libertad que slo en el conocimiento podemos encontrar"

aDVANCED rESEARCH cOMMUNITY (aRC)

http://www.arc666.com

Você também pode gostar