动态库注入--远程线程

  • 现在一般很少有人使用远程线程这种方法来注入动态库或者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)
时间: 2024-10-03 23:00:41

动态库注入--远程线程的相关文章

PE基础6_远程线程注入-HOOK(消息-InLine-IAT)

注入 概述 DLL注入的初始动力源自于程序员对其他第三方应用程序进行功能扩展的愿望 注入方式有 注册表注入 ComRes注入 APC注入 消息钩子注入 远程线程注入 依赖可信进程注入 劫持进程创建注入 输入法注入 远程线程注入 //要加载的dll路径 WCHAR szDllPath[] = L"C:\\Users\\42140\\source\\repos\\34windows原理PE \\Debug\\16InjectDll.dll"; ? int main() { //1.要注入,

C++进程注入(通过远程线程注入进程)

需要本文代码请直接跳到文章最底部下载 注入进程的方法有很多,本文主要介绍通过远程线程来注入进程的方法: 我们知道,每个进程都有4GB的地址空间,windows可用的大小大概为1.5GB左右,远程线程注入的方法主要是,打开一个线程以后,将要注入的动态库的地址写入这个地址空间,然后调用开启远程线程的函数,来执行LoadLibraryA或者LoadLibraryW(其实不存在LoadLibrary这个函数,他只是一个宏,如果是UNICODE环境的话会调用LoadLibraryW,否则就是LoadLib

奇技淫巧之调试被远程线程注入的DLL

远程线程注入, 这东西大家都懂的, 一般都被大家用来干些小小的坏事情,比如API Hook~~将DLL注入到其它进程并不是难事,问题是这个被注入的DLL不太好调试,调试DLL本来就是个比较头疼的问题,更何况是这种运行在其它进程空间的DLL, 被注入DLL的程序,不崩溃还好,崩溃了,要定位崩溃点,真是够麻烦的. 这几天,无意中发现了一个可以调试这种DLL的方法. 首先,需要准备两样东西: 1.微软的Detours库, 下载地址戳这里: 下载链接 2.打开Detours安装目录下的samples\s

远程线程注入遇到的问题

前因: 远程线程注入dll的时候debug版的dll注入不成功,release版的dll成功,经过在网上查阅,最后在windows黑客编程技术详解里找到了解决办法 解决办法: VC项目属性→配置属性→C/C++→代码生成→运行时库 可以采用的方式有:多线程(/MT).多线程调试(/MTd).多线程DLL(/MD).多线程调试DLL(/MDd) Debug模式选择"MTD",Release选择"MT"(我之前是MD也成功了) MFC的使用”选项中设置“在静态库中使用M

Dll注入:X86/X64 远程线程CreateRemoteThread 注入

远线程注入原理是利用Windows 系统中CreateRemoteThread()这个API,其中第4个参数是准备运行的线程,我们可以将LoadLibrary()填入其中,这样就可以执行远程进程中的LoadLibrary()函数,进而将我们自己准备的DLL加载到远程进程空间中执行. 函数原型: HANDLE WINAPI CreateRemoteThread( _In_ HANDLE hProcess, //远程线程的句柄 _In_opt_ LPSECURITY_ATTRIBUTES lpThr

远程线程注入方法CreateRemoteThread

最近在整理学习Windows注入方面的知识,这个远程注入前面早写过,现在看看人家博客的理解整理,整理, 需要源码的可以到我的github上下载. 链接是  https://github.com/Arsense/WindowsCode 首先先来说说什么是注入,为什么要注入 0x00 Baise 注入就是把自己的Dll注入到人家的代码中,被注入的DLL拥有目标进程内存的访问权限,所以我们可以通过该 向某个进程注入DLL时的方法主要有以下三种: 创建远程线程(CreateRemoteThread()

[转载]Dll注入技术之远程线程注入

转自:黑客反病毒 DLL注入技术之远线程注入 DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EXE文件中的API),或以被注入EXE的身份去执行一些操作等等.     远线程注入原理是利用Windows 系统中CreateRemoteThread()这个API,其中第4个参数是准备运行的线程,我们可以将LoadLibrary()填入其中,这样就可以执行远程进程中的LoadLi

实战DELPHI:远程线程插入(DLL注入)

http://www.jx19.com/xxzl/Delphi/2010/04/17/ShiZhanDELPHI_YuanChengXianChengChaRu_DLLZhuRu/ 远程注入DLL方法有很多种,也是很多木马病毒所使用的隐藏进程的方法,因为通过程序加载的DLL在进程管理器是没有显示的.这里介绍一种用 CreateRemoteThread 远程建立线程的方式注入DLL. 首先,我们要提升自己的权限,因为远程注入必不可免的要访问到目标进程的内存空间,如果没有足够的系统权限,将无法作任何

【windows核心编程】使用远程线程注入DLL

前言 该技术是指通过在[目标进程]中创建一个[远程线程]来达到注入的目的. 创建的[远程线程]函数为LoadLibrary, 线程函数的参数为DLL名字, 想要做的工作在DLL中编写.  示意图如下:  相关API 1.创建远程线程 //该函数除了第一个参数为目标进程句柄外 //其他参数均和CreateThread一样 HANDLE hThread = CreateRemoteThread( __in HANDLE hProcess, //目标进程句柄 __in_opt LPSECURITY_A