我想通过他的PID获取运行过程的机器代码,用于分析恶意指令,使用启发式数据分析方法。
我需要知道的是当前机器指令列表和寄存器值(EIP,EAX,EBX ......)。
我可以使用gdb
来达到这个目标gdb output,但是会遇到几个问题:
有什么方法可以通过PID在Linux中获取此信息?或者也许是Windows?
答案 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等...)
我不是该域名的专家,我希望这会对您有所帮助。