http://www.jx19.com/xxzl/Delphi/2010/04/17/ShiZhanDELPHI_YuanChengXianChengChaRu_DLLZhuRu/

远程注入DLL方法有很多种,也是很多木马病毒所使用的隐藏进程的方法,因为通过程序加载的DLL在进程管理器是没有显示的.这里介绍一种用 CreateRemoteThread 远程建立线程的方式注入DLL.

首先,我们要提升自己的权限,因为远程注入必不可免的要访问到目标进程的内存空间,如果没有足够的系统权限,将无法作任何事.下面是这个函数是用来提升我们想要的权限用的.

].Luid) ;
    tp.Privileges[].Attributes := SE_PRIVILEGE_ENABLED;
    //调整权限
    Result := AdjustTokenPrivileges(hToken, false, tp, SizeOf(tp), nil, rl);
  end;
end;

关于 OpenProcessToken() 和 AdjustTokenPrivileges() 两个 API 的简单介绍:

OpenProcessToken():获得进程访问令牌的句柄.
  function OpenProcessToken(
    ProcessHandle: THandle; //要修改访问权限的进程句柄
    DesiredAccess: DWORD; //指定你要进行的操作类型
    var TokenHandle: THandle//返回的访问令牌指针
  ): BOOL;

AdjustTokenPrivileges() :调整进程的权限.
  function AdjustTokenPrivileges(
    TokenHandle: THandle;  // 访问令牌的句柄
    DisableAllPrivileges: BOOL; // 决定是进行权限修改还是除能(Disable)所有权限
    const NewState: TTokenPrivileges;  
    { 指明要修改的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包含一个数组,
      数据组的每个项指明了权限的类型和要进行的操作; }
    BufferLength: DWORD;  
    //结构PreviousState的长度,如果PreviousState为空,该参数应为 0
    var PreviousState: TTokenPrivileges; 
    // 指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息
    var ReturnLength: DWORD //实际PreviousState结构返回的大小
  ) : BOOL;

远程注入DLL其实是通过 CreateRemoteThread 建立一个远程线程调用 LoadLibrary 函数来加载我们指定的DLL,可是如何能让远程线程知道我要加载DLL呢,要知道在Win32系统下,每个进程都拥有自己的4G虚拟地址空间,各个进程之间都是相互独立的。所我们需要在远程进程的内存空间里申请一块内存空间,写入我们的需要注入的 DLL 的路径. 需要用到的 API 函数有:

OpenProcess():打开目标进程,得到目标进程的操作权限,详细参看MSDN
  function OpenProcess(
    dwDesiredAccess: DWORD;  // 希望获得的访问权限
    bInheritHandle: BOOL;  // 指明是否希望所获得的句柄可以继承
    dwProcessId: DWORD // 要访问的进程ID
  ): THandle;

VirtualAllocEx():用于在目标进程内存空间中申请内存空间以写入DLL的文件名
  function VirtualAllocEx(
    hProcess: THandle;  // 申请内存所在的进程句柄
    lpAddress: Pointer;  // 保留页面的内存地址;一般用nil自动分配
    dwSize,  // 欲分配的内存大小,字节单位;注意实际分 配的内存大小是页内存大小的整数倍
    flAllocationType: DWORD; 
    flProtect: DWORD
  ): Pointer;

WriteProcessMemory():往申请到的空间中写入DLL的文件名
  function WriteProcessMemory(
    hProcess: THandle;  //要写入内存数据的目标进程句柄
    const lpBaseAddress: Pointer; //要写入的目标进程的内存指针, 需以 VirtualAllocEx() 来申请
    lpBuffer: Pointer; //要写入的数据
    nSize: DWORD; //写入数据的大小
    var lpNumberOfBytesWritten: DWORD //实际写入的大小
  ): BOOL;

然后就可以调用 CreateRemoteThread 建立远程线程调用 LoadLibrary 函数来加载我们指定的DLL.

CreateRemoteThread() //在一个远程进程中建立线程
  function CreateRemoteThread(
    hProcess: THandle;  //远程进程的句柄
    lpThreadAttributes: Pointer; //线程安全描述字,指向SECURITY_ATTRIBUTES结构的指针
    dwStackSize: DWORD;  //线程栈大小,以字节表示
    lpStartAddress: TFNThreadStartRoutine;  
    // 一个TFNThreadStartRoutine类型的指针,指向在远程进程中执行的函数地址
    lpParameter: Pointer; //传入参数的指针
    dwCreationFlags: DWORD;  //创建线程的其它标志
    var lpThreadId: DWORD //线程身份标志,如果为0, 则不返回
  ): THandle;

整个远程注入DLL的具体实现代码如下:

 + );
       + );
       + lstrlenW(pszLibAFilename)) * SizeOf(WCHAR);

;
          , pfnStartAddr, pszLibFileRemote, , lpThreadId);

then
            Result := true;

// 释放句柄
          CloseHandle(hRemoteThread);
        end;
      end;
    finally
      // 释放句柄
      CloseHandle(hRemoteProcess);
    end;
  end;
