动态库注入--远程线程
Posted 半程烟沙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态库注入--远程线程相关的知识,希望对你有一定的参考价值。
- 现在一般很少有人使用远程线程这种方法来注入动态库或者ShellCode,一般就用来作为一种注入方法来学习。
- 实现流程
a根据进程ID得到进程句柄。
b在kernel32.dll中得到LoadLibrary()函数的地址。
c在目标进程中申请内存,并写入动态库的地址(作为LoadLibrary函数的参数)。
d调用CreateRemoteThread()创建远程线程。
CreateRemoteThread(ProcessHandle,None,0,LoadlibraryAddr,DLL_PATH_ADDR,0,byref(thread_id))
- 代码实现
# -*- coding:utf-8 -*- from ctypes import * import ctypes import os import psutil import re import sys def InjectDll(pid,dll_Path): PAGE_RW_PRIV = 0x04 PROCESS_ALL_ACCESS = (0x000F0000 | 0x00100000 | 0xFFF) VIRTUAL_MEM = (0x1000 | 0x2000) kernel32 = windll.kernel32 print ("[+] Starting DLL Injector") dllLength = len(dll_path) print("[+] Getting Process Handle From ProcessId %d" ,pid) #打开进程的进程句柄 ProcessHandle = kernel32.OpenProcess(PROCESS_ALL_ACCESS,False,pid) if ProcessHandle == None: print("Unable to Get Process Handle") sys.exit(0) print("In TargetProcess Alloc Buffer Space") #在对方虚拟内存地址中申请内存 ,存放DLL的地址 DLL_PATH_ADDR = kernel32.VirtualAllocEX(ProcessHandle, 0, dllLength, VIRTUAL_MEM, PAGE_RW_PRIV) bool_Write = c_int(0) print("Writing Dll Path to Target Process Space") #将动态库的地址写入目标进程中 kernel32.WriteProcessMemory(ProcessHandle, DLL_PATH_ADDR, dll_Path, dllLength, byref(bool_Write)) #得kernel32.dll模块的地址 print("\t[+] Resolving Call Spacific function & librarise") kernel32DllHandle = kernel32.GetModuleHandleA("kernel32.dll") #得LoadLibrary函数地址 LoadlibraryAddr = kernel32.GetProcAddress(kernel32DllHandle) thread_id = c_ulong(0) ThreadHandle = kernel32.CreateRemoteThread(ProcessHandle, None, 0, LoadlibraryAddr, DLL_PATH_ADDR, 0,byref(thread_id)) if not ThreadHandle: print("Injection Failed exiting ") sys.exit(0) else: print("Remote Thread Id %d" ,thread_id) if __name__ == "__main__": pid = input("输入进程ID") target = [] i = 0 # 判断计算机版本 if str(ctypes.sizeof(ctypes.c_voidp)) == ‘4‘: print("Runing on a X86 machine seleteing DLL") dll_path = os.path.abspath("vminjector32.dll") else: print("Running on a x64 machine selecting DLL") dll_path = os.path.abspath("vminjector64.dll") print(‘Configured DLL path to %s \n‘ % dll_path) InjectDll(pid,dll_path)
以上是关于动态库注入--远程线程的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 注入工具收尾操作 | 关闭注入的动态库 | 恢复寄存器 | 脱离远程调试附着 )
Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )(代
Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )
Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )
Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )(代码片