hardware - sirve - ¿Cuál es el hack más genial que has visto o hecho?
para que sirve el hardware (30)
El truco más genial (y no es realmente un truco en el verdadero sentido de la palabra, pero pasa tan bien como algunas de las respuestas anteriores) que alguna vez he creado en mi Apple // e.
Había una línea en el manual de referencia que decía que $ C010 era la bandera de ''cualquier tecla hacia abajo''.
Lo cual resultó ser cierto. La gran parte del conmutador de software $ C010 le indicará si una tecla no se activó o no, a pesar del hardware de repetición de teclas incorporado.
Lo que no te dijeron y todos descubrieron por las malas era que no había una manera confiable de averiguar QUÉ tecla se estaba presionando.
Si escribiste un pequeño programa de ensamblaje ... (disculpe mis errores, mi ensamblaje 6502 está muy oxidado)
:1
lda $C010
cmp #$80
bcc :1 ; branch if less than? I forget how to do that.
lda $C000
jsr $FDF0 ;output the accumulator value to the screen
Por lo tanto, se repetirá hasta presionar una tecla y se emitirá la clave cargando desde el interruptor de lectura del teclado $ C000.
Pero si ejecutó ese programa, no funcionaría del todo bien.
Ciertamente imprimirá algo mientras mantienes presionada una tecla y nada cuando no lo estás pero hubo un pequeño retraso en el autobús en alguna parte (creo que no soy un tipo de hardware) así que si presionas ''f'' tú Tendría muchas f. Pero si te detuvieras, luego presionas ''g'', obtendrías un montón de ''f''s antes de cambiar a'' g ''.
Se podía ver evidencia de este problema en la manzana] [versión de Gauntlet, te moverías en una dirección, y si trataste de moverte en una segunda dirección, te moverías un poco en tu dirección original hasta que pasaras el retraso.
Realmente no tenía sentido, porque leer $ C000 siempre era 100% exacto, a menos que primero marcaras $ C010.
Encontré este problema fascinante y después de semanas de jugar, finalmente se me ocurrió lo que aún creo que es el programa más genial que he escrito.
El programa en sí no tenía sentido, hizo algunos ORA inútiles, pero por alguna razón funcionó, y arrojó valores correctos de $ C000 después de consultar $ C010.
Tan genial fue esto, escribí un artículo para la revista nibble, que aceptaron pero nunca publicaron (ya sea porque cerraron o porque el artículo decía como si hubiera sido escrito por un niño de 15 años, que lo era) donde escribí un reemplazo programa de entrada de teclado y lo conectó a la ubicación de la página cero que todo el mundo llama para obtener la entrada del teclado y pude cambiar programáticamente el retraso de repetición del teclado y la velocidad de repetición, algo que de otro modo sería imposible ya que estaba conectado al hardware. Por supuesto, Apple // e estaba en camino en ese punto, pero aún hoy, mi mejor truco.
Actualización 3/2/2010: revisando algunos documentos antiguos, encontré una copia impresa de mi pequeña rutina de montaje. Lo estoy publicando aquí para ver si alguien puede descubrir por qué funciona, y por lo tanto será consagrado para siempre en forma digital en alguna parte ...
$0300 AD 10 C0 LDA $C010 ; load accumulator with any-key-down flag
$0303 29 80 AND #$80 ; keep only high bit flag
$0305 0D 00 C0 ORA $C000 ; OR accumulate with keyboard soft switch
$0308 10 F9 BPL $0303 ; erm, I forget exactly which branch this is
$030A 09 80 ORA #$80 ; turn the high bit on
$030C 20 ED FD JSR $FDED ; print char in accumulator
$030F 4C 00 30 JMP $0300 ; start again.
No tiene sentido por qué esto debería funcionar, pero lo hace. O lo hizo. Hace 25 años.
Como programadores, todos hemos armado un programa realmente genial o hemos armado hardware de una forma interesante para resolver un problema. Hoy estaba pensando en esos hacks y cómo algunos de ellos están en desuso debido a la tecnología moderna (por ejemplo, ya no es necesario hackear su Tivo para agregar un puerto de red). En el mundo del software, ahora damos por hecho cosas como arrastrar y soltar en una página web, pero no hace mucho tiempo, eso también fue un truco bastante emocionante.
Uno de los mejores hacks de hardware que he visto fue hecho por un ex compañero de trabajo en una empresa de telecomunicaciones hace años. Tenía un pequeño televisor portátil en su oficina y lo veía todo el día mientras trabajaba. Para salirse con la suya, conectó un interruptor al encendido / apagado que se activó a través de su pie debajo de su escritorio.
¿Cuál es el truco de hardware o software más genial que has visto o hecho personalmente? ¿En qué hackeo estás trabajando ahora?
Esto no fue un truco, pero alguien que trabajé hace mucho tiempo me lo contó (realmente hizo el truco).
Parece que trabajó para alguien que era ciego y que necesitaba una forma de leer archivos de texto. Así que descubrió cómo traducir archivos de texto a Braille e imprimirlos usando varios caracteres como. y:
Las impresoras en ese momento eran impresoras de impacto, por lo que cuando se imprimía un personaje, el mecanismo de impresión golpeaba el papel con la fuerza suficiente como para dejar una impresión que se podía sentir. Dado que la impresión se formó en la parte posterior del papel, tuvo que imprimir un braille invertido hacia atrás para que cuando el papel se volteó fuera correcto.
Por supuesto, el acto de leer eliminó las depresiones, por lo que fue un mecanismo de solo lectura, pero siempre pensé que era un hack genial.
Escribí un ensamblador para una pequeña máquina virtual (UDVM) con Excel y Visual Basic. Usted escribe su código de ensamblado en las celdas de Excel y su disposición de memoria en la otra hoja de cálculo, y luego en la parte inferior se calcularán las cadenas binarias del código de máquina. Imagina el temor de ensamblar las manos cada vez que cambias el código de ensamblaje.
En los días de DOS, escribí un programa de guiones para demostrar el software de mi empresa. Este programa de scripts iniciaría la aplicación y luego abriría ventanas en la parte superior de la aplicación, describiría algunas de sus características usando el tipo de animación, luego cerraría la ventana, alimentaría las teclas con la aplicación, esperaría que la aplicación mostrara la pantalla correcta y luego abrir más ventanas. Tenía su propio lenguaje de scripting e incluso un editor de scripts para poder interrumpir el script, editarlo y luego reanudarlo. La mejor parte es que se ejecutó sobre una versión no modificada de nuestra aplicación.
Toda la aplicación de demostración se escribió en C y lenguaje ensamblador. Enganchó interrupciones de temporizador y teclado para interactuar con la aplicación. Escribí todo, incluso la biblioteca de ventanas.
Es algo tan trivial, pero cuando vi este código por primera vez (por un compañero desarrollador mío) me sorprendió porque es algo en lo que nunca hubiera pensado (comentarios agregados por mí):
cglobal x264_sub8x8_dct_sse2, 3,3 ;3,3 means 3 arguments and 3 registers used
.skip_prologue:
call .8x4
add r0, 64 ;increment pointers
add r1, 4*FENC_STRIDE
add r2, 4*FDEC_STRIDE
.8x4:
SUB_DCT4 2x4x4W ;this macro does the actual transform
movhps [r0+32], m0 ;store second half of output data
movhps [r0+40], m1 ;the rest is done in the macro
movhps [r0+48], m2
movhps [r0+56], m3
ret
Hace un bloque de 8x8 de 4 transformaciones haciendo series de 8x4 a la vez. Pero no pega el código dos veces (que desperdiciará el tamaño del código), ni tiene una función 8x4 y lo llama dos veces. Tampoco tiene un bucle. En su lugar, llama a la "función" y luego incrementa los punteros, y luego "cae" directamente en él y lo vuelve a hacer.
Obtiene lo mejor de ambos mundos: no hay funciones que llamen a sobrecargar más allá del original (ya que los punteros r0, r1 y r2 no se incrementan en SUB_DCT4) y no hay duplicación de código ni sobrecarga de bucle.
La raíz cuadrada inversa rápida: una pequeña rutina extraña que de alguna manera logra calcular la raíz cuadrada inversa de algo, pero nunca lo adivinarías al mirarla.
http://betterexplained.com/articles/understanding-quakes-fast-inverse-square-root/
Ver a mi ex compañero de trabajo reescribir un motor 3D de PlayStation One dentro de las tres semanas desde cero en el ensamblador. El anterior debía ralentizarse y ya no teníamos tiempo para cambiar los activos gráficos. Comenzó esa reescritura dos meses antes de la fecha límite.
Fue el mismo tipo (y algunos otros tipos también, fue un acto de trabajo en equipo) que hizo un trabajo increíble rellenando 10 minutos de gráficos y sonido en un ejecutable de 64 kb.
Bueno, no es el mejor, pero definitivamente divertido (para programadores).
Creamos un generador de consultas ad-hoc para un proyecto de base de datos de currículum. Había algunas partes de ajaxy y la idea básica era que si cambiabas algo en la página, la búsqueda se volvía a ejecutar automáticamente. (Fue desencadenado por el evento onBlur de todos los widgets UI)
Entonces no teníamos ningún uso real para un botón "Buscar" o "Ejecutar consulta". Esto confundió a los usuarios sin fin. Así que agregamos un botón de búsqueda que no hizo nada. Simplemente se sentó allí.
Funcionó porque cada vez que hacía clic en el botón de búsqueda, se activaba el evento onBlur del campo en el que acababa de ingresar.
Esto hizo que nuestra base de usuarios fuera muy feliz. Cosas simples.
Estábamos comprometidos en la pequeña empresa en la que trabajaba por algunos piratas informáticos supuestamente rusos. Yo y algunos otros desarrolladores queríamos ver cómo, así que saqué el script PHP más elegante que he visto en mi servidor y lo eliminé de nuestra máquina en vivo.
Era un caballo de Troya llamado c99shell que hacía tanto con tan poco que era horrible y hermoso al mismo tiempo. La cosa tenía una GUI incrustada con imágenes que usaban base64 para sacarlas del PHP, así que todo era independiente. ¡La lista de características estaba enferma! Esto podría iniciar shells, buscar cadenas de conexión, bloquearse y otras cosas útiles para un atacante.
Fue hermoso.
Todos en la oficina pensaron que estaba loco, pero realmente, realmente este código tenía un poco de pensamiento puesto en ello. Mantienen el tamaño del archivo pequeño para escabullirse de esos molestos límites de carga e incluso tienen una notificación de correo electrónico codificada en base64 que recopila toda la información para el atacante.
Hice un contador dividido por ocho de válvulas neumáticas en la universidad para quedar exento del resto del curso de neumática.
Mientras trabajaba en el esfuerzo de ingeniería inversa del iPhone, encontré una vulnerabilidad en la banda base (chip que maneja la telefonía y el bloqueo del operador) que le permitía escribir ceros arbitrariamente. Aunque esto parecía inútil al principio, rápidamente se hizo evidente que esto podría hacer mucho más de lo que inicialmente pensé. Con la forma en que ARM funciona, ciertos saltos podrían anularse al escribir un solo cero en el objetivo, lo que hace que la ruta de ejecución siempre continúe hacia delante. Esto permitió un desbloqueo de software, pero fue reemplazado rápidamente por un hack más robusto que le permitió volver a analizar la banda base por completo.
Todavía estoy orgulloso de ese hack, sin importar su inutilidad ahora.
Recuerdo que este truco fue escrito por Bob Smith, quien hizo el viejo administrador de memoria de la era DOS llamado 386MAX (o "386 en el Max"). No era parte del producto, era un pequeño programa de utilidad que aceleraba y publicaba en algún lugar. Sin embargo, en la web, la única referencia a esta técnica que puedo encontrar es una columna de la esquina DDJ no documentada de noviembre de 1996 de Robert Collins.
El problema
Antes de que Intel presentara la instrucción CPUID , era difícil verificar el tipo exacto y los niveles de revisión de la CPU en su sistema. Resulta que en la mayoría de las versiones del 386 y posteriores, en realidad había una ID de CPU, pero solo era visible en un momento específico: justo después de que el procesador se reiniciara en el registro EDX. (Se asumió que el BIOS de la computadora sería el único software legítimamente interesado en esto).
Problema: ¿cómo puede un programa normal recuperar este valor de registro si no somos el BIOS?
Material de fondo
Este truco se basó en seis peculiaridades distintas de las computadoras compatibles con PC de IBM. Ellos fueron los siguientes:
- Comenzando con IBM AT y posterior, hay una forma de desactivar de forma independiente la línea de dirección A20 en el bus.
- La mayoría de las computadoras no tienen RAM instalada en direcciones de memoria muy altas justo debajo de la ROM del BIOS.
- La mayoría de las computadoras de bus IBM PC devuelven 0xFF cuando lee una ubicación de memoria que no tiene memoria instalada allí.
- 0xFF 0xFF 0xFF, etc. es un código de operación ilegal en las CPU de Intel.
- Si instala un controlador de excepción en la memoria, sobrevivirá a un reinicio suave en la mayoría de las CPU de esta época (386 a 486).
- Tras un reinicio suave o completo, los procesadores Intel saltan a una dirección que está en la parte superior de la memoria direccionable, menos 16 bytes, por lo que la ROM del BIOS se coloca allí.
El programa combinó el conocimiento de todas estas piezas de trivia para lograr el objetivo.
El Hack
El resultado fue un programa de línea de comandos de DOS que hizo lo siguiente:
- Instaló un manejador de excepciones de código de operación ilegal
- Desactivado la línea de dirección A20 en el autobús
- Soft-reinició la CPU (creo que esto fue a través de una llamada BIOS)
Cuando se produce el reinicio suave, el procesador intenta saltar a la parte superior de la memoria menos 16 bytes, que es donde se encuentra el código de inicio de la ROM. Sin embargo, como A20 estaba desactivado, saltaba a la parte superior de la memoria menos 16 bytes menos un megabyte . En la mayoría de las PC no hay memoria RAM allí. Por lo tanto, obtendría una serie de bytes 0xFF de esta memoria RAM inexistente e intentaría ejecutarla. Esto crearía una excepción de código de operación ilegal.
Su manejador de excepción, entonces, obtendría el valor de EDX (el CPUID) y lo escondería en algún lugar donde pudiera encontrarlo. Luego limpiaría el desorden (vuelva a encender el A20, cambie de modo protegido a modo real para DOS) y devuelva el control al código original.
Cuando funcionó, fue genio para la vista. Voila, aquí había un sencillo programa DOS de línea de comandos que le daría el valor de CPUID.
Por supuesto, inevitablemente había PCs que "no eran del todo compatibles", que colapsarían horriblemente cuando ejecutaras esto. Ah bueno.
Te lo diría, pero es posible que deseen recuperar mi diploma de escuela secundaria si lo admití;)
Un amigo mío estaba reemplazando la placa madre en su Dell con una placa madre original más nueva y más rápida. Sin embargo, no pudo hacer funcionar el botón de encendido, y otras cosas del panel frontal: los conectores eran de diferentes tamaños, con diferentes diseños de pin. Tomé un montón de puentes de repuesto y cables de repuesto, y conecté los pines apropiados uno por uno. No necesita soldadura :)
En cuanto al código, estoy impresionado constantemente. Siempre pensé que no había una forma elegante de determinar si un niño pequeño había sido exitosamente exec
, pero en realidad sí lo es .
niño:
execvp(argv[0], argv);
errval = errno;
write(data->fd, &errval, sizeof(errval));
padre:
socketpair(AF_UNIX, SOCK_STREAM, 0, fds);
flag = fcntl(fds[1], F_GETFD) | FD_CLOEXEC;
fcntl(fds[1], F_SETFD, flag);
pid = clone(child, NULL, SIGCHLD, NULL);
if(pid < 0){
...
}
close(fds[1]);
/* Read the errno value from the child, if the exec failed, or get 0 if
* the exec succeeded because the pipe fd was set as close-on-exec.
*/
n = read(fds[0], &ret, sizeof(ret));
if (n < 0) {
...
} else if(n != 0){
/* exec failed */
} else {
/* exec succeeded */
}
Una vez hice una línea de comandos simple para el psion 3a durante una conferencia universitaria. Solo podía hacer una lista básica de directorios, explorar, copiar y mover, pero parecía una pantalla pequeña con una letra pequeña.
Ah, y programé pong para el 68008 con macetas para entrada y un osciloscopio para salida. No es tan difícil usar una placa de desarrollo, pero había algo genial sobre jugarlo en una osc.
Duffs Device , para la pregunta anterior.
La historia de Mel Hardcore hack.
Controlador de disco de Steve Wozniak.
Al ver cómo usar TCP en 4D, me encontré con esta variación del dispositivo Duff en la documentación:
$SentOK:=False //A flag to indicate if we made it through all of the calls
Case of
: (SMTP_New ($smtp_id)!=0)
: (SMTP_Host ($smtp_id;<>pref_Server)!=0)
: (SMTP_From ($smtp_id;vFrom)!=0)
: (SMTP_To ($smtp_id;vTo)!=0)
: (SMTP_Subject ($smtp_id;vSubject)!=0)
: (SMTP_Body ($smtp_id;vMessage)!=0)
: (SMTP_Send ($smtp_id)!=0)
Else
$SentOK:=True //message was composed and mailed successfully
End case
If ($smtp_id!=0) //If a Message Envelope was created we should clear it now
$OK:=SMTP_Clear ($smtp_id)
End if
Lo miré y pensé que era realmente inteligente (todavía lo hago). Desafortunadamente, no era lo que necesitaba y nunca tuve la oportunidad de usarlo.
Después de varios días de depuración de un servidor de acceso telefónico que experimentaba un número inaceptable de llamadas caídas, tracé el problema a un mecanismo de autenticación local que dependía de la representación de texto del PID de getty
ejecución. El getty
generaría un error y abortaría si su PID contuviera un número par seguido de un 9, lo que ocasionaría que la llamada cayera y el getty
reapareciera con un nuevo PID.
Después de que se identificó el problema, me quitaron del proyecto y luego descubrí que la "solución" era cambiar la conversión de texto a texto de
sprintf(strval, "%d", pid);
a
sprintf(strval, "%o", pid);
En lugar de solucionar los problemas de la rutina de autenticación, alguien eligió convertir el PID a octal , lo que hace imposible contener un 9.
No lo hice yo, por supuesto, pero lo encontré recientemente y me pareció genial:
Juego de la vida de autoimpresión en C #
"El juego de la vida de Conway ha fascinado a los científicos informáticos durante décadas. Aunque sus reglas son ridículamente simples, el universo de Conway da lugar a una variedad de planeadores, naves espaciales, osciladores, cazas planeadores y otras formas de" vida ". similarmente curioso, y, sorprendentemente, tienen un lugar importante en la teoría de la computación.
¿Qué pasa cuando combinas los dos? Estás a punto de descubrirlo, pero una cosa es segura: el factor geek debe ser bastante alto.
Escribí un pequeño programa de C # que contiene una grilla de Game-of-Life. El programa avanza la grilla del juego a la siguiente generación e imprime una copia de sí mismo, con la cuadrícula actualizada. Puede tomar el resultado, compilarlo con un compilador de C #, ejecutarlo y obtendrá la próxima generación del juego. Puede repetir el proceso o cambiar el estado de la grilla inicial de forma manual. "
Siga el enlace de arriba para el código fuente.
Y un programa de auto impresión (''quine'') en C #, 149 caracteres de largo:
class P{static void Main(){var S=“class P{{static void Main(){{var S={1}{0}{1};System.Console.Write(S,S,’{1}’);}}}}”;System.Console.Write(S,S,‘”‘);}}
El dispositivo de Tesla estableció el récord de rayos artificiales (42 metros o 130 pies) y todas las luces en Colorado Springs se habían apagado.
Obtuve una Computadora Commodore 64 temprana, y necesitaba escribir un código ensamblador para ella.
El problema era que no había un Programa de Ensamblador para el C64 (ni eso, ni podía pagarlo).
Así que escribí un ensamblador al buscar los códigos de operación 6502 en un libro y crear el programa a partir de los bytes sin procesar.
En algún momento, pudo tomar el código de ensamblaje como entrada y ensamblarlo en un programa.
Un amigo mío había escrito un desensamblador para su PET en BASIC. Usé este programa para desmontar mi ensamblador, y luego pude usar mi ensamblador para ensamblar versiones más nuevas de sí mismo.
Oh, los aros que tuvimos que saltar en los viejos tiempos :)
Escribí un simple archivo por lotes de Windows para permitirme reproducir rápidamente pistas que coinciden con algún patrón de mi biblioteca de música (en f: unidad) en una máquina dolorosamente lenta (abrir iTunes tarda unos 3 minutos en esta máquina). Admite expresiones regulares a través del comando findstr
y usa mplayer para reproducir las pistas. Todo lo que tengo que hacer es presionar Windows + R y escribir:
play u2
o:
play "neighbo.+rhood"
o:
play "blink[0-9][0-9][0-9]"
El archivo por lotes es así, en play.bat
.
cd /d f:
findstr /I /R %1 dirlist.txt > playlist.txt
mplayer -playlist playlist.txt
Tanto mplayer como play.bat deberían agregarse a tu ruta.
No por mí:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
int i;
printf("((((");
for(i=1;i!=argc;i++){
if( strcmp(argv[i], "^")==0) printf(")^(");
else if(strcmp(argv[i], "*")==0) printf("))*((");
else if(strcmp(argv[i], "/")==0) printf("))/((");
else if(strcmp(argv[i], "+")==0) printf(")))+(((");
else if(strcmp(argv[i], "-")==0) printf(")))-(((");
else printf("%s", argv[i]);
}
printf("))))/n");
return 0;
}
Dispositivo de Duff . ¿Eso cuenta? :)
The Black Sunday Hack .
Este verano escribí un juego al que llamo SatelliteRush. Es un juego de Breakout para teléfonos móviles con Java y GPS. Se puede jugar en dos modos: "modo aburrido" y "modo satélite". En el modo aburrido, utiliza botones para mover la paleta, como siempre, pero en modo satélite utiliza el receptor GPS del teléfono. Corres hacia adelante y hacia atrás, y la paleta se mueve contigo.
Solo lo he probado en un Sony-Ericsson W760i, y funciona razonablemente bien, dado que las actualizaciones de posición GPS son bastante lentas e inexactas.
Hasta ahora, he hecho una "versión de prueba técnica" de este juego, por lo que no es muy atractiva o fácil de usar. Pero si tiene un teléfono GPS con Java, puede descargarlo aquí: http://www.lysator.liu.se/~padrone/temporary/SatelliteRushTest/
EDITAR:
Ahora disponible para Android como una aplicación gratuita en Android Market: https://market.android.com/details?id=se.nekotronic.satelliterush
La raíz cuadrada inversa de Quake3 y el modificador MIT Magic / More Magic suelen hacer estas listas.
Hace un par de años estaba desarrollando una interfaz web y usando algunas nuevas librerías JS para la funcionalidad AJAX. La lib solo evaluó JS que estaba en el encabezado del doc html, pero se devolvieron demasiados datos para caber en el encabezado. ¿Qué hacer?
Algunos pellizcos revelaron que el JS en el encabezado tenía acceso al cuerpo del documento html, por lo que escribí una función genérica ''eval the body'' que se devolvió en el encabezado. Muy útil en ese momento, especialmente b / ca JS lib diferente, estábamos evaluando solo JS evaluadas del cuerpo, ¡así que esto era compatible para ambas librerías JS y evitaba restricciones de tamaño desde el encabezado!
Sí, simple, pero me sentí bastante increíble durante todo un mes después de descifrar esto :)