python語言編寫的DLL注入工具

2021-09-20 15:38:23 字數 2067 閱讀 9076

一、流程

1、第一步,獲取要注入程序快照;

2、第二步,在快照中比對程序名,得到程序pid;

3、第三步,用pid去開啟程序獲取到控制代碼;

4、第四步,在要注入的程序內申請一塊記憶體;

5、第五步,把要注入的dll路徑寫入程序記憶體中;

6、第六步,得到「loadlibrarya」函式的控制代碼

7、第七步,通過遠端執行緒執行注入的dll,注入成功

二、**

#-*- coding: utf-8 -*-

from ctypes import *

import psutil

import win32api

def injectdll(string=none):

page_readwrite = 0x04

process_all_access = (0x000f0000|0x00100000|0xfff)

virtual_mem = (0x1000 | 0x2000)

dll_path = 'd://softdp//pyworkspace//wechat_demo'.encode('ascii','ignore')

dll_len = len(dll_path)

print(dll_len)

kernel32 = windll.kernel32

#第一步獲取整個系統的程序快照

pids = psutil.pids()

#第二步在快照中去比對程序名

for pid in pids:

p= psutil.process(pid)

if p.name()==string:

break

print('pid:',pid)

#第三步用找到的pid去開啟程序獲取到控制代碼

h_process=kernel32.openprocess(process_all_access,false,int(pid))

if not h_process:

print('could not acquire a handle to pid')

arg_adress=kernel32.virtualallocex(h_process,none,dll_len,virtual_mem,page_readwrite )

written=c_int(0)

whhh=kernel32.writeprocessmemory(h_process,arg_adress,dll_path,dll_len,byref(written))

print('arg_address:%x'%arg_adress,whhh)

h_kernel32=win32api.getmodulehandle('kernel32.dll')

h_loadlib =win32api.getprocaddress(h_kernel32, 'loadlibrarya')

print('%x'%h_kernel32,'%x'%h_loadlib)

thread_id=c_ulong(0)

handle= kernel32.createremotethread(h_process, none,0,h_loadlib,arg_adress, 0,byref(thread_id) )

print(handle)

return h_kernel32

三、注意事項:

1、dll_path格式,且要轉成ascii。否則格式是unicode的,且dll_len長度不夠。未轉ascii需要注意其他處理;

2、kernel32.getmodulehandle()是錯的,需要為kernel32.getmodulehandlew()。但是kernel32.getprocaddress執行無法獲得控制代碼;

3、 h_process = win32api.openprocess(process_all_access, false, int(pid)) h_process=int(h_process) print('h_process:', h_process),控制代碼傳入openprocess函式中,返回為0,說明獲得控制代碼失敗,我也不知道為啥。

4、部分思路參考《python灰帽子》

DLL的編寫方法

以add 函式為例 一 建testdll 1 在標頭檔案testdll.h中 ifdef dll api else define dll api extern c declspec dllimport endif dll api int add int a,int b 2 在testdll.cpp檔...

標準C C 的DLL編寫

dll也就是動態鏈結庫,使用dll程式設計的好處大家應當都知道了吧,可是怎麼樣來作呢,今天我就來說說。首先,你要確定你要匯出那些個函式,然後你就在你要匯出的函式名前加上下面一句話 輸出函式的字首 define dll export extern c declspec dllexport dll ex...

純資源DLL的編寫

從網上看了一些教程,下面把怎樣編寫乙個純資源dll的過程和 分享下 在vc6中新建乙個win32 dll 非 mfc 專案,新建乙個資源檔案res.rc並新增到此專案中,然後點選單insert resource插入乙個位圖資源並設定屬性為 然後在選單project settings在link項中加入...