В последнее время я возился с 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}!")
Я ценю всю помощь:))
(используется только в образовательных целях)