
El caso de uso de Qiling, blog y trabajo relacionado
Qiling es un framework avanzado de emulación binaria, con las siguientes características:
- Emula múltiples plataformas: Windows, macOS, Linux, Android, BSD, UEFI, DOS, MBR.
- Emula múltiples arquitecturas: 8086, X86, X86_64, ARM, ARM64, MIPS, RISC-V, PowerPC.
- Soporta múltiples formatos de archivo: PE, Mach-O, ELF, COM, MBR.
- Soporta controladores de Windows (.sys), módulos del kernel de Linux (.ko) y kernel de macOS (.kext) a través de Demigod.
- Emula y aísla código en un entorno controlado.
- Proporciona un entorno de pruebas completamente configurable.
- Proporciona API detalladas a nivel de memoria, registros, sistema operativo y sistema de archivos.
- Instrumentación de grano fino: permite hooks en varios niveles (instrucción/bloque básico/acceso a memoria/excepción/syscall/IO/etc.).
- Proporciona API a nivel de máquina virtual, como guardar y restaurar el estado de ejecución actual.
- Soporta capacidades de depuración entre arquitecturas y plataformas.
- Depurador integrado con capacidad de depuración inversa.
- Permite parches dinámicos en caliente sobre el código en ejecución, incluyendo librerías cargadas.
- Framework real en Python, facilitando la creación de herramientas personalizadas de análisis de seguridad.
Qiling también ha estado presente en varias conferencias internacionales.
2022:
2021:
2020:
2019:
Qiling está respaldado por Unicorn Engine.
Visita nuestro sitio web para más información.
Licencia
Este programa es software libre; puedes redistribuirlo y/o modificarlo
bajo los términos de la GNU General Public License publicada por
la Free Software Foundation; ya sea la versión 2 de la Licencia, o
(a tu elección) cualquier versión posterior.
Qiling vs. otros Emuladores
Hay muchos emuladores de código abierto, pero los dos proyectos más cercanos a Qiling
son Unicorn y QEMU user mode.
Esta sección explica las principales diferencias de Qiling con respecto a ellos.
Qiling vs. Unicorn engine
Construido sobre Unicorn, pero Qiling y Unicorn son dos animales diferentes.
- Unicorn es solo un emulador de CPU, por lo que se centra en emular instrucciones de CPU,
y puede entender la memoria del emulador.
Más allá de eso, Unicorn no conoce conceptos de alto nivel, como librerías
dinámicas, llamadas al sistema, manejo de E/S o formatos ejecutables como PE, Mach-O
o ELF. Como resultado, Unicorn solo puede emular instrucciones de máquina en bruto,
sin contexto de Sistema Operativo (SO).
- Qiling está diseñado como un framework de nivel superior, que aprovecha Unicorn para
emular instrucciones de CPU, pero puede entender el SO: tiene cargadores de formatos
ejecutables (para PE, Mach-O y ELF actualmente), enlazadores dinámicos (para
cargar y reubicar librerías compartidas), manejadores de syscall y E/S. Por esta razón,
Qiling puede ejecutar binarios ejecutables sin necesidad de su SO nativo.
Qiling vs. QEMU user mode
QEMU user mode hace algo similar a nuestro emulador, es decir, emular binarios
ejecutables completos de manera entre arquitecturas.
Sin embargo, Qiling ofrece algunas diferencias importantes frente a QEMU user mode:
- Qiling es un framework de análisis real,
que permite construir tus propias herramientas de análisis dinámico sobre él (en Python).
Mientras tanto, QEMU es solo una herramienta, no un framework.
- Qiling puede realizar instrumentación dinámica, e incluso puede parchear código en
caliente en tiempo de ejecución. QEMU no hace ninguna de las dos.
- No solo funciona entre arquitecturas, Qiling también es multiplataforma.
Por ejemplo, puedes ejecutar un archivo ELF de Linux sobre Windows.
En contraste, QEMU user mode solo ejecuta binarios del mismo SO, como ELF de Linux
en Linux, debido a la forma en que reenvía syscalls del código emulado al
SO nativo.
- Qiling soporta más plataformas, incluyendo Windows, macOS, Linux y BSD. QEMU
user mode solo puede manejar Linux y BSD.
Instalación
Consulta la guía de instalación para saber cómo instalar Qiling Framework.
Ejemplos
El siguiente ejemplo muestra cómo usar Qiling framework de la manera más
directa para emular un ejecutable de Windows.
from qiling import Qiling
if __name__ == "__main__":
# initialize Qiling instance, specifying the executable to emulate and the emulated system root.
# note that the current working directory is assumed to be Qiling home
ql = Qiling([r'examples/rootfs/x86_windows/bin/x86_hello.exe'], r'examples/rootfs/x86_windows')
# start emulation
ql.run()
- El siguiente ejemplo muestra cómo un crackme de Windows puede ser parcheado dinámicamente
para que siempre muestre el diálogo de "Felicidades".
from qiling import Qiling
def force_call_dialog_func(ql: Qiling):
# get DialogFunc address from current stack frame
lpDialogFunc = ql.stack_read(-8)
# setup stack memory for DialogFunc
ql.stack_push(0)
ql.stack_push(1001) # IDS_APPNAME
ql.stack_push(0x111) # WM_COMMAND
ql.stack_push(0)
# push return address
ql.stack_push(0x0401018)
# resume emulation from DialogFunc address
ql.arch.regs.eip = lpDialogFunc