
Cerrado por vacaciones
Escrito en Uncategorized
Knuth Comments on Code (1996)
BYTE: Judging from the number of bugs that we see in commercial software, vendors seem to prioritize features over error-free code. Will new tools or new programming techniques result in more stable software?
Knuth: There is no royal road, and you can’t make any complex program totally failsafe. You can test a program for a year and then someone or something will create a condition that nobody ever anticipated and then very subtle errors become very visible. The layers that you place on a program to make it failsafe can themselves fail. I certainly don’t say that we should avoid using techniques like redundancy to increase the stability of critical programs, or that we should write code and not worry about the consequences. Computer programs are the most complicated things that humans have ever created. That’s why I say this idea of exposition is the best way of coping with the complexity. When I’m writing a program, I approach it as if I were writing a short story. It doesn’t take me longer, because the time I spend on organization is more than made up for in time saved debugging.
Escrito en Uncategorized | Etiquetas:IT jungle, programming
NT 4.0 and the lastest version of WinDbg
I would say nobody on earth needs to connect NT 4.0 to the lastest version of WinDbg Kernel Debugger. In fact Microsoft Symbols Server don’t provide NT symbols… anyway and just for save time for those in my situation there is the way I make it work:
- Start your NT system
- It will show something like screenshot 1 (if kernel debugger config is ok)
- Wait until changes to screenshot 2 or similar
- Now try to connect the KD or WinDbg, not before or you would get an ugly message like:
Microsoft (R) Windows Debugger Version 6.7.0005.1
Copyright (c) Microsoft Corporation. All rights reserved.Opened \\.\pipe\com_1
Waiting to reconnect…
Verbose mode ON.
Connected to Windows NT 4 1381 x86 compatible target, ptr64 FALSE
Kernel Debugger connection established.
Symbol search path is: B:\out
Executable search path is: B:\out
Loading symbols for 80100000 ntoskrnl.exe -> ntoskrnl.exe
*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntoskrnl.exe -
ModLoad: 80100000 801db000 ntoskrnl.exe
CS descriptor lookup failed
Windows NT 4 Kernel Version 1381 UP Free x86 compatible
Kernel base = 0×80100000 PsLoadedModuleList = 0×80150b70
System Uptime: not available
Loaded dbghelp extension DLL
Loaded ext extension DLL
Loaded kext extension DLL
Loaded kdextx86 extension DLL
Opened log file ‘c:\log.txt’
Force unload of ntoskrnl.exe
ModLoad: 80100000 801db000 ntoskrnl.exe
Unable to get program counter
WaitForEvent failed
Unable to get program counter
0008:497a 0010 add byte ptr [bx+si],dl
Escrito en Uncategorized | Etiquetas:driver development, NT4, windows
Herramientas de red imprescindibles (o no)
Yo diría que todo programador que desarrolle aplicaciones distribuidas tarde o temprano necesita estas herramientas. Más aún si se mueve a bajo nivel o si implementa un protocolo de aplicación complejo. En realidad en el momento que abras un socket seguramente utilices alguna de ellas.
Si alguien conoce algo mejor… que lo comparta conmigo. Ahí va la lista de mis must:
WIRESHARK / ETHEREAL / tcpdump
El mejor analizador de tráfico que existe [hasta donde yo sé]. Examinar cabeceras y datos de paquetes y aplicar filtros a la captura (incluso con wildcards) es muy sencillo con Wireshark.

La delicia de todos aquellos que implemente un firewall ya que permite establecer/escuchar conexiones TCP/UDP a las IPs y puertos que quieras.
Pero realmente, es MUCHO más que eso cuando se combina con la shell. En un periquete puedes tener funcionalidas variadas (véase http://crysol.org/node/28) :
Chat para dos
Transferencia de ficheros
Servidor de echo
Servidor de daytime
Telnet inverso
Cliente de IRC
Cliente de correo SMTP
Cliente y un servidor HTTP rudimentarios
Streaming de audio
Streaming de video
Redirección de una conexión a otro puerto u otra máquina
Ratón remoto
Ver “La Guerra de las Galaxias”
…Los niños malos también se dedican a invocarlo desde shellcode por razones obvias.
Aquí un ejemplillo:
user@hostname:~$ nc www.google.es 80
GET /
<HTML><HEAD><meta http-equiv=”content-type” content=”text/html;charset=utf-8″>
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF=”http://www.google.es/”>here</A>.
</BODY></HTML>
Una vieja gloria, por decir algo, que permitía acceder en modo línea de comandos a máquinas remotas. A parte de estar totalmente anticuado y ser completamente inseguro el cliente es aún MUY ÚTIL tanto para mandar emails anónimos
como para comprobar si un puerto TCP está a la escucha (eso sí, en ausencia de firewalls) o si llegamos. Por ejemplo:
user@hostname:~$ telnet www.google.es 80
Trying 66.102.9.147…
Connected to www.l.google.com.
Escape character is ‘^
Lo mejor que he visto para escanear puertos TCP y UDP, averiguar qué SO usa la máquina remota (hasta cierto punto) y qué servicios tiene activos. A los niños malos también les gusta porque les permite mucha flexibilidad y variedad en los escaneos para ser silenciosos y averiguar qué servicios pueden reventar.
Para hacer un escaneo TCP basado en SYNs del handshake de TCP basta con poner algo así:
user@hostname:~$ nmap -sS -O 192.168.1.1
Starting Nmap 4.20 ( http://insecure.org ) at 2008-07-23 19:59 CEST
Interesting ports on 192.168.1.1:
Not shown: 1694 closed ports
PORT STATE SERVICE
22/tcp open ssh
23/tcp open telnet
80/tcp open http
MAC Address: 00:18:02:DF:DC:5B (Alpha Networks)
Device type: general purpose
Running: Linux 2.6.X
OS details: Linux 2.6.14 - 2.6.17
Uptime: 0.523 days (since Wed Jul 23 07:26:56 2008)
Network Distance: 1 hopNmap finished: 1 IP address (1 host up) scanned in 1.922 seconds
Probablemente menos conocido y bastante más inútil en el día a día, permite inyectar paquetes (raw IP, ICMP, TCP o UDP) a medida en la red. A los niños malos y a los que los persiguen parece que les gusta…
Se pueden configurar los paquetes bien desde los parámetros del comando o desde fichero, lo cual, tiene su gracia para reproducir situaciones. Desde luego para el desarrollo de firewalls lo considero una joya. (-:
Escrito en Uncategorized | Etiquetas:network, tools
El encriptado WPA con Wireless en Ubuntu Edgy - Make it easy!
Una vez en que puse en funcionamiento la tarjeta Wireless del Inspiron 640m sólo restaba configurar el acceso a mi red inalámbrica. Debido a la in-seguridad del encriptado WEP quería usar WPA-PSK.
Para configurar WPA-PSK en otras ocasiones había editado directamente los archivos de configuración del wpa_supplicant (programa que implementa los algoritmos de cifrado WPA). Pero para existe una forma de hacerlo mucho más sencilla, a través del network-manager (applet nm-applet en GNOME) que utiliza wpa_supplicant “por debajo”.
Pasos a seguir GNOME:
Instalar el paquete network-manager-gnome con el comando:
- apt-get install network-manager-gnome
Una vez instalado reiniciaremos la sesión de GNOME y debería aparecernos en el panel superior; si pinchamos sobre él nos mostrará las redes inalámbricas disponibles. Basta con elegir la nuestra e introducir la contraseña.

P.D.: el gnome-network-manager tenía un bug por el cual no funcionaba de buenas a primeras y me salía el siguiente aviso: “The NetworkManager applet could not find some required resources. It cannot continue“. Para arreglarlo simplemente ejecutad:
- sudo gtk-update-icon-cache -f /usr/share/icons/hicolor
Escrito en Uncategorized | Etiquetas:linux
Intel PRO/Wireless 3945 y Edgy Eft
La tarjeta wireless de mi Dell Inspiron 640m había funcionado sin necesidad de configurar nada en Ubuntu Dapper, pero ahora he cambiado a Ubuntu Edgy Eft y no funcionaba.
Aunque hacía un lsmod y veía el módulo ipw3954 no aparecía ninguna interfaz wireless tras hacer un ifconfig. Sólo tenía la local (lo) y eth0 para la tarjeta de red (wired).
La solución ha sido muy sencilla, instalar el paquete linux-restricted-modules-generic con:
- sudo apt-get install linux-restricted-modules-generic
Tras instalarlo y reiniciar la Edgy, mi NetworkManager de GNOME ya detectaba las redes inalámbricas. Al hacer otra vez ifconfig, he visto que aparece la interfaz eth1 como wireless, que era lo que hacía Dapper desde que se instalaba.
Por lo visto ipw3945 ejecuta /sbin/ipw3945d- $(uname -r) y si, como es mi caso, tienes el kernel 2.6.17-10-generic necesitas instalar el paquete linux-restricted-modules para tener ese binario en /sbin. Según leí en otro sitio también podría funcionar así:
- sudo ln -s /sbin/ipw3945d-2.6.17-10-386 /sbin/ipw3945d-2.6.17-10-generic
Enlaces que he usado:
1. https://launchpad.net/distros/ubuntu/+source/linux-source-2.6.17/+bug/62452
Escrito en Uncategorized | Etiquetas:linux
Zamora - Spain
Lago de Sanabria
Altos de Bubela
Cerro de San Juan
Escrito en Uncategorized | Etiquetas:photography, Spain
Cómo hacer fotos panorámicas
La idea es muy sencilla; tomar varias fotos haciendo un barrido del panorama y luego juntándolas. Pero para hacerlo bien hay que tener claros algunos puntos:
- Las fotos deben estar solapadas; me explico, el borde derecho de la primera debe ser igual al borde izquierdo de la que le sigue (si barremos el panorama de izquierda a derecha). Esto es necesario para luego “montar” una foto sobre otra como su fuera un puzle.
-
-
- El grado de solapamiento, es decir, la anchura de la “zona compartida” entre fotos ha de ser razonable: hay que llegar a un compromiso entre que las piezas encajen y que cada una aporte nueva información a la panorámica. No puede ser muy ancha ya que tendríamos que hacer muchas fotos para barrer el panorama y esto se traduciría en posibles cambios en la escena y mucho tiempo de proceso en el ordenador. Tampoco debemos ir ajustar a una columna de pixels ya que luego nos constará juntarlas.
Nuestras 3 fotos están bien solpadas, aunque no alineadas: si es posible es mejor usar un trípode para el barrido.
- Deben tomarse las fotos antes de que la escena cambie; me explico, imaginad que estamos en un día con fuerte viento y el cielo está nublado. Tomamos lentamente tres fotos consecutivas y cuando llegamos al ordenador nos damos cuenta de que aunque el perfil del terreno coincide en las tres fotos, las nubes no porque el viento las empujó. ¿Solución? o eres un Velázquez del GIMP o el Photoshop o ya no hay panorámica. Por eso hay que hacer las fotos relativamente rápido. Otro ejemplo más realista: sabemos que los amaneceres y atardeceres proporcionan resultados más espectaculares y sacamos nuestras fotos con demasiada calma, ¿qué pasará? que unas fotos saldrán con un cielo más claro y otras con un cielo más oscuro. En este caso sí que encajarían las piezas del puzle pero el resultado no sería el óptimo.
Nuestra primera foto es demasiado clara, la panorámica no quedara bien del todo ¡¡debemos buscar la continuidad de la escena!!
- Y ahora sólo queda juntarlas con algún software especializado: como Hugin (SL) o Autostich. Si usas Windows y optas por Autostich échale un vistazo a http://www.20minutos.es/noticia/142650/0/fotos/panoramicas/posteres/ . Ahora el software utilizará algoritmos para reconocer las zonas compartidas y nos juntará las fotos:
DEFECTOS:
- El cielo en la primera foto constrasta mucho con las otras dos. Si las tomamos manualmente que el fotómetro nos indique la misma luz en las tres.
- Al tomar las instantáneas a mano alzada se crean estos pliegues que tendremos que recortar. Esto nos hacer perder información en los bordes de abajo, pues la anchura de la panorámica final nos viene impuesta por el borde de arriba porque es el más estrecho en este caso. Estos recortes se minimizan usando trípode.
- Recortamos la imagen final con nuestro SW de edición de imágenes preferido y a presumir de foto.
Para ver unos resultados más trabajados mira esta entrada.
Escrito en Uncategorized | Etiquetas:photography
Sobre las claves ocultas en el registro de Windows
Los foros de juanquers a veces son muy patéticos y por pura ignorancia algunos de sus miembros no llaman a las cosas por su verdadero nombre. Y es que veces explican con todo lujo de detalles interpretaciones totalmente erróneas y usan ideas de hace más de una década como propias. Por favor (-:
La posibilidad de insertar claves invisibles para la API Win32 no es un bug. Y hacerlo es tan trivial que jactarse de ocultarlas sólo demuestra que o bien tienes 16 años o bien eres idiota o quién sabe si no son ambas cosas a la vez. Hace más de 15 años (circa 1993) vio la luz el primer Windows de la familia NT ( http://en.wikipedia.org/wiki/Windows_NT_3.1) y desde entonces ha sido posible insertar claves ocultas. Porque no es un bug; está diseñado así (*). Las cadenas de Win32 API son ANSI (8-bit) o cadenas anchas de (16-bit) pero terminadas en NULL y los nombres en la API nativa son cadenas Unicode (encoding de 16-bits) de longitud controlada.
Esta es la estructura para Unicode que se utiliza en la ejecutiva de Windows, en los subsistemas y en los drivers. Simplemente contiene la longitud actual, la máxima longitud del buffer y el buffer en sí. El final de la cadena lo marca Length, no ningún NULL de terminación:
typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
No seré yo quien defienda la API de acceso al registro ni mucho menos sus kilométricos nombres en notación húngara. Ni me gusta la posibilidad de las claves no accesibles desde la API facilitada (wtf) porque la única utilidad que se me ocurre es la de una falsa protección. Y a parte de que todas las ramas sensibles sí son accesibles para una protección real ya existen las ACLs.
¿ Pero qué son las claves ocultas ?
Para cualquier programador será fácil de entender. Con la API nativa puedes crear una clave cuyo nombre en Unicode contenga NULLs, por ejemplo: L”\\HKLM\\foo(null)bar\\foo(null)bar” contiene 2 NULL. La Win32 API no puede abrir la clave simplemente porque no puede expresar el nombre de esa clave y si intentara abrirla lo máximo que abriría sería la rama “\\HKLM\\foo”.
Por lo tanto, aunque la API Win32 dependa de la API Nativa, no ofrece toda la funcionalidad de ésta. En la siguiente tabla me apunto qué funciones nativas subsumen las de la API de Windows.
| Algunas funciones Nativas | Correspondecnia Win32 APIs | Privilegios |
| NtCreateKey | RegCreateKey , RegCreateKeyEx | N/A |
| NtOpenKey | RegOpenKey , RegOpenKeyEx | N/A |
| NtDeleteKey | RegDeleteKey | N/A |
| NtFlushKey | RegFlushKey | N/A |
| NtSetInformationKey | None | N/A |
| NtQueryKey | RegQueryInfoKey | N/A |
| NtEnumerateKey | RegEnumerateKey , RegEnumerateKeyEx | N/A |
| NtNotifyChangeKey | RegNotifyChangeKeyValue | N/A |
| NtDeleteValueKey | RegDeleteValue | N/A |
| NtSetValueKey | RegSetValue , RegSetValueEx | N/A |
| NtQueryValueKey | RegQueryValue , RegQueryValueEx | N/A |
| NtEnumerateValueKey | RegEnumValue | N/A |
| NtQueryMultipleValueKey | RegQueryMultipleValues | N/A |
| NtEnumerateKey | RegEnumKey , RegEnumKeyEx | N/A |
| * NtSaveKey | RegSaveKey | SeBackupPrivilege |
| * NtRestoreKey | RegRestoreKey | SeRestorePrivilege |
| * NtLoadKey | RegLoadKey | SeRestorePrivilege |
| * NtLoadKey2 | None | SeRestorePrivilege |
| * NtReplaceKey | RegReplaceKey | SeRestorePrivilege |
| * NtUnloadKey | RegUnloadKey | SeRestorePrivilege |
| NtClose | CloseHandle | N/A |
| NtCreateFile | CreateFile | N/A |
| NtOpenThread | OpenThread | N/A |
| NtOpenProcessToken | None | SeCreateTokenPrivilege |
| NtAdjustPrivilegesToken | AdjustTokenPrivileges | N/A |
| NtQueryInformationToken | GetTokenInformation | N/A |
Escrito en Uncategorized | Etiquetas:registry, windows
Tabla de funciones seguras en modo kernel
Escrito en Uncategorized | Etiquetas:driver development, tables