我试图在 32 位测试 Linux 系统(Lubuntu)上用 python3 编写一个简单的调试器,它应该能够捕获任意程序的所有系统调用(在本例中为:/bin/ls)。为此,我使用 ptrace 系统调用来单步执行该过程。每一步之后,我都会读取寄存器以找到指令指针eip,以从下一条指令读取 2 个字节。如果这 2 个字节是0xcd和0x80,则表示int 80是系统调用。我知道还有用于此目的的 PTRACE_SYSCALL,但我想在不使用它的情况下执行此操作。
下面我向您展示代码,它似乎有效,但 有一些奇怪的行为:
为了弄清楚这是否有效,我使用strace将其输出与我自己的系统调用进行比较。看来我的程序只显示系统调用的第一部分,第二部分就丢失了。为了向您展示我在下面发布了我的程序和 strace 的输出。有人知道这里可能出什么问题吗?
import os               # os interaction
from struct import pack # dealing with bytes (ptrace)
import ctypes           # support c data structures
""" ========================================================== """
# 32 bit reg process structrue
class UserRegsStruct(ctypes.Structure):
    _fields_ = [
        ("ebx", ctypes.c_ulong),
        ("ecx", ctypes.c_ulong),
        ("edx", ctypes.c_ulong),
        ("esi", ctypes.c_ulong),
        ("edi", ctypes.c_ulong),
        ("ebp", ctypes.c_ulong), …Run Code Online (Sandbox Code Playgroud)