4

私は現在、デバッガーと、デバッガーがプロセスを停止する方法について学んでいます。

これが私のコードです:

    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 3に変換していますそれ。

私の質問は、kernel32.CreateProcessA が何をしているのか、なぜ false を返すのか、false を返さないようにするにはどうすればよいのかということです。

どんな助けでも大歓迎です!

4

6 に答える 6

1

最初の 2 つのパラメーターを切り替えて、次のようにします。

kernel32.CreateProcessA(c_char_p(0),c_char_p(path_to_exe),0,0,0,creation_flags,0,0,bytef(startupinfo),byref(processinfo))
于 2013-12-07T23:52:50.013 に答える
0
  1. この行は括弧でなければなりません: debugger().load("C:\WINDOWS\system32\calc.exe")

  2. この行には self を含める必要があります: def load(self,path_to_exe)

  3. static に self を含めてはならない場合: @staticmethod def load(path_to_exe)

  4. この行は次のようになります: print("[*] PID: %d" % processinfo.dwProcessId)
于 2016-10-18T19:01:54.893 に答える