Внедрение DLL с использованием Python - PullRequest
0 голосов
/ 19 февраля 2020

В последнее время я возился с DLL-инъекциями, сначала используя C ++, но этот язык меня бесил из-за различий между wchar_t и char и способов работы ввода.

Так что я перешел к язык, который я знаю - Python.

Я сделал DLL-инжектор, кажется, он работает, но файл DLL ничего не делает ... Не то, чтобы я знал. Может кто-нибудь сказать мне, если я сделал что-то не так?

import os
from ctypes import *
import sys

import psutil

PageRWPriv = 0x04
ProcessAllAccess = 0x1F0FFF
VirtualMem = 0x3000

kernel32 = windll.kernel32
user32 = windll.user32


def __getFullPathName(fileName):
    path = os.path.abspath(fileName)
    return path


def __getProcessId(windowName, showNoAccess):
    NoNameAccesses = []
    for p in psutil.process_iter():
        try:
            if p.name() == windowName:
                return p.name()
        except psutil.AccessDenied:
            NoNameAccesses.append(p.pid)

    if showNoAccess:
        if len(NoNameAccesses) > 0:
            print("Warning: You don't have access to he following processes:")
            print(NoNameAccesses)


def injectDll(windowName, dllName, showNoAccess=False):
    processId = __getProcessId(windowName, showNoAccess)
    dllPath = __getFullPathName(dllName)
    __injectDll(processId, dllPath)


def __injectDll(processId, dllPath):
    print("\n------------------------------------------------------------------------------------")
    __part(True, "Starting Injection")
    dllPathLen = len(dllPath)

    __part(True, f"Opening a process handler for process id: {processId}")
    hProcess = kernel32.OpenProcess(ProcessAllAccess, False, processId)
    __isNone(hProcess, "Failed to open a process handler")

    __part(True, "Allocating memory for DLL path")
    allocatedMemory = kernel32.VirtualAllocEx(hProcess, 0, dllPathLen, VirtualMem, PageRWPriv)
    __isNone(allocatedMemory, "Failed to allocate memory")

    __part(True, "Writing DLL path to process")
    booleanWritten = c_int(0)
    __writtenMemory = kernel32.WriteProcessMemory(hProcess, allocatedMemory, dllPath, dllPathLen, byref(booleanWritten))
    __isNone(__writtenMemory, "Failed to write process memory")

    __part(True, "Calling additional external functions")
    handlerFunction = kernel32.GetModuleHandleA("kernel32")
    loadLibraryAFunction = kernel32.GetProcAddress(handlerFunction, "LoadLibraryA")

    __part(True, "Creating remote thread")
    threadId = c_ulong(0)
    __remoteThread = kernel32.CreateRemoteThread(hProcess, None, 0, loadLibraryAFunction, allocatedMemory, 0, byref(threadId))
    __isNone(__remoteThread, "Failed to create a remote thread")

    print("\n------------------------------------------")
    __part(False, "DLL code injected successfully")
    print("------------------------------------------")
    print("------------------------------------------------------------------------------------\n")


def __isNone(var, message):
    if var is None:
        print(f"[X] --> {message}!")
        sys.exit(-1)
    else:
        return


def __part(state, message=""):
    if state:
        if message != "":
            print(f"[V] --> {message}...")
    elif not state:
        if message != "":
            print(f"[V] --> {message}!")

Я ценю всю помощь:))

(используется только в образовательных целях)

...