Python3实现DLL注入问题解决

Python3实现DLL注入问题解决

一. VirtualAllocEx申请空间失败

需要提权。

二. CreateProcessA失败

Python 3.x的所有字符串以Unicode存在,所以可以改用CreateProcessW来调用。或者使用CreateProcessA时,将字符串转为Ascii。其他具有A和W区别的方法同理。

三. GetProcAddress获取地址失败

GetProcAddress的没办法使用宽字符,都得用Ascii那一套。

四. 方法调用时最好显示给出参数的类型。

五. 演示一个从kernel32获取LoadLibraryA的方法

1. 宽字符方式

self.kernel32.GetModuleHandleW.restype = wintypes.HANDLE
self.kernel32.GetModuleHandleW.argtypes = [wintypes.LPCWSTR]
h_kernel1 = self.kernel32.GetModuleHandleW("kernel32.dll")
print("GetModuleHandleW:", h_kernel1)
self.kernel32.GetProcAddress.restype = wintypes.LPVOID
self.kernel32.GetProcAddress.argtypes = [wintypes.HANDLE, wintypes.LPCSTR]
LoadLibraryA = self.kernel32.GetProcAddress(wintypes.HANDLE(h_kernel1),"LoadLibraryA".encode('ascii', 'ignore'))
print("GetProcAddress:", LoadLibraryA)

2. ascii

self.kernel32.GetModuleHandleA.restype = wintypes.HANDLE
self.kernel32.GetModuleHandleA.argtypes = [wintypes.LPCTSTR]
h_kernel1 = self.kernel32.GetModuleHandleA("kernel32.dll")
print("GetModuleHandleA:", h_kernel1)
self.kernel32.GetProcAddress.restype = wintypes.LPVOID
self.kernel32.GetProcAddress.argtypes = [wintypes.HANDLE, wintypes.LPCSTR]
LoadLibraryA = self.kernel32.GetProcAddress(wintypes.HANDLE(h_kernel1),"LoadLibraryA".encode('ascii', 'ignore'))
print("GetProcAddress:", LoadLibraryA)

其中的wintypes.LPCTSTR= ctypes.POINTER(ctypes.c_char)。可以自己定义一下。

 

完整注入代码:

#-*- coding: utf-8 -*-
import ctypes
import ctypes.wintypes as wintypes


wintypes.LPTSTR = ctypes.POINTER(ctypes.c_char)
wintypes.LPBYTE = ctypes.POINTER(ctypes.c_ubyte)
wintypes.HANDLE = ctypes.c_void_p
wintypes.LPDWORD = ctypes.POINTER(wintypes.DWORD)
wintypes.LPCTSTR = ctypes.POINTER(ctypes.c_char)
wintypes.PHANDLE = ctypes.POINTER(wintypes.HANDLE)


class __LUID(ctypes.Structure):
    _fields_ = [("LowPart", wintypes.DWORD),
                ("HighPart", wintypes.LONG), ]

wintypes.LUID=__LUID
wintypes.PLUID = ctypes.POINTER(wintypes.LUID)


class __LUID_AND_ATTRIBUTES(ctypes.Structure):
    _fields_ = [("Luid",        wintypes.LUID),
        ("Attributes",  wintypes.DWORD),]
wintypes.LUID_AND_ATTRIBUTES = __LUID_AND_ATTRIBUTES
wintypes.PLUID_AND_ATTRIBUTES = ctypes.POINTER(wintypes.LUID_AND_ATTRIBUTES)


class __TOKEN_PRIVILEGES(ctypes.Structure):
    _fields_ = [("PrivilegeCount",  wintypes.DWORD),
        ("Privileges",      wintypes.LUID_AND_ATTRIBUTES),]
wintypes.TOKEN_PRIVILEGES = __TOKEN_PRIVILEGES
wintypes.PTOKEN_PRIVILEGES = ctypes.POINTER(wintypes.TOKEN_PRIVILEGES)


class __STARTUPINFO(ctypes.Structure):
    _fields_ = [("cb",            wintypes.DWORD),
                ("lpReserved",    wintypes.LPTSTR),
                ("lpDesktop",     wintypes.LPTSTR),
                ("lpTitle",       wintypes.LPTSTR),
                ("dwX",           wintypes.DWORD),
                ("dwY",           wintypes.DWORD),
                ("dwXSize",       wintypes.DWORD),
                ("dwYSize",       wintypes.DWORD),
                ("dwXCountChars", wintypes.DWORD),
                ("dwYCountChars", wintypes.DWORD),
                ("dwFillAttribute",wintypes.DWORD),
                ("dwFlags",       wintypes.DWORD),
                ("wShowWindow",   wintypes.WORD),
                ("cbReserved2",   wintypes.WORD),
                ("lpReserved2",   wintypes.LPBYTE),
                ("hStdInput",     wintypes.HANDLE),
                ("hStdOutput",    wintypes.HANDLE),
                ("hStdError",     wintypes.HANDLE),]
wintypes.STARTUPINFO = __STARTUPINFO
wintypes.LPSTARTUPINFO = ctypes.POINTER(wintypes.STARTUPINFO)


class __STARTUP
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中进行DLL注入的方法有多种。一种常见的方法是使用ctypes库来实现。ctypes库提供了一种与C语言兼容的数据类型和函数调用方式,可以方便地与动态链接库进行交互。通过ctypes库,我们可以加载DLL文件并调用其中的函数。 在DLL注入过程中,可以使用以下步骤来进行操作: 1. 使用ctypes库加载所需的DLL文件。可以使用`ctypes.WinDLL`来加载Windows平台上的DLL文件。 2. 根据DLL文件中的函数原型,使用`ctypes`库定义与之匹配的函数接口。可以使用`ctypes.WINFUNCTYPE`来定义函数接口。 3. 使用定义的函数接口,调用DLL文件中的函数。 示例代码如下: ``` import ctypes # 加载DLL文件 my_dll = ctypes.WinDLL("my_dll.dll") # 定义函数原型 my_function = my_dll.my_function my_function.restype = ctypes.c_void_p my_function.argtypes = [ctypes.c_int, ctypes.c_char_p] # 调用DLL函数 result = my_function(10, b"hello") ``` 在上述示例代码中,我们首先使用`ctypes.WinDLL`加载了名为`my_dll.dll`的DLL文件。然后,我们使用`ctypes.WINFUNCTYPE`定义了与DLL文件中的`my_function`函数匹配的函数接口。最后,我们调用了`my_function`函数,并传递了参数10和字符串"hello"。 需要注意的是,DLL注入是一种高级技术,需要谨慎处理。在进行DLL注入时,请确保你有合法的使用权,并遵守相关法律和规定。另外,DLL注入也可能存在一些风险和安全问题,因此在实际应用中请谨慎使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Python3实现DLL注入问题解决](https://blog.csdn.net/wuhaibin12/article/details/115806207)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [python语言编写的DLL注入工具](https://blog.csdn.net/storm_spirit/article/details/89765659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值