Python: kernel32.CreateProcessA() 做了什么?

5 投票
6 回答
5394 浏览
提问于 2025-04-17 17:40

我现在正在学习调试器以及它们是如何停止进程的。

这是我的代码:

    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),
        ]


    kernel32 = windll.kernel32
    class debugger():
        def __init__(self):
            pass

        def load(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("[*] Process launched")
                print("[*] PID: %d" % (PROCESS_INFORMATION.dwProcessId))
            else:
                print("[*] Error: 0x%08x." % (kernel32.GetLastError()))

    debugger.load("C:\\WINDOWS\\system32\\calc.exe")

每次我运行它时,都会出现错误。 :( 我发现出现这个错误的原因是因为 kernel32.CreateProcessA 返回了 false。我现在正在跟着《灰帽Python》这本书学习,并且在阅读时把这段代码转换成 Python 3。

我的问题是,kernel32.CreateProcessA 是做什么的,为什么它会返回 false,以及我该如何防止它返回 false?

任何帮助都将非常感谢!

6 个回答

1

把你前面两个参数的位置调换一下,变成这样:

kernel32.CreateProcessA(c_char_p(0),c_char_p(path_to_exe),0,0,0,creation_flags,0,0,bytef(startupinfo),byref(processinfo))
4

我在win64上运行一个程序时遇到了问题。但是当我把kernel32.CreateProcessA改成kernel32.CreateProcessW后,程序就成功运行了。

5

你的代码里有几个错误:

第一个错误是 debugger 类里的 load 方法定义得不对。很可能在你的情况下,它应该是一个静态方法:

# . . .

# This decorator required to make method static
@staticmethod
def load(path_to_exe):
    creation_flags = DEBUG_PROCESS
    startupinfo = STARTUPINFO()
    processinfo = PROCESS_INFORMATION()
    startupinfo.dwFlags = 0x1

# . . .

第二个错误是在 print 语句中,如果进程没有成功创建的话:

if kernel32.CreateProcessA(path_to_exe,None,None,None,None,
                           creation_flags,None,None,
                           byref(startupinfo),byref(processinfo)):
    print("[*] Process launched")

    # ERROR AT THE LINE BELOW
    # Your variant: print("[*] PID: %d" % (PROCESS_INFORMATION.dwProcessId))
    # But it should be the structure itself not it "type"
    print("[*] PID: %d" % (processinfo.dwProcessId))  
else:
    print("[*] Error: 0x%08x." % (kernel32.GetLastError()))

在我的情况下,它是可以工作的(Windows XP)。如果你的进程实际上没有启动,而控制台上显示了类似这样的信息:

[*] Error: 0x00000002

那么如果你使用的是 Python 3.x,你应该用 CreateProcessW 函数,而不是 CreateProcessA。因为在 Python 3.x 中,所有字符串都是 Unicode 格式的(在 Windows API 中,所有以 'A' 结尾的函数接受 ASCII 字符串,而以 'W' 结尾的函数接受 Unicode 字符串)。如果你能告诉我你遇到的具体错误或异常,我可以给出更准确的回答。

撰写回答