通过PID获取proccess的机器代码,无需附加调试器

时间:2017-11-10 19:51:59

标签: linux debugging disassembly machine-code

我想通过他的PID获取运行过程的机器代码,用于分析恶意指令,使用启发式数据分析方法。

我需要知道的是当前机器指令列表和寄存器值(EIP,EAX,EBX ......)。

我可以使用gdb来达到这个目标gdb output,但是会遇到几个问题:

有什么方法可以通过PID在Linux中获取此信息?或者也许是Windows?

1 个答案:

答案 0 :(得分:0)

你可以看一下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等...)

我不是该域名的专家,我希望这会对您有所帮助。