libvmi
https://github.com/libvmi/libvmi
Этот проект выполняет "LibVMI: Упрощенный самоанализ виртуальной машины", который звучит очень близко.
Этот проект вВ частности https://github.com/Wenzel/pyvmidbg использует libvmi и демонстрирует демонстрационное видео об отладке формы пользовательского приложения Windows внутри нее, без конфликтов памяти.
По состоянию на май 2019 года, однако, по состоянию на май 2019 года, обаиз которых можно преодолеть с помощью некоторой работы: https://github.com/Wenzel/pyvmidbg/issues/24
- Разбор памяти Linux еще не завершен
- требуется Xen
Разработчик этого проектатакже ответил на: https://stackoverflow.com/a/56369454/895245
Реализация его с этими библиотеками была бы, по моему мнению, лучшим способом достижения этой цели сегодня.
Linaro lkd-python
Во-первых, эта страница Linaro утверждает, что имеет рабочую настройку: https://wiki.linaro.org/LandingTeams/ST/GDB, которая позволяет вам выполнять обычные операции с потоками, такие как thread
, bt
и т. Д., Но она полагается на GDBвилка.Я проверю это позже.В 2016 году https://youtu.be/pqn5hIrz3A8 говорит, что реализация была на C, а не на Python-скриптах, к сожалению, что было бы лучше и избежать разветвления.Эскиз для lkd-python можно найти по адресу: https://git.linaro.org/people/lee.jones/kieran.bingham/binutils-gdb.git/log/?h=lkd-python
Встроенные GDB-скрипты ядра Linux + мой мозг
Затем я попытался увидеть, что я могсделать со встроенными в ядро скриптами Python v4.17 + некоторое ручное вмешательство в качестве прототипа, но пока не совсем.
Я тестировал с помощью этой высокоавтоматизированной установки QEMU + Buildroot.
Сначала выполните процедуру, описанную мной: Как отладить ядро Linux с помощью GDB и QEMU? , чтобы заставить работать GDB.
Затем, как описаноat: Как отлаживать модули ядра Linux с помощью QEMU? запустить GDB с:
gdb -ex add-auto-load-safe-path /full/path/to/linux/kernel
Это загружает скрипты GDB Python внутри дерева из scripts/gdb
.
Один из этих сценариев предоставляет:
lx-ps
, в котором перечислены все потоки в формате:
0xffff88000ed08000 1 init
0xffff88000ed08ac0 2 kthreadd
Первое поле - это адрес структуры task_struct
, поэтому мы можем видеть всеструктура с:
p ((struct task_struct)*0xffff88000ed08000
, что теоретически должно позволить нам получить любую информацию о процессе, которую мы хотимess.
Теперь я хотел найти ПК.Для ARM я видел: Найти программный счетчик процесса в ядре , и я попытался:
task_pt_regs((struct thread_info *)((struct task_struct)*0xffffffc00e8f8000))->uregs[ARM_pc]
, но task_pt_regs
- это #define
, а GDB не может видеть определения без -ggdb3
: Как вывести постоянную # в GDB? , которая явно не установлена?