Rhinoceros dentro del gato: ejecute el firmware en el emulador Kopycat


En el marco de la reuni贸n 0x0A DC7831 DEF CON Nizhny Novgorod el 16 de febrero, presentamos un informe sobre los principios b谩sicos de la emulaci贸n de c贸digo binario y nuestro propio desarrollo: un emulador de plataformas de hardware Kopycat .


En el art铆culo, describiremos el lanzamiento del firmware del dispositivo en el emulador, demostraremos la interacci贸n con el depurador y realizaremos un peque帽o an谩lisis din谩mico del firmware.


Antecedentes


Hace mucho tiempo en una galaxia muy muy lejana


Hace un par de a帽os en nuestro laboratorio era necesario estudiar el firmware del dispositivo. El firmware fue comprimido, descomprimido por el gestor de arranque. Lo hizo de una manera muy confusa, varias veces cambiando datos en la memoria. S铆, y el firmware en s铆 mismo interactu贸 activamente con los perif茅ricos. Y todo esto en el n煤cleo de MIPS.


Por razones objetivas, los emuladores existentes no nos conven铆an, pero a煤n as铆 quer铆a ejecutar el c贸digo. Luego decidimos hacer nuestro propio emulador, que har谩 un m铆nimo y permitir谩 descomprimir el firmware principal. Lo intentamos, result贸. Pensamos, 驴y si agregamos perif茅ricos para tambi茅n realizar el firmware principal? No fue muy doloroso, y tambi茅n funcion贸. Pensamos de nuevo y decidimos hacer un emulador completo.


El resultado fue un emulador de sistemas inform谩ticos Kopycat .



驴Por qu茅 kopycat?

Hay un juego de palabras.


  1. copycat (ingl茅s, n. [藞k蓲p瑟k忙t]) - copycat, imitador
  2. cat (ingl茅s, n. [藞k忙t]) - un gato, un gato - un animal favorito de uno de los creadores del proyecto
  3. Letra "K" - del lenguaje de programaci贸n Kotlin

Kopycat


Al crear el emulador, se establecieron objetivos absolutamente espec铆ficos:


  • la capacidad de crear r谩pidamente una nueva periferia, m贸dulo, n煤cleo de procesador;
  • la capacidad de ensamblar un dispositivo virtual desde varios m贸dulos;
  • la capacidad de cargar cualquier dato binario (firmware) en la memoria del dispositivo virtual;
  • la capacidad de trabajar con instant谩neas (instant谩neas del estado del sistema);
  • la capacidad de interactuar con el emulador a trav茅s del depurador incorporado;
  • Agradable lenguaje moderno para desarrollar.

Como resultado, Kotlin fue elegido para la implementaci贸n, la arquitectura del bus (esto es cuando los m贸dulos se comunican entre s铆 a trav茅s de buses de datos virtuales), JSON como el formato de descripci贸n del dispositivo y GDB RSP como el protocolo para interactuar con el depurador.


El desarrollo ha estado ocurriendo durante un poco m谩s de dos a帽os y est谩 en curso. Durante este tiempo, se implementaron los n煤cleos de procesador MIPS, x86, V850ES, ARM, PowerPC.


El proyecto est谩 creciendo y es hora de presentarlo al p煤blico en general. Haremos una descripci贸n detallada del proyecto m谩s adelante, pero ahora nos centraremos en usar Kopycat.


Para los m谩s impacientes: la versi贸n promocional del emulador se puede descargar aqu铆 .


Rhino en el emulador


Recuerde que anteriormente para la conferencia SMARTRHINO-2018, se cre贸 un dispositivo de prueba "Rhinoceros" para la capacitaci贸n en habilidades de ingenier铆a inversa. El proceso de an谩lisis de firmware est谩tico se describi贸 en este art铆culo .


Ahora intentemos agregar "altavoces" y ejecutar el firmware en el emulador.


Necesitaremos:
1) Java 1.8
2) Python y el m贸dulo Jep para usar Python dentro del emulador. El ensamblaje WHL del m贸dulo Jep para Windows se puede descargar aqu铆 .


Para Windows:
1) com0com
2) PuTTY


Para Linux:
1) socat


Puede usar Eclipse, IDA Pro o radare2 como cliente GDB.


Como funciona


Para realizar el firmware en el emulador, debe "ensamblar" un dispositivo virtual, que es un an谩logo de un dispositivo real.


El dispositivo real ("rinoceronte") se puede mostrar en un diagrama de bloques:


Circuito de dispositivo real

El emulador tiene una estructura modular y el dispositivo virtual final se puede describir en un archivo JSON.


JSON en 105 l铆neas
{ "top": true, // Plugin name should be the same as file name (or full path from library start) "plugin": "rhino", // Directory where plugin places "library": "user", // Plugin parameters (constructor parameters if jar-plugin version) "params": [ { "name": "tty_dbg", "type": "String"}, { "name": "tty_bt", "type": "String"}, { "name": "firmware", "type": "String", "default": "NUL"} ], // Plugin outer ports "ports": [ ], // Plugin internal buses "buses": [ { "name": "mem", "size": "BUS30" }, { "name": "nand", "size": "4" }, { "name": "gpio", "size": "BUS32" } ], // Plugin internal components "modules": [ { "name": "u1_stm32", "plugin": "STM32F042", "library": "mcu", "params": { "firmware:String": "params.firmware" } }, { "name": "usart_debug", "plugin": "UartSerialTerminal", "library": "terminals", "params": { "tty": "params.tty_dbg" } }, { "name": "term_bt", "plugin": "UartSerialTerminal", "library": "terminals", "params": { "tty": "params.tty_bt" } }, { "name": "bluetooth", "plugin": "BT", "library": "mcu" }, { "name": "led_0", "plugin": "LED", "library": "mcu" }, { "name": "led_1", "plugin": "LED", "library": "mcu" }, { "name": "led_2", "plugin": "LED", "library": "mcu" }, { "name": "led_3", "plugin": "LED", "library": "mcu" }, { "name": "led_4", "plugin": "LED", "library": "mcu" }, { "name": "led_5", "plugin": "LED", "library": "mcu" }, { "name": "led_6", "plugin": "LED", "library": "mcu" }, { "name": "led_7", "plugin": "LED", "library": "mcu" }, { "name": "led_8", "plugin": "LED", "library": "mcu" }, { "name": "led_9", "plugin": "LED", "library": "mcu" }, { "name": "led_10", "plugin": "LED", "library": "mcu" }, { "name": "led_11", "plugin": "LED", "library": "mcu" }, { "name": "led_12", "plugin": "LED", "library": "mcu" }, { "name": "led_13", "plugin": "LED", "library": "mcu" }, { "name": "led_14", "plugin": "LED", "library": "mcu" }, { "name": "led_15", "plugin": "LED", "library": "mcu" } ], // Plugin connection between components "connections": [ [ "u1_stm32.ports.usart1_m", "usart_debug.ports.term_s"], [ "u1_stm32.ports.usart1_s", "usart_debug.ports.term_m"], [ "u1_stm32.ports.usart2_m", "bluetooth.ports.usart_m"], [ "u1_stm32.ports.usart2_s", "bluetooth.ports.usart_s"], [ "bluetooth.ports.bt_s", "term_bt.ports.term_m"], [ "bluetooth.ports.bt_m", "term_bt.ports.term_s"], [ "led_0.ports.pin", "u1_stm32.buses.pin_output_a", "0x00"], [ "led_1.ports.pin", "u1_stm32.buses.pin_output_a", "0x01"], [ "led_2.ports.pin", "u1_stm32.buses.pin_output_a", "0x02"], [ "led_3.ports.pin", "u1_stm32.buses.pin_output_a", "0x03"], [ "led_4.ports.pin", "u1_stm32.buses.pin_output_a", "0x04"], [ "led_5.ports.pin", "u1_stm32.buses.pin_output_a", "0x05"], [ "led_6.ports.pin", "u1_stm32.buses.pin_output_a", "0x06"], [ "led_7.ports.pin", "u1_stm32.buses.pin_output_a", "0x07"], [ "led_8.ports.pin", "u1_stm32.buses.pin_output_a", "0x08"], [ "led_9.ports.pin", "u1_stm32.buses.pin_output_a", "0x09"], [ "led_10.ports.pin", "u1_stm32.buses.pin_output_a", "0x0A"], [ "led_11.ports.pin", "u1_stm32.buses.pin_output_a", "0x0B"], [ "led_12.ports.pin", "u1_stm32.buses.pin_output_a", "0x0C"], [ "led_13.ports.pin", "u1_stm32.buses.pin_output_a", "0x0D"], [ "led_14.ports.pin", "u1_stm32.buses.pin_output_a", "0x0E"], [ "led_15.ports.pin", "u1_stm32.buses.pin_output_a", "0x0F"] ] } 

Preste atenci贸n al par谩metro de firmware en la secci贸n de par谩metros: este es el nombre del archivo que se puede descargar al dispositivo virtual como firmware.


Un dispositivo virtual y su interacci贸n con el sistema operativo principal se pueden representar de la siguiente manera:


Dispositivo de circuito emulado

La instancia de prueba actual del emulador implica la interacci贸n con los puertos COM del sistema operativo principal (depuraci贸n UART y UART para el m贸dulo Bluetooth). Estos pueden ser puertos reales a los que est谩n conectados los dispositivos o puertos COM virtuales ( com0com / socat es solo para esto ) .


Actualmente hay dos formas principales de interactuar con el emulador desde el exterior:


  • Protocolo GDB RSP (respectivamente, compatible con este protocolo, herramientas: Eclipse / IDA / radare2);
  • l铆nea de comando interna del emulador (Argparse o Python).

Puertos COM virtuales


Para interactuar con el UART del dispositivo virtual en la m谩quina local a trav茅s del terminal, debe crear un par de puertos COM virtuales conectados. En nuestro caso, un puerto usa un emulador y el segundo un programa de terminal (PuTTY o pantalla):


Puertos COM virtuales

Usando com0com


Los puertos COM virtuales se configuran con la utilidad de configuraci贸n del kit com0com (la versi贸n de la consola es C: \ Archivos de programa (x86) \ com0com \ setup.exe, o la versi贸n de la GUI es C: \ Archivos de programa (x86) \ com0com \ setupg.exe ) :


Configurar puertos COM virtuales

Marque las casillas de verificaci贸n de desbordamiento del b煤fer de habilitaci贸n para todos los puertos virtuales creados; de lo contrario, el emulador esperar谩 una respuesta del puerto COM.


Usando socat


En los sistemas UNIX, el emulador crea autom谩ticamente puertos COM virtuales utilizando la utilidad socat, para esto es suficiente especificar el prefijo socat: en el nombre del puerto al iniciar el emulador.


Interfaz de l铆nea de comando interna (Argparse o Python)


Como Kopycat es una aplicaci贸n de consola, el emulador proporciona dos opciones para que la interfaz de l铆nea de comandos interact煤e con sus objetos y variables: Argparse y Python.


Argparse es la CLI integrada en Kopycat, siempre est谩 disponible para todos.


Una CLI alternativa es el int茅rprete de Python. Para usarlo, debe instalar el m贸dulo Jep Python y configurar el emulador para que funcione con Python (se utilizar谩 el int茅rprete de Python instalado en el sistema principal del usuario).


Instalar el m贸dulo Python Jep


Bajo Linux, Jep se puede instalar a trav茅s de pip:


 pip install jep 

Para instalar Jep en Windows, primero debe instalar el SDK de Windows y el Microsoft Visual Studio correspondiente. Simplificamos un poco su tarea e hicimos ensamblajes WHL JEP para las versiones actuales de Python para Windows, para que el m贸dulo se pueda instalar desde un archivo:


 pip install jep-3.8.2-cp27-cp27m-win_amd64.whl 

Para verificar la instalaci贸n de Jep, debe ejecutar la l铆nea de comando:


 python -c "import jep" 

En respuesta, se debe recibir un mensaje:


 ImportError: Jep is not supported in standalone Python, it must be embedded in Java. 

En el archivo por lotes del emulador para su sistema ( kopycat.bat para Windows, kopycat para Linux) agregue el par谩metro adicional Djava.library.path a la lista de par谩metros DEFAULT_JVM_OPTS ; debe contener la ruta al m贸dulo Jep instalado.


Como resultado, para Windows, deber铆a obtener una l铆nea como esta:


 set DEFAULT_JVM_OPTS="-XX:MaxMetaspaceSize=256m" "-XX:+UseParallelGC" "-XX:SurvivorRatio=6" "-XX:-UseGCOverheadLimit" "-Djava.library.path=C:/Python27/Lib/site-packages/jep" 

Lanzamiento de Kopycat


El emulador es una aplicaci贸n JVM de consola. El lanzamiento se realiza a trav茅s de la secuencia de comandos de la l铆nea de comandos del sistema operativo (sh / cmd).


Comando para ejecutar bajo Windows:


 bin\kopycat -g 23946 -n rhino -l user -y library -p firmware=firmware\rhino_pass.bin,tty_dbg=COM26,tty_bt=COM28 

El comando para ejecutar en Linux usando la utilidad socat:


 ./bin/kopycat -g 23946 -n rhino -l user -y library -p firmware=./firmware/rhino_pass.bin,tty_dbg=socat:./COM26,tty_bt=socat:./COM28 

  • -g 23646 : puerto TCP que estar谩 abierto para acceder al servidor GDB;
  • -n rhino : el nombre del m贸dulo principal del sistema (ensamblaje del dispositivo);
  • -l user : el nombre de la biblioteca para buscar el m贸dulo principal;
  • -y library : la ruta para buscar los m贸dulos incluidos en el dispositivo;
  • firmware\rhino_pass.bin - ruta al archivo de firmware;
  • COM26 y COM28 son puertos COM virtuales.

El resultado ser谩 el Argparse > Python > (o Argparse > ):


 18:07:59 INFO [eFactoryBuilder.create ]: Module top successfully created as top 18:07:59 INFO [ Module.initializeAndRes]: Setup core to top.u1_stm32.cortexm0.arm for top 18:07:59 INFO [ Module.initializeAndRes]: Setup debugger to top.u1_stm32.dbg for top 18:07:59 WARN [ Module.initializeAndRes]: Tracer wasn't found in top... 18:07:59 INFO [ Module.initializeAndRes]: Initializing ports and buses... 18:07:59 WARN [ Module.initializePortsA]: ATTENTION: Some ports has warning use printModulesPortsWarnings to see it... 18:07:59 FINE [ ARMv6CPU.reset ]: Set entry point address to 08006A75 18:07:59 INFO [ Module.initializeAndRes]: Module top is successfully initialized and reset as a top cell! 18:07:59 INFO [ Kopycat.open ]: Starting virtualization of board top[rhino] with arm[ARMv6Core] 18:07:59 INFO [ GDBServer.debuggerModule ]: Set new debugger module top.u1_stm32.dbg for GDB_SERVER(port=23946,alive=true) Python > 

Interacci贸n con IDA Pro


Para simplificar las pruebas, utilizamos el firmware de Rhino como un archivo ELF (la metainformaci贸n se guarda all铆) como el archivo fuente para el an谩lisis en IDA.


Tambi茅n puede usar el firmware principal sin metainformaci贸n.


Despu茅s de iniciar Kopycat en IDA Pro, en el men煤 Depurador, vaya al elemento " Cambiar depurador ... " y seleccione " Depurador de GDB remoto ". A continuaci贸n, configure la conexi贸n: Men煤 del depurador - Opciones de proceso ...


Establecer los valores:


  • Aplicaci贸n - cualquier valor
  • Nombre de host: 127.0.0.1 (o la direcci贸n IP de la m谩quina remota donde se ejecuta Kopycat)
  • Puerto: 23946

Configurar la conexi贸n al servidor GDB

Ahora el bot贸n de inicio de depuraci贸n est谩 disponible (tecla F9):



Presi贸nelo: se conecta al m贸dulo depurador en el emulador. IDA entra en modo de depuraci贸n, ventanas adicionales est谩n disponibles: informaci贸n sobre registros, sobre la pila.


Ahora podemos usar todas las caracter铆sticas est谩ndar de trabajar con el depurador:


  • ejecuci贸n paso a paso de instrucciones ( Paso a paso y Paso a paso - teclas F7 y F8, respectivamente);
  • iniciar y pausar la ejecuci贸n;
  • creando puntos de interrupci贸n tanto en c贸digo como en datos (tecla F2).

Conectarse al depurador no significa iniciar el c贸digo de firmware. La posici贸n actual para la ejecuci贸n debe ser la direcci贸n 0x08006A74 , el comienzo de la funci贸n Reset_Handler . Si se desplaza hacia abajo en la lista a continuaci贸n, puede ver la llamada a la funci贸n principal . Puede colocar el cursor en esta l铆nea (direcci贸n 0x08006ABE ) y ejecutar la operaci贸n Ejecutar hasta el cursor (tecla F4).


imagen


A continuaci贸n, puede presionar F7 para ingresar a la funci贸n principal .


Si ejecuta el comando Continuar proceso (tecla F9), la ventana "Espere" aparecer谩 con un solo bot贸n Suspender :



Cuando se presiona Suspender , la ejecuci贸n del c贸digo de firmware se suspende y puede continuar desde la misma direcci贸n en el c贸digo donde se interrumpi贸.


Si contin煤a ejecutando el c贸digo, en las terminales conectadas a los puertos COM virtuales, puede ver las siguientes l铆neas:


imagen


imagen


La presencia de la cadena "omisi贸n de estado" indica que el m贸dulo Bluetooth virtual ha cambiado al modo de recepci贸n de datos desde el puerto COM del usuario.


Ahora en el terminal Bluetooth (en la figura - COM29) puede ingresar comandos de acuerdo con el protocolo Rhino. Por ejemplo, la cadena "mur-mur" vuelve al comando "MEOW" en el terminal Bluetooth:




Emularme no completamente


Al construir un emulador, puede elegir el grado de detalle / emulaci贸n de un dispositivo. Entonces, por ejemplo, el m贸dulo Bluetooth se puede emular de diferentes maneras:


  • dispositivo completamente emulado con un conjunto completo de comandos;
  • Los comandos AT se emulan y el flujo de datos se recibe desde el puerto COM del sistema principal;
  • dispositivo virtual proporciona redirecci贸n de datos completa a un dispositivo real;
  • como un trozo simple que siempre devuelve "OK".

En la versi贸n actual del emulador, se utiliza el segundo enfoque: el m贸dulo Bluetooth virtual realiza la configuraci贸n, luego de lo cual cambia al modo "proxy" de datos desde el puerto COM del sistema principal al puerto UART del emulador.



Considere la posibilidad de instrumentaci贸n simple del c贸digo si alguna parte de la periferia no est谩 implementada. Por ejemplo, si no se crea un temporizador que controle la transferencia de datos en DMA (la verificaci贸n se realiza en la funci贸n ws2812b_wait ubicada en 0x08006840 ), el firmware siempre esperar谩 a que el indicador de ocupado ubicado en 0x200004C4 restablezca la l铆nea de datos DMA:



Podemos sortear esta situaci贸n restableciendo manualmente el indicador de ocupado inmediatamente despu茅s de configurarlo. En IDA Pro, puede crear una funci贸n de Python y llamarla en punto de interrupci贸n, y el punto de interrupci贸n debe establecerse en el c贸digo despu茅s de escribir el valor 1 en el indicador ocupado .


Controlador de punto de interrupci贸n


Primero, cree una funci贸n Python en la IDA. Men煤 Archivo - Comando de script ...


Agregue un nuevo fragmento en la lista de la izquierda, as铆gnele un nombre (por ejemplo, BPT ),
En el cuadro de texto a la derecha, ingresamos el c贸digo de funci贸n:


 def skip_dma(): print "Skipping wait ws2812..." value = Byte(0x200004C4) if value == 1: PatchDbgByte(0x200004C4, 0) return False 


Despu茅s de eso, haga clic en Ejecutar y cierre la ventana del script.


Ahora vamos al c贸digo en 0x0800688A , establezca el punto de interrupci贸n (tecla F2), 0x0800688A ( Editar punto de interrupci贸n ... men煤 contextual), no olvide establecer el tipo de script - Python:




Si el valor actual de la bandera de ocupado es 1, entonces la funci贸n skip_dma debe ejecutarse en la l铆nea de script:



Si ejecuta el firmware para su ejecuci贸n, el c贸digo del controlador de punto de interrupci贸n se puede ver en el IDA en la ventana Salida en la l铆nea Skipping wait ws2812... Ahora el firmware no esperar谩 para restablecer el indicador de ocupado .


Interacci贸n del emulador


La emulaci贸n por el bien de la emulaci贸n es poco probable que cause deleite y alegr铆a. Es mucho m谩s interesante si el emulador ayuda al investigador a ver los datos en la memoria o a establecer la interacci贸n de los flujos.


Mostramos c贸mo establecer din谩micamente la interacci贸n de las tareas RTOS. Primero, pause la ejecuci贸n del c贸digo si se est谩 ejecutando. Si cambia a la funci贸n bluetooth_task_entry en la rama de procesamiento de comandos "LED" (direcci贸n 0x080057B8 ), puede ver lo que se cre贸 primero y luego se env铆a un mensaje a la cola del sistema ledControlQueueHandle .


imagen


Debe establecer el punto de interrupci贸n para acceder a la variable ledControlQueueHandle ubicada en 0x20000624 y continuar ejecutando el c贸digo:



Como resultado, al principio se detendr谩 en la direcci贸n 0x080057CA antes de llamar a la funci贸n osMailAlloc , luego a 0x08005806 antes de llamar a la funci贸n osMailPut , luego despu茅s de un tiempo en la direcci贸n 0x08005BD4 (antes de llamar a la funci贸n osMailGet ), que pertenece a la funci贸n leds_task_entry (tarea LED), es decir hubo un cambio de tarea, y ahora el control ha recibido la tarea LED.


imagen


De una manera tan simple, puede establecer c贸mo las tareas RTOS interact煤an entre s铆.


Por supuesto, en realidad, la interacci贸n de tareas puede ser m谩s complicada, pero usar un emulador para rastrear esta interacci贸n se vuelve menos dif铆cil.


Aqu铆 puede ver un breve video del lanzamiento del emulador y la interacci贸n con IDA Pro.


Lanzamiento con Radare2


No puede ignorar una herramienta tan universal como Radare2.


Para conectarse al emulador usando r2, el comando se ver谩 as铆:


 radare2 -A -a arm -b 16 -d gdb://localhost:23946 rhino_fw42k6.elf 

Ahora el inicio ( dc ) y la ejecuci贸n de pausa (Ctrl + C) est谩n disponibles.


Desafortunadamente, en este momento en r2 hay problemas al trabajar con un servidor gdb de hardware y marcado de memoria, debido a esto, los puntos de interrupci贸n y los Pasos (el comando ds ) no funcionan. Esperamos que esto se solucione en el futuro cercano.


Lanzamiento con Eclipse


Una de las opciones para usar el emulador es depurar el firmware del dispositivo en desarrollo. Para mayor claridad, tambi茅n utilizaremos el firmware de Rhino. Puede descargar las fuentes de firmware desde aqu铆 .


Utilizaremos el Eclipse del System Workbench para la suite STM32 como IDE.


Para que el firmware compilado directamente en Eclipse se cargue en el emulador, debe agregar el par谩metro firmware=null al comando de inicio del emulador:


 bin\kopycat -g 23946 -n rhino -l user -y library -p firmware=null,tty_dbg=COM26,tty_bt=COM28 

Configuraci贸n de depuraci贸n


En Eclipse, seleccione el men煤 Ejecutar - Configuraciones de depuraci贸n ... En la ventana que se abre, en la secci贸n Depuraci贸n de hardware de GDB , debe agregar una nueva configuraci贸n y luego especificar el proyecto y la aplicaci贸n actual para la depuraci贸n en la pesta帽a "Principal":



En la pesta帽a Depurador, debe especificar el comando GDB:
${openstm32_compiler_path}\arm-none-eabi-gdb


Y tambi茅n ingrese los par谩metros para conectarse al servidor GDB (host y puerto):



Los siguientes par谩metros deben especificarse en la pesta帽a "Inicio":


  • active la casilla de verificaci贸n Cargar imagen (para que la imagen de firmware ensamblada se cargue en el emulador);
  • active la marca de verificaci贸n Cargar s铆mbolos ;
  • agregue un comando de inicio: set $pc = *0x08000004 (establezca el valor de la memoria en el registro de la PC en la direcci贸n 0x08000004 : la direcci贸n de 0x08000004 se almacena all铆).

Tenga en cuenta que si no desea descargar el archivo de firmware de Eclipse, no necesita especificar los par谩metros Cargar imagen y Ejecutar comandos .



Despu茅s de hacer clic en Depurar, puede trabajar en modo de depuraci贸n:


  • ejecuci贸n de c贸digo paso a paso
  • interacci贸n con puntos de interrupci贸n

Nota Eclipse tiene, hmm ... algunas caracter铆sticas ... y tienes que vivir con ellas. Por ejemplo, si aparece el mensaje "No hay fuente disponible para" 0x0 "" al iniciar el depurador, ejecute el comando Paso (F5)



En lugar de una conclusi贸n


La emulaci贸n de c贸digo nativo es algo muy interesante. Para un desarrollador de dispositivos, es posible depurar el firmware sin un dispositivo real. Para el investigador: la capacidad de realizar an谩lisis de c贸digo din谩mico, que no siempre es posible incluso con un dispositivo.


Queremos proporcionar a los especialistas una herramienta que sea conveniente, moderadamente simple y que no requiera mucho esfuerzo y tiempo para configurar e iniciar.


Escriba en los comentarios sobre su experiencia con el uso de emuladores de hardware. Te invitamos a una discusi贸n y estaremos encantados de responder preguntas.

Source: https://habr.com/ru/post/445798/


All Articles