Вопрос по ctypes, python – Python: kernel32.CreateProcessA () Что он делает?

3

В настоящее время я изучаю отладчики и как они останавливают процессы.

Вот мой код:

    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. I 'я на самом деле следую вдоль питона Grey Hat прямо сейчас, и яЯ преобразую этот код в Python 3, как я прочитал.

У меня вопрос, что делает kernel32.CreateProcessA, почему он возвращает false, и как я могу предотвратить его возвращение false?

Любая помощь приветствуется!

попробуйте передать строку байта:debugger.load(b"C:\\WINDOWS\\system32\\calc.exe") на питоне 3 jfs
@ J.F. Себастьян Еще раз спасибо Себастьян, но это вызывает еще одну ошибку: Ошибка типа:% d формат: требуется число, а не _ctypes.CField Как бы вы решили это? Я'Я действительно новичок в этом win32api. Я очень ценю вашу помощь, человек! Norton Penguinion
Вы также должны опубликовать ошибку из ядра. (например, выводprint("[*] Error: 0x%08x." % (kernel32.GetLastError()))) Потому что это'без этого трудно сказать, что пошло не так, поскольку ваш код выглядит нормально. Wolfer
Я не могу отблагодарить вас за вашу помощь, яизвините, если я когда-нибудь покажу глупость, однако яЯ все еще довольно новичок в этом. Спасибо за ваш вклад. Я не могЯ сделал это без тебя. Norton Penguinion
использованиеprocessinfo.dwProcessId вместоPROCESS_INFORMATION.dwProcessId (Я'мы уже ответили на ваш предыдущий вопрос), Основное назначениеctypes это разрешить вызывать функции C из чистого Python. Это подразумевает, что для успешного использования вы должны знать и C, и Python. Может быть проще выучить один язык за раз. jfs

Ваш Ответ

6   ответов
0

C: \ WINDOWS \ system32 \ calc.exe ")

эта строка должна содержать self: def load (self, path_to_exe)

если static не должен содержать self: @staticmethod def load (path_to_exe)

эта строка должна быть: print ("[*] PID:% d " % processinfo.dwProcessId)
3

Первая ошибкаload методdebugger класс определен неправильно. Скорее всего в вашем случае это должен быть статический метод:

# . . .

# 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, вы должны использовать неCreateProcessA ноCreateProcessW функция, потому что вся строка в Python 3.x находится в юникоде (в WinAPI все функции заканчиваются на 'A' принимать строки asci, оканчивается буквой 'W' принимать юникод-строки). Точнее ответ может быть, если вы напишите, какая ошибка или исключение произошло в вашем случае.

2

когда я запускаю такую программу, как вы, на win64. Но когда я изменил kernel32.CreateProcessA на kernel32.CreateProcessW, программа успешно запустилась.

0

быстрое обобщение различий между Python 2xx и 3xx : Python 2 разделил ASCII-типы str () и unicode (). Python 3имеет только строковый тип Unicode (utf-8).

WinAPI документы, CreateProcess () имеетверсия в юникоде который определяется как CreateProcessW () с теми же параметрами.

Так что если вы используете Python 2xx, используяCreateProcessA () , В случае Python 3xx, используяCreateProcessW ().

1

GetLastError Функция, чтобы узнать, что ошибка на самом деле.

ctypes.windll.kernel32.GetLastError

И я нашел этот подробный пост, объясняющий, как отлаживать и исправлять ошибку, вызванную CreateProcessA:Python CreateProcessA возвращает FALSE

1

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

Похожие вопросы