Table of Contents
Ingeniería reversa de cortadora láser(continuación)
Integrantes:
David Martínez B34019
Alexander Marín B23892
Descripción
La segunda parte del proyecto consistirá en alcanzar los objetivos que no se consiguieron en la primera parte, específicamente en la primera parte la ingeniería reversa se realizó de manera parcial, ya que no se obtuvo como se dan las instrucciones del cortado y rasterizado a la cortadora láser, aunque si se ubicó la cadena de bits que contiene estas instrucciones. En cuanto al diseño de la aplicación no se trabajó, aunque ciertamente se hicieron varias pruebas con sockets en python que servirán de base para la implementación. Además de terminar la ingeniería reversa del protocolo y el diseño de la aplicación, se implementará la aplicación con las funciones básicas y con la capacidad de realizar trabajos en modo vectorial a partir de un archivo tipo PDF.
Objetivo general
- Diseñar e implementar una aplicación que permita hacer uso de la cortadora láser en Debian.
Objetivos específicos
- Determinar la estructura del paquete que contiene las instrucciones del corte vectorial a realizar.
- Diseñar las estructuras de datos y el diagrama de flujos de la aplicación.
- Implementar la aplicación con la capacidad de trabajar la cortadora en el modo vectorizado, que pueda recibir un archivo PDF como documento a cortar, y que al menos sea capaz de cortar un cuadrado.
Justificación
Actualmente para hacer uso la cortadora láser con el sistema operativo Debian es necesario tener una máquina virtual de Windows Xp/Vista/7 para poder usar la aplicación que controla la cortadora láser, con el desarrollo de la aplicación propuesta sería posible el uso de la cortadora sin la necesidad de utilizar software privativo como Windows Xp/Vista/7 o el mismo programa de la cortadora.
Ingeniería reversa de los datos de corte
Como parte de la continuación de la ingeniería reversa del protocolo de comunicación de la cortadora láser continuamos con el análisis de paquetes capturados por wireshark y durante las últimas semanas se sacó provecho de la opción “Save Job as binary file”, con la cual se salvan los datos de corte en un archivo con extensión .bin, a continuación presentamos algunas observaciones en cuanto a la forma en como se le dan ordenes a la cortadora. Haciendo pruebas con varias líneas vimos que el segmento de los datos del corte están dispuestos de una manera secuencial, esto se muestra bien en los archivos binarios resultantes de los siguientes tres cortes, los cuales consisten en una línea horizontal de 1 in, luego se mueve 1 in a la derecha y comienza la otra línea la cual tiene una longitud de 1 in, 2 in y 3 in para el primer, segundo y tercer corte respectivamente.
Se aprecia que hay una secuencia repetida varias veces (73 CE 39 E7 9C) y se repite en grupos, y conforme la segunda línea se hace mas grande el grupo es mas grande de modo que cabe pensar que la agrupación de esta secuencia esta asociada a la línea, sin embargo se interrumpe por cadenas con tamaño de 4 a 6 bytes, y el número de veces que se repite cada elemento de esta secuencia no es neceseriamente igual lo cual sugiere que esta secuencia no se basa en la misma idea del Simple Code, usado en el proyecto Laos, en el cual las órdenes tienen la forma:
<función> <parámetros>
Con respecto a los bytes ubicados entre los grupos subrayados, estos dependen de la distancia de separación ya que variando la distancia de separación a 0.5 in, vimos que la cantidad de bytes disminuye. Como se muestra en la siguiente imagen:
Cabe decir que cuando el láser termina la primera línea se dirige a mucha velocidad hacia el inicio de la próxima es decir no esta sujeto a la velocidad de corte, de la misma manera cuando termina la segunda línea se dirige rapidámente de nuevo a la posición de inicio y aunque puede no ser muy evidente entre mayor distancia recorre el láser al terminar el corte para volver a su posición de inicio, mayor es la cantidad de bytes despues del último grupo subrayado esto se observa entre los 4 cortes mostrados anteriormente y es aun mas evidente cuando se hace un rectángulo ya que cuando el láser termina el corte ya ha llegado a su posición de inicio y la cantidad de bytes despues del grupo de secuencias es mucho mas pequeño en comparación a los casos anteriores tal y como lo muestra la siguiente imagen de los datos de corte para un rectángulo a velocidad 25 y potencia 100, cortando en el sentido de las manecillas del reloj, para una y dos pasadas respectivamente, es decir que el láser pasa dos veces por un mismo lugar.
Tal y como se puede observar a pesar de que se hace el mismo corte dos veces las cadenas de bytes insertadas en medio de las secuencias subrayadas, no se repiten. También es importante notar hay un gran grupo de bytes que se distinguen fácilmente y entre ellos se notan los bytes 00 00 los cuales son parte de lo que parece ser un encabezado similar al ubicado en las primeras 3 líneas de los datos de corte, y al igual que éste los dos bytes anteriores a dan la cantidad de bytes despues de los dos ceros, para el caso del primer encabezado se tiene EE 02, sin embargo como se descubrió en la primera parte del proyecto primero hay que invertir el orden de estos dos bytes y luego convertirlo a decimal, de donde queda que son 750 bytes (2EE16=750), esta es la cantidad de bytes que hay entre los bytes 00 00 y los bytes del segundo encabezado que dan el tamaño de la segunda parte, en este caso se tiene 63 01, lo cual convertido da 355 bytes, esta es la cantidad de bytes entre los bytes 00 00 del segundo encabezado y hasta el final del paquete. Vale aclarar también que es diferente hacer un un rectángulo con 4 líneas individuales, es decir haciendo cada lado del rectángulo con la opción New Line, que hacerlo con la opción New Path (polilínea) o la opción New Rectangle, mientras que es lo mismo hacer un rectángulo con New Path o New Rectangle. Tal y como se ve en los siguientes datos de corte para un rectangulo armado con cuatro líneas, en donde la única diferencia con el caso anterior es el hecho de que son 4 polilíneas en vez de una, pero el cabezal hace el mismo recorrido.
De estos datos se observa que hay unas cadenas de mayor tamaño a las típicas de 4 a 6 bytes, dado esto pensamos que estás deben de estar asociadas al comienzo e inicio de la proxima línea, es decir que que hay una cantidad de parámetros intrínsecos a una línea al principio y final de ésta. Sin embargo no encontramos el patrón.
Algo muy curioso es la relación entre las secuencias que se repiten dentro de cada paquete, éstas varían con respecto a la distancia y la velocidad pero no con respecto a la potencia, y despues de una cierta distancia la secuencia no cambia tal y como se aprecia en los cortes anteriores, típicamente cortes mayores a 2 in, en el caso de una línea de 7 in a velocidad cuarenta se tiene la siguiente secuencia: 63 8c 31 c6 18 si se suma 63+63 da c6, 8c+8c da 118, 31+31=62, c6+c6=18c, 18+18=30. Pero si se suma el rebase de 118 y 18c al siguiente resultado entonces la secuencia se reproduce. Lo mismo sucede con la secuencia para un línea de 7 in a velocidad 100:
24 49 92
Igualmente para una velocidad de 96:
18 0C 06 83 C1 60 30
Lo mismo para una velocidad de 90:
3C 1E 8F C7 E3 F1 78
y de 75:
CE 39 E7 9C 73
Algo interesante también es que la secuencia para una velocidad de 96 es igual para las velocidades 8, 16, 24, 32, 48, 56, 72 y 88. Las velocidades de 40 y 80 también generan la misma secuencia, lo mismo entre las velocidades 25 y 75, al igual que para 30,70 y 90. Solo como dato adicional las secuencias parecen ser iguales para las distintas máquinas lo que cambia es el tamaño total de paquete y la cantidad de veces que la secuencia se repite, pero igualmente los demás grupos de bytes son diferentes, a excepción de las dos cortadoras Pro Large Form Factor, cuyos datos de corte son iguales al menos para el caso de una recta.
Ideas a futuro
Dado que se pueden guardar los paquetes en una tarjeta SD, no es necesario tener la cortadora físicamente para determinar como se le dan las ordenes de corte al láser, al menos para las cortadoras Pro Large Form Factor 48×36 y 36×24, Professional 24×18 y 20×12, y Hobby 5 generación 20×12, y junto con el SDK que publicó Laser Full Spectrum hace posible que solo sea necesario implementar una manera de generar el binario con los datos de corte y el cual se envía a través de sockets usando el SDK, de manera que no es indispensable determinar el protocolo de comunicación para las funciones básicas aunque éste ya se determinó en este proyecto, para la cortadora Hobby 5ta generación. Pero quizás sea aplicable en otras cortadoras láser. También en el hecho de que quizás otras cortadoras tengan la opción de salvar el Job como un binario en una tarjeta SD de modo que puede hacerse la ingeniería reversa de como se dan las órdenes de corte, sin necesidad de tener la cortadora.
Sugerencias para futuros proyectos de ingeniería reversa
Se debe de buscar intesivamente sobre el tema, sobre todo en los foros de la empresa que elaboró el protocolo, así como revisar los manuales disponibles, esto principalmente porque durante la segunda parte del proyecto encontramos unas publicaciones de cuestiones que nos hubieran salvado mucho tiempo. Determinar con que tipo de protocolo se esta lidiando, si es textual y no posee ninguna encriptación entonces puede ser obtenido fácilmente mientras que si es un protocolo binario es más díficil, en ambos caso el uso de software de ingeniería reversa automatizada como: Netzob y PI, pueden ser de ayuda para empezar. También se puede considerar el uso de linuxcnc para elaborar un driver, sin embargo dado que solo la cortadora de Hobby 4ta generación tiene la posiblidad ser controlada con este programa es poco posible que las futuras cortadoras de Full Spectrum Laser puedan ser utilizadas de esta manera.
Implementaciones
Debido a la falta de conocimientos en ingenieria reversa no fue posible obtener la implementacion completa del programa, sin embargo, si fue posible obtener las funciones básicas y tambien se incluirá un ejemplo de un circulo.
Funciones Básicas
Para obtener el programa con las funciones básicas es necesario clonar el git de proyecto:
git clone https://github.com/Tybus/retina-examples.git
El script de python que buscamos es el Laser.py, luego de darle permisos de ejecución, es necesario utilizar la siguiente sintaxis:
./Laser.py <IP de la Cortadora> <Funcion> <Tiepo del TestFire>
En la opción <Función> es necesario poner jogu, jogd, jogl, jogr, testF o gohome según correrponda.
Ejemplo Circulo
Este ejemplo fue obtenido del analisis de paquetes con wireshark, como se puede notar sigue el algoritmo del run job, luego de darle permisos de ejecucion es necesario utilizar la siguiente sintaxis:
./circle.py <Ip de la cortadora>
Analizador de PDF
Este analizador aun está en desarrollo y se detuvo temporalmente hasta poder obtener una Implementación definitiva del programa, sin embargo es utilizable, requiere gfx http://www.swftools.org/gfx_tutorial.html y opencv, la sintaxis es la siguiente:
./pdfanalizer.py <Dirección del pdf>