修改PPID避免反调试措施

逆向工程 视窗 Python 反调试 免疫调试器
2021-07-02 13:50:07

我正在尝试调试读取父进程 Id(PPID) 的应用程序,以检查是否正在调试应用程序。它期望 PPID 是 explorer.exe 的 PID,如果不是,则退出。

为了绕过这个,我写了一个 pycommand 脚本。该脚本在 Process32NextW 和 Process32FirstW 结束时(以及在 pops 和 ret 之前)中断。下面是我正在使用的钩子:

class Process32NextWHook(LogBpHook):

def __init__(self):
    LogBpHook.__init__(self)
    return

def run(self, regs):
    imm = immlib.Debugger()

    # Get the Out_ LPPROCESSENTRY32 lppe
    PROCESSENTRY32 = regs["EBP"] + 16

    # Get the DWORD th32ParentProcessID
    target_ppid = PROCESSENTRY32 + 24

    # Get the DWORD th32ProcessID
    target_pid = imm.readMemory(PROCESSENTRY32 + 12, 4)

    # Get the debugged process id
    self_pid = imm.getDebuggedPid()

    # If the target pid matches our pid
    if int(target_pid.encode("HEX"), 16) == self_pid:
        # Set our ppid to the pid of explorer.exe
        imm.writeMemory(target_ppid, explorer_pid)
        imm.log("[*] patch_ppid patched ppid!!")

    return

但是,那

if int(target_pid.encode("HEX"), 16) == self_pid:

从来都不是真的。我的猜测是我使用了错误的偏移量,但我不知道正确的偏移量是多少。我可以简单地修补反调试措施,但这不会是一个学习经验。

谢谢。

1个回答

所以在浏览了现有的免疫脚本和 mona.py 之后,我发现您还需要解压 readMemory 返回值。工作代码:

class Process32NextWHook(LogBpHook):

def __init__(self, ppid):
    LogBpHook.__init__(self)
    self.new_ppid = ppid
    return

def run(self, regs):
    imm = immlib.Debugger()

    # Get the Out_ LPPROCESSENTRY32 lppe
    PROCESSENTRY32 = regs["EBP"] + 16

    # Get the DWORD th32ParentProcessID
    target_ppid = PROCESSENTRY32 + 28

    # Get the DWORD th32ProcessID
    target_pid = struct.unpack("<L", imm.readMemory(PROCESSENTRY32 + 12, 4))[0]

    # Get the debugged process id
    self_pid = imm.getDebuggedPid()

    # If the target pid matches our pid
    if target_pid == self_pid:
        # Set our ppid to the pid of explorer.exe
        imm.log("[*] patch_ppid patching ppid, Before: %d" % struct.unpack("<L", imm.readMemory(target_ppid, 4))[0])
        imm.writeMemory(target_ppid, self.new_ppid)
        imm.log("[*] patch_ppid Done patching, After: %d" % struct.unpack("<L", imm.readMemory(target_ppid, 4))[0])

    return

现在感觉有点愚蠢,我忘记了一些如此基本的东西。那好吧 : )