Получить машинный код процесса по PID без подключения отладчика

Я хочу получить машинный код запущенного процесса по его PID для анализа вредоносных инструкций, используя эвристические методы анализа данных.

Все, что мне нужно знать, это список текущих машинных инструкций и значения регистров (EIP, EAX, EBX...).

Я могу использовать gdb для достижения этой цели вывод gdb, но возникает несколько проблем:

Есть ли способ получить эту информацию по PID в Linux? Или может Виндовс?


person Дмитрий Сулохин    schedule 10.11.2017    source источник


Ответы (1)


вы можете взглянуть на gcore:

$ gcore 
usage:  gcore [-o filename] pid

поэтому вы можете сбросить ядро ​​процесса, используя его pid:

$ gcore 792
warning: Could not load vsyscall page because no executable was specified
0x00007f5f73998410 in ?? ()
Saved corefile core.792

а затем откройте его в gdb:

$ gdb -c core.792 
GNU gdb (GDB) Fedora 8.0.1-30.fc26
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
[...]
[New LWP 792]
Missing separate debuginfo for the main executable file
Try: dnf --enablerepo='*debug*' install /usr/lib/debug/.build-id/09/b9d38bb6291b6282de4a2692e45448828d50da
Core was generated by `./a.out'.
#0  0x00007f5f73998410 in ?? ()
(gdb) info registers 
rax            0xfffffffffffffe00       -512
rbx            0x0      0
rcx            0x7f5f73998410   140047938061328
rdx            0x1      1
rsi            0x7ffd30683d73   140725415591283
rdi            0x3      3
rbp            0x7ffd30683d90   0x7ffd30683d90
rsp            0x7ffd30683d68   0x7ffd30683d68
r8             0x1d     29
r9             0x0      0
r10            0x3      3
r11            0x246    582
r12            0x4006d0 4196048
r13            0x7ffd30683e70   140725415591536
r14            0x0      0
r15            0x0      0
rip            0x7f5f73998410   0x7f5f73998410
eflags         0x246    [ PF ZF IF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0

или даже используя бинарное изображение из /proc для получения некоторых символов:

gdb -c core.792 /proc/792/exe 

Возможно, вы знаете, что вы можете передавать скрипты в gdb, это может упростить взаимодействие с ним из вашего двоичного файла (man gdb для более подробной информации).

если вы не хотите использовать gdb напрямую, вы можете попробовать использовать ptrace() напрямую, но это наверняка больше работы.

Что касается методов защиты от отладки, ну... они работают, и, насколько я знаю, нет простого способа справиться с ними напрямую, каждый из них можно обойти вручную (исправление двоичного кода, дизассемблирование с невыровненных адресов вручную, установив затем в objdump , и т.д...)

Я не эксперт в этой области, надеюсь, это вам немного поможет.

person OznOg    schedule 10.11.2017