
 Definiendo un Modo Externo
============================

Para definir un modo de crackeo externo necesitas crear una seccion
en tu archivo de configuracion llamada [List.External:MODO], donde MODO
es cualquier identificador que quieras asignarle al modo. La seccion debera
contener algunas funciones programadas en un sublenguaje de C. John las
compilara y las usara si activas este modo via linea de comandos.

 External Functions
--------------------

Las siguientes funciones son usadas actualmente por John:

init()          llamada al comienzo, debera inicializar todas las variables
                globales
filter()        llamada por cada palabra probada, puede filtrar algunas
                palabras
generate()      llamada para generar palabras, cuando no se usa ningun otro
                modo de cracking
restore()       llamada cuando se restablece una sesion interrumpida

Todas son del tipo 'void', sin argumentos, y deben usar la variable global
'word'(predefinida como 'int word[]'), excepto para init() que es llamada
antes de que se inicialice 'word'. La variable 'word' contiene la palabra
que va a ser probada en ese momento, en formato ASCIIZ.

Las funciones, si son definidas, deben hacer lo siguiente con 'word':

* filter() puede modificar la palabra, o convertirla en cero ('word[0]') para
rechazarla

* generate() no puede asumir ningun valor particular para 'word' cuando es
llamada, pero debe establecer la siguiente palabra que sera probada,
o en cero ('word[0]') cuando el proceso de cracking esta completado (esto
hara que termine el programa)

* restore() debera establecer las variables globales para continuar desde
'word'.

Puedes usar un modo externo externo separadamente, o con otros modos de
crackeo, en cuyo caso solo init() y filter() seran usadas (y solo filter()
es requerida). Usar un filtro externo es compatible con todos los otros
modos de crackeo y con la opcion '-makechars'.

Recomiendo que no uses filter(), o que por lo menos no filtres demasiadas
palabras cuando uses un modo externo con tu propia generate(). Mejor modifica
generate() para que no genere las palabras que serian filtradas.

 El Lenguaje
-------------

Como ya he mencionado arriba, el compilador soporta un subconjunto de C.
John es un crackeador, no un compilador, por eso no pienso que sea necesario
incluir nada mas. (Bueno, no estoy del todo seguro de que necesite un
compilador despues de todo, pero usar uno externo, por ejemplo perl, es menos
conveniente en algunos casos..)

Una lista de los identificadores soportados: void, int, if, else, while,
continue, break, return. Puedes definir funciones estandar para ser llamadas
por John, definir variables locales y globales (incluyendo matrices
unidimensionales), usar todas las operaciones entre enteros soportados en
C y usar comentarios de C.

Las funciones siguientes no estan incluidas:

* solo las funciones estandar estan soportadas, no puedes definir las tuyas
propias;
* solo los bucles 'while' estan soportados;
* solo los tipos de datos 'int' y 'void' estan supported;
* solo se permiten matrices (arrays) unidimensionales;
* structs/unions no estan supported;
* los punteros no estan soportados (el nombre del array se refiere al primer
elemento)
* algunas cosas mas, probablemente...

Puedes encontrar algunos ejemplos de modos externos en el archivo de
configuracion suministrado con John.

You can find some external mode examples in the default configuration file
supplied with John.