end;

接下来要说的是如何卸载注入目标进程中的DLL,其实原理和注入DLL是完全相同的,只是远程调用调用的函数不同而已,这里要调用的是FreeLibrary,代码如下:

 + );
       + );
       + lstrlenW(pszLibAFilename)) * SizeOf(WCHAR);

, pfnStartAddr, pszLibFileRemote, , lpThreadId);
          , pfnStartAddr, Pointer(dwHandle), , lpThreadId);
           , MEM_DECOMMIT);
          // 释放句柄
          CloseHandle(hRemoteThread);
        end;
      end;
    finally
      // 释放句柄
      CloseHandle(hRemoteProcess);
    end;
  end;
end;

注意:例程里注入的DLL为例程目录下的DLL.dll,由DLL.dpr编译而来

实战DELPHI:远程线程插入(DLL注入)的更多相关文章

  1. mfc HackerTools远程线程注入

    在一个进程中,调用CreateThread或CreateRemoteThreadEx函数,在另一个进程内创建一个线程(因为不在同一个进程中,所以叫做远程线程).创建的线程一般为Windows API函 ...

  2. 【Reverse】DLL注入

    DLL注入就是将dll粘贴到指定的进程空间中,通过dll状态触发目标事件 DLL注入的大概流程 https://uploader.shimo.im/f/CXFwwkEH6FPM0rtT.png!thu ...

  3. 远程线程注入DLL突破session 0 隔离

    远程线程注入DLL突破session 0 隔离 0x00 前言 补充上篇的远程线程注入,突破系统SESSION 0 隔离,向系统服务进程中注入DLL. 0x01 介绍 通过CreateRemoteTh ...

  4. 系统权限远程线程注入到Explorer.exe

    目录 提升为系统权限,注入到explorer中 一丶简介 二丶注入效果图 提升为系统权限,注入到explorer中 一丶简介 我们上一面说了系统服务拥有系统权限.并且拥有system权限.还尝试启动了 ...

  5. 远程线程注入突破SESSION 0

    远程线程注入突破SESSION 0 SESSION 0 隔离 在Windows XP.Windows Server 2003,以及更老版本的Windows操作系统中,服务和应用程序使用相同的会话(Se ...

  6. [转]Dll注入经典方法完整版

    Pnig0s1992:算是复习了,最经典的教科书式的Dll注入. 总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在 ...

  7. C++学习之DLL注入

    #include<stdio.h> #include<Windows.h> #include<TlHelp32.h> //typedef unsigned long ...

  8. Dll注入经典方法完整版

    总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1 ...

  9. CreateRemoteThread远程线程注入Dll与Hook

    CreateRemoteThread虽然很容易被检测到,但是在有些场合还是挺有用的.每次想用的时候总想着去找以前的代码,现在在这里记录一下. CreateRemoteThread远程注入 DWORD ...

随机推荐

  1. sicily 1193. Up the Stairs

    Time Limit: 1sec    Memory Limit:32MB  Description John is moving to the penthouse of a tall sky-scr ...

  2. Ubuntu vi 上下左右变ABCD问题解决方法

    ---恢复内容开始--- 错误问题:vi上下左右键显示为ABCD的问题 解决方法: 只要依次执行以下两个命令即可完美解决Ubuntu下vi编辑器方向键变字母的问题. 一.执行命令 sudo apt-g ...

  3. 半小时分组统计个数sql

    group by 最后一个时间是多少按多少分组 select count(1), trunc(a.refund_insert_time, 'hh24') + case when to_char(ref ...

  4. Effective STL 阅读笔记: Item 3: Make copying cheap and correct for objects in containers

    容器 (Containers) 用来存储对象 (Objects), 但是被存储的对象却并非原原本本是你给他的那一个, 而是你指定对象的一个拷贝.而后续对该容器内存储对象的操作,大多也是基于拷贝的. 拷 ...

  5. 【hdoj_1133】Buy the Ticket(卡特兰数+大数)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1133 题目的意思是,m个人只有50元钱,n个人只有100元整钱,票价50元/人.现在售票厅没钱,只有50元 ...

  6. NIO-2通道(Channel)

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  7. C++构造函数详解(复制构造函数)

    构造函数是干什么的 该类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数,由构造函数完成成员的初始化工作,故:构造函数的作用:初始化对象的数据成员. 构造函数的种类 class Compl ...

  8. 使用360对app安全进行加固

    在写了第一个app之后,打算上架到各个渠道看看,无意间看到了360的app加固工具 http://jiagu.360.cn/ 自己体验了一把,加固过程很傻瓜化, 加固好了之后,还要对app进行二次签名 ...

  9. python的多线程threading

    多线程threading 1.Thread创建线程: 上代码: #!/usr/bin/env python3 import threading import time def A(): t_name ...

  10. SQLyog-12.0.9-0.x64

    SQLyog-12.0.9-0.x64 下载地址 链接:https://pan.baidu.com/s/1AjC2rdx8Bgtns1sYmN5NEw 提取码:icko 注册码: 姓名(Name):c ...