【发布时间】:2019-12-16 21:56:57
【问题描述】:
我目前正在了解更多关于ctypes 及其功能的信息,我正在尝试通过PID(process ID) 将WriteProcessMemory 的脚本创建到记事本中。但是,当我尝试执行我的脚本时,记事本会立即崩溃。我正在关注this 的教程,我认为它与“Gray Hat for Hacking Python”一书相同。正确的,执行的shell代码应该是创建一个消息框。
这是我的代码。
import os
import colorama
from colorama import Fore, Back, Style
import win32com.client
from ctypes import *
from ctypes import wintypes
import ctypes
from ctypes.wintypes import BOOL
from ctypes.wintypes import DWORD
from ctypes.wintypes import HANDLE
from ctypes.wintypes import LPVOID
from ctypes.wintypes import LPCVOID
from ctypes.wintypes import LPCWSTR
colorama.init()
kernel32 = ctypes.WinDLL('Kernel32', use_last_error=True)
LPCSTR = LPCTSTR = ctypes.c_char_p
LPDWORD = PDWORD = ctypes.POINTER(DWORD)
class _SECURITY_ATTRIBUTES(ctypes.Structure):
_fields_ = [('nLength', DWORD),
('lpSecurityDescriptor', LPVOID),
('bInheritHandle', BOOL),]
SECURITY_ATTRIBUTES = _SECURITY_ATTRIBUTES
LPSECURITY_ATTRIBUTES = ctypes.POINTER(_SECURITY_ATTRIBUTES)
LPTHREAD_START_ROUTINE = LPVOID
OpenProcess = kernel32.OpenProcess
OpenProcess.restype = HANDLE
OpenProcess.argtypes = (DWORD, BOOL, DWORD)
VirtualAllocEx = kernel32.VirtualAllocEx
VirtualAllocEx.restype = LPVOID
VirtualAllocEx.argtypes = (HANDLE, LPVOID, ctypes.c_size_t, DWORD, DWORD)
ReadProcessMemory = kernel32.ReadProcessMemory
ReadProcessMemory.restype = BOOL
ReadProcessMemory.argtypes = (HANDLE, LPCVOID, LPVOID, DWORD, DWORD)
WriteProcessMemory = kernel32.WriteProcessMemory
WriteProcessMemory.restype = BOOL
WriteProcessMemory.argtypes = (HANDLE, LPVOID, LPCVOID, DWORD, ctypes.c_int)
CreateRemoteThread = kernel32.CreateRemoteThread
CreateRemoteThread.restype = HANDLE
CreateRemoteThread.argtypes = (HANDLE, LPSECURITY_ATTRIBUTES, ctypes.c_size_t , LPTHREAD_START_ROUTINE, LPVOID, DWORD, ctypes.c_ulong)
GetLastError = kernel32.GetLastError
GetLastError.restype = DWORD
GetLastError.argtypes = ()
GetModuleHandle = kernel32.GetModuleHandleA
GetModuleHandle.restype = HANDLE
GetModuleHandle.argtypes = (LPCWSTR,)
GetProcAddress = kernel32.GetProcAddress
GetProcAddress.restype = LPVOID
GetProcAddress.argtypes = (HANDLE, LPCWSTR)
# https://www.aldeid.com/wiki/Process-Security-and-Access-Rights
PROCESS_VM_READ = 0x0010 # Required to read memory in a process using ReadProcessMemory.
PROCESS_VM_WRITE = 0x0020
PROCESS_VM_OPERATION = 0x0008 # Required to write to memory in a process using WriteProcessMemory.
PROCESS_QUERY_INFORMATION = 0x0400
PROCESS_CREATE_THREAD = 0x0002
PROCESS_ALL_ACCESS = (PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_QUERY_INFORMATION | PROCESS_CREATE_THREAD) #0x1F0FFF
print(Fore.RED + 'Retrieving PIDs...')
WMI= win32com.client.GetObject('winmgmts:')
processes = WMI.ExecQuery('SELECT * from win32_process')
print(Fore.GREEN)
process_list = [i.Properties_('ProcessId').Value for i in processes] # list of available processes
for process in processes:
print(process.Properties_('ProcessId').Value , " - " , process.Properties_('Name').Value)
PID = int(input('Enter the PID of the process '))
# https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocess
process_handle = kernel32.OpenProcess(PROCESS_ALL_ACCESS, False, PID) # creating the handle
if not process_handle:
print ("Couldn't acquire a handle to PID: %s" % PID)
shellcode = "C:\\Users\\User\\Desktop\\py\\injector\\hello-world-x64.dll"
# https://docs.microsoft.com/en-us/windows/win32/api/memoryapi/nf-memoryapi-virtualallocex
memory_alloc = kernel32.VirtualAllocEx(process_handle,0, len(shellcode), (0x1000 | 0x2000), 0x40) # allocating memory to the process
write = kernel32.WriteProcessMemory(process_handle, memory_alloc, shellcode, len(shellcode), 0)
ModuleHandle = kernel32.GetModuleHandleA('kernel32.dll')
LoadLibraryA = kernel32.GetProcAddress(ModuleHandle,"LoadLibraryA")
if not kernel32.CreateRemoteThread(process_handle, None, 0, LoadLibraryA, memory_alloc, 0, 0):
print("Failed injection..")
print("ModuleHandle : ", ModuleHandle)
print("LoadLibrary : ", LoadLibraryA)
print("process handle : ", process_handle)
print("VirtualAllocEx : ",memory_alloc)
print("WriteProcessMemory : ",write)
print(ctypes.GetLastError())
我已经尝试打印返回值,显然给我错误的是ModuleHandle 和LoadLibrary,它返回的是 None 值。但据微软称:
如果函数成功,返回值非零。 如果函数失败,则返回值为 0(零)。要获取扩展错误信息,请调用 GetLastError。如果请求的写入操作进入进程中不可访问的区域,则该函数将失败。
我还尝试了返回 6 的 GetLastError() 方法,在谷歌搜索时,它指的是“无效的处理程序”。
如果有帮助,我的操作系统、记事本、VScode(my ide)、python(3.6.8) 都是 64 位的。 对于混乱的代码,我深表歉意,请随时纠正我,因为我是这方面的初学者。
编辑
这是我打印输出的图像。我也试过LoadLibraryW 和GetModuleHandleW 但也没用,我的记事本崩溃了。我使用的 dll 是一个通用 DLL 文件,它只会生成一个消息框,上面写着“Hello World”
【问题讨论】:
标签: python windows kernel ctypes pywin32