python 언어로 작성된 DLL 주입 도구
1. 첫 번째 단계는 프로세스를 주입할 스냅샷을 획득한다.
2. 두 번째 단계는 스냅샷에서 프로세스 이름을 비교하여 프로세스 PID를 얻는다.
3. 세 번째 단계에서pid로 프로세스를 열어 핸들을 얻기;
4. 네 번째 단계는 주입할 프로세스에 메모리를 신청한다.
5, 다섯 번째 단계에서 주입할 dll 경로를 프로세스 메모리에 쓰기;
6, 6단계, "LoadLibraryA"함수의 핸들 얻기
7, 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//WechatDB.dll'.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
3. 주의사항:
1、dll_path 형식을 ascii로 변환합니다.그렇지 않으면 형식이 유니코드이고 dll렌 길이가 부족해요.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. 부분적인 사고방식은 을 참고한다.
5.전재는 출처를 밝혀 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.