python 언어로 작성된 DLL 주입 도구

2229 단어
절차
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.전재는 출처를 밝혀 주십시오.

좋은 웹페이지 즐겨찾기