Saturday, July 2, 2011

Excel y DDE (Dynamic Data Exchange)

Hace tiempo me encontré con un problema en el que era necesario desactivar de manera automática la opción en Excel "Omitir otras aplicaciones que usen Intercambio dinámico de datos (DDE)".

Analizando un poco como es que se almacenaba esta opción en Excel encontré que se guarda en la llave de registro HKCU\Software\Microsoft\Office\12.0\Excel\Options -> Options -> REG_DWORD Datos, la cual tiene los siguientes valores para esta opción en específico.







Habilitado Omitir DDE
0x00000017
00010111
Deshabilitado Omitir DDE
0x00000057
01010111
Lo único que cambia es el séptimo bit, por lo que para hacerlo de forma automática habrá que verificar ese bit, si la opción esta habilitada (el bit esta en cero) habrá que deshabilitarla (poner el bit en uno).

El código en NSIS que realiza lo anterior queda de la siguiente forma:

CRCCheck On
!include "${NSISDIR}\Contrib\Modern UI\System.nsh"

Name "Excel_DDE"
OutFile "Excel_DDE.exe"
Set Compressor "bzip2"
SilentInstall silent

RequestExecutionLever user

Section "install"
ReadRegDWORD $0 HKCU "Software\Microsoft\Office\12.0\Excel\Options" "Options"
#0x40 = 01000000
IntOp $1 $0 & 0x40
IntCmp $1 0 igual
goto done
igual:
IntOp $1 $0 | ox40
WriteRegDWORD HKCU "Software\Microsoft\Office\12.0\Excel\Options" "Options" $1
done:
SectionEnd

¿por qué NSIS? es la forma más rápida que encuentro para generar un archivo EXE que modifique llaves del registro.

ProcessMonitor
A mi punto de vista una muy buena herramienta que ayuda a ver los archivos, llaves de registro, opciones en línea de comandos, etc. que ocupa un programa. (Fue lo que ocupé para encontrar la llave de registro)
http://technet.microsoft.com/en-us/sysinternals/bb896645

NSIS
http://nsis.sourceforge.net/Main_Page

Tuesday, May 25, 2010

Ocultar correo con JavaScript

He aquí mi YAJSCHM (Yet Another JavaScript Code for Hide Mail)

<script language="javascript">
<!--
part1 = "4dfCd4O57dfR89dfR0df9E0fdOd";
part2 = "Da6d8Ofq8739MIpN89IsOlo.2COi8urMd34sfv98";
part3 = "correo";
part4 = "aMd2dfAg53gI7Lfd83TdsOf76";
document.write('<a href="'+removeStuffs(part4)+'&#58;' + removeStuffs(part1) + '&#64;' + removeStuffs(part2) + '">');
document.write(part3 + '</a>');

function removeStuffs(string){
pattern = /[a-z\d]/g;
string = string.replace(pattern,"");
return string.toLowerCase();
}
// -->
</script>

Los bonitos colores los tenemos gracias a Online syntax highlighting

Saturday, May 15, 2010

Usuarios y contraseñas en las aplicaciones

Es común que las aplicaciones necesiten conectarse a otros sistemas, llámense bases de datos, web services, etc., normalmente estos sistemas requieren un nombre de usuario y contraseña para poder ocuparlos.
Cuando se quiere automatizar una tarea que necesita conectarse a éste tipo de sistemas, surge una pregunta ¿cómo almacenar el usuario y la contraseña, dentro de la aplicación que funcionará de forma autónoma?
La respuesta lógica es: no en código duro, entonces, esta información debe de estar codificada de alguna forma.

Mi mejor aproximación para resolver esto es la siguiente:

Tener el usuario y la contraseña en un archivo cifrado. Hasta aquí no hay problema, el problema empieza con la pregunta ¿como almaceno la contraseña que descifra el archivo de usuarios y contraseñas? Esto puede convertirse en un problema recursivo, necesito "algo" para asegurar lo que asegura lo que necesito asegurar (¿le entendiste? yo tampoco =P)
Recuerda la típica escena de la película en donde se disponen a abrir la bóveda ultrasegura (en particular recuerdo Terminator 2, cuando van por el brazo del primer terminator [T-800]), para esto antes tuvieron que entrar al edificio, pasar por los diversos guardias, bla bla (algo que de alguna forma deberías considerar en tu aplicación). ¿Que hacen para abrir la bóveda? tienen dos llaves y las cerraduras están en los extremos, de forma que se necesitan dos personas para ponerse de acuerdo e introducir la llave en la cerradura y girarla al mismo tiempo, de otra forma la bóveda no se abrirá.

Hagamos una analogía con lo anterior, el brazo del T-800 (el usuario y la contraseña) esta adentro de la bóveda (el archivo cifrado), ahora necesito dos llaves para poder abrirla.
Primera llave (llave de la cerradura derecha). Tener una función que genere la contraseña con la que se descifra el archivo, esta función debe recibir un parámetro, que es el que ocupara para generar la contraseña. Se me ocurre que esta función puede ocupar una función hash, o algún pseudo generador de números aleatorios, algo que realmente pueda producir una salida totalmente distinta para dos mensajes en los que lo único que cambia es un bit.
char * foo(char *bar);
Segunda llave (llave de la cerradura izquierda). Tener en un archivo el parámetro que se le mandara a la función foo. ¡Y por Mike!, que lo que contenga el archivo sea un valor aleatorio.

De manera que para abrir el archivo cifrado:
1. Se ocupa la llave de la izquierda (el archivo con los parámetros)
2. Se ocupa la llave de la derecha (se le pasan los parámetros a la función foo)
3. ¡Ábrete sésamo!, se desencripta el archivo.

¿Que obtenemos con esto?
- La persona que tenga el código de la aplicación no puede deducir cuál es la contraseña con la que se descifra el archivo.
- Alguien que tenga el archivo de los parámetros, necesita saber que hace la función foo, para poder generar la contraseña.

Para que esto sea completamente análogo a la escena de la película, hace falta algo que aún no tengo solucionado; porque una persona con las dos llaves no sirve, ya que las cerraduras están lo suficientemente separadas para que se necesiten dos personas. ¿Alguna idea? tengo algunas, pero eso ... es otra historia xD.

Saturday, May 9, 2009

robots.txt

En la 2600 de la primavera 2009, aparece un artículo llamado "robots.txt Mining Script for the Lazy" y aunque hay muchas cosas que se esconden en estos robots.txt (en los CMS generalmente la pantalla de login), existen cosas que no deberías de ver, ¿cómo cuáles? preguntále a Irongeek.

El uso de los robots.txt, es un ejemplo de sigue existiendo gente que cree que puede confiar en la gente. ¡Bien por ellos! =P

Tuesday, April 7, 2009

Code Page Detection

Recientemente me encontré con un problema en el que tenía que identificar la codificación de caracteres de un archivo de texto, y descubrí una muy buena herramienta que se llama cpdetector (http://cpdetector.sourceforge.net/), la cuál utiliza varios algoritmos para detectar la codificación de caracteres. Uno de los algoritmos que utiliza es el de Mozilla, una buena referencia de este algoritmo se puede encontrar aquí --> http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html

Sunday, December 21, 2008

Password Masking & JVM

Hoy le toca el turno a Java, pero antes voy a hacer un paréntesis
(
Hace algún tiempo si me preguntabas ¿cuál es el mejor lenguaje de programación? la respuesta que hubieras obtenido habría sido C. Esto sucedió mientras la gente que me rodeaba decía que el mejor lenguaje era Java y yo necio, decía y afirmaba que el mejor era C; y te has de estar preguntando ¿bueno, ahora piensas que el mejor es Java? Pues no, un día alguien o algo (realmente no sé que fue) me abrió los ojos, ¡el mejor lenguaje de programación es Ensamblador! XD jajaja. Por su puesto que no pienso así, lo que pasó cuando me abrieron los ojos fue que me dí cuenta de que realmente no puedo decir tal lenguaje es mejor que otro, simplemente unos te permiten hacer más fácil determinada tarea, o incluso aunque pueden hacer las mismas cosas que otros su ámbito es diferente.
)

Password Masking en la línea de comado.
http://java.sun.com/developer/technicalArticles/Security/pwordmask/ndo


Byte Code Engineering Library (BCEL)
http://jakarta.apache.org/bcel/manual.html

Thursday, November 13, 2008

Doug Lea's Malloc

Alguna vez te preguntaste ¿cómo es que funciona la llamada a malloc?. Dejame decirte que te haces muy buenas preguntas y las respuestas son MUY interesantes. =D

http://g.oswego.edu/dl/html/malloc.html
ftp://g.oswego.edu/pub/misc/malloc.c


#include <stdio.h>
#include
<stdlib.h>
#include
<string.h>

int main (int argc, char *argv[]){
char *p;
int size,malloc_size;

if(argc != 2){
printf(
"Uso: %s size\n",argv[0]);
exit(
-1);
}

size
= atoi(argv[1]);
printf(
"--------[ Probando para size: %d bytes\n",size);
p
=(char *)malloc(size);
memcpy(
&malloc_size,p-4,4);
malloc_size
&=~7; //Quitamos las banderas
printf("--------[ Malloc size: %d\n",malloc_size);
free(p);
return 0;
}


Obviamente, que al código le hace falta quitarle los bytes que utilizan los boundary tags.