1

又是我。我将继续我的 C 和 Python 之旅。

今天正好在做一个调试器。目前,这就是我所拥有的

    from ctypes import *
    from Debugdeclares import *

    kernel32 = windll.kernel32
    class debugger():
        def __init__(self):
            self.h_process = None
            self.pid = None
            self.debugger_active = False

        def load(self, path_to_exe):
            creation_flags = DEBUG_PROCESS
            startupinfo = STARTUPINFO()
            processinfo = PROCESS_INFORMATION()
            startupinfo.dwFlags = 0x1
            startupinfo.wShowWindow = 0x0
            startupinfo.cb = sizeof(startupinfo)
            if kernel32.CreateProcessA(path_to_exe,None,None,None,None,creation_flags,None,None,byref(startupinfo),byref(processinfo)):
                print("[n] Process launched")
                print("[n] Process location: %s" % (path_to_exe))
                print("[n] PID: %d" % (processinfo.dwProcessId))
                self.h_process = self.open_process(processinfo.dwProcessId)
                return processinfo.dwProcessId
            else:
                print("[n] Error: 0x%08x." % (kernel32.GetLastError()))

        def open_process(self, pid):
            h_process = kernel32.OpenProcess(PROCESS_ALL_ACCESS,pid,False)

这是错误点所在,未定义 PROCESS_ALL_ACCESS。但是,在 ctypes 库中,有一个该关键字的输入。我曾尝试使用字符串、字节字符串,但无济于事。以下是有关 OpenProcess 功能以及有关进程安全性和访问权限的一些附加信息


            return h_process

        def attach(self, pid):
            self.h_process = self.open_process(pid)
            if kernel32.DebugActiveProcess(pid) == True:
                self.debugger_active = True
                self.pid = int(pid)
                self.run()
            else:
                print("[n] Unable to Attach Process")

        def run(self):
            while self.debugger_active == True:
                self.get_debug_event()

        def get_debug_event(self):
            debug_event = DEBUG_EVENT()
            continue_status = DBG_CONTINUE
            if kernel32.WaitForDebugEvent(byref(debug_event), INFINITE):
                input("[n] Nothing to see yet...")
                self.debugger_active = False
                kernel32.ContinueDebugEvent( \
                    debug_event.dwProcessId, \
                    debug_event.dwThreadId, \
                    continue_status )
        def detach(self):
            if kernel32.DebugActiveProcessStop(self.pid):
                print("[n] Finished debugging. Exiting...")
                return True
            else:
                print("[n] There was an error")
                return False


    debugger = debugger()
    pid = debugger.load(b"C:\\WINDOWS\\system32\\calc.exe")
    debugger.attach(pid)
    debugger.detach()

所以真的,我在问:什么是错误修复?

非常感激!-诺顿

编辑:哦,是的!这是我的 Debugdeclares 脚本:

    from ctypes import *

    WORD = c_ushort
    DWORD = c_ulong
    LPBYTE = POINTER(c_ubyte)
    LPTSTR = POINTER(c_char)
    HANDLE = c_void_p

    DEBUG_PROCESS = 0x00000001
    CREATE_NEW_CONSOLE = 0x00000010

    class STARTUPINFO(Structure):
        _fields_ = [
        ("cb", DWORD),
        ("lpReserved", LPTSTR),
        ("lpDesktop", LPTSTR),
        ("lpTitle", LPTSTR),
        ("dwX", DWORD),
        ("dwY", DWORD),
        ("dwXSize", DWORD),
        ("dwYSize", DWORD),
        ("dwXCountChars", DWORD),
        ("dwYCountChars", DWORD),
        ("dwFillAttribute",DWORD),
        ("dwFlags", DWORD),
        ("wShowWindow", WORD),
        ("cbReserved2", WORD),
        ("lpReserved2", LPBYTE),
        ("hStdInput", HANDLE),
        ("hStdOutput", HANDLE),
        ("hStdError", HANDLE),
        ]
    class PROCESS_INFORMATION(Structure):
        _fields_ = [
        ("hProcess", HANDLE),
        ("hThread", HANDLE),
        ("dwProcessId", DWORD),
        ("dwThreadId", DWORD),
        ]
4

5 回答 5

4

您的错误消息确切地告诉您出了什么问题:PROCESS_ALL_ACCESS未定义,因为您尚未在任何地方定义它。我不知道“在 ctypes 库中,有一个该关键字的输入”应该是什么意思,但ctypes没有为您定义它。

事实上,Python 标准库中唯一PROCESS_ALL_ACCESS提到的地方是multiprocessing模块使用的未记录的 C 扩展:

>>> from _multiprocessing import win32
>>> win32.PROCESS_ALL_ACCESS
2035711

使用它可能是一个坏主意,因为如前所述,它是无证的。

因为PROCESS_ALL_ACCESS它是一个宏,所以没有办法通过运行时之类的东西找出它的值ctypes,所以如果你想要它,你必须为你的系统查找它是什么,并在你的代码中自己定义它。尽管注意您链接的文档中的警告并找出一组最低访问权限可能是一个更好的主意。

于 2013-03-06T01:59:46.730 回答
2

PROCESS_ALL_ACCESS = (0x000F0000L | 0x00100000L | 0xFFF)

完毕。

于 2014-09-22T06:21:32.033 回答
1
h_process = kernel32.OpenProcess(PROCESS_ALL_ACCESS,pid,False)

这应该是。

h_process = kernel32.OpenProcess(PROCESS_ALL_ACCESS, False, pid)

结帐 MSDN 参考。

http://msdn.microsoft.com/es-es/library/windows/desktop/ms684320(v=vs.85).aspx

于 2014-09-22T08:42:56.007 回答
1

可以有两种方法来定义PROCESS_ALL_ACCESS的值:

将其值定义为:

   PROCESS_ALL_ACCESS = 0x001F0FFF

或者

使用_multiprocessing库:

   from _multiprocessing import win32
   h_process = kernel32.OpenProcess(win32.PROCESS_ALL_ACCESS,False,pid)
于 2020-08-18T19:43:48.420 回答
0

对于 Gray Hat Python 书,您必须阅读第 30 页的警告。

下载 my_debugger_defines.py 并将其替换为您当前的副本。

于 2013-05-08T02:24:24.240 回答