易语言APC内存注入主要流程源码

易语言APC内存注入主要流程

1、打开进程

进程句柄 = OpenProcess (2035711, 假, 进程ID)

2、读入DLL文件及获取主要汇编指令

DLL文件 = 读入文件 (DLL路径)
DLL文件长度 = 取字节集长度 (DLL文件)
主要汇编指令长度 = 取字节集长度 (#PE文件)

3、创建文件映射对象

映射对象句柄 = CreateFileMappingA (-1, 0, 64, 0, DLL文件长度 + 主要汇编指令长度, “Mapc”)

4、将文件映射对象映射到当前程序内存空间

映射对象开始地址 = MapViewOfFile (映射对象句柄,2, 0, 0, DLL文件长度 + 主要汇编指令长度)

5、 写入内存

RtlMoveMemory_字节集 (映射对象开始地址, #PE文件, 主要汇编指令长度)
RtlMoveMemory_字节集 (映射对象开始地址 + 主要汇编指令长度, DLL文件, DLL文件长度)

6、关闭文件映射对象

UnmapViewOfFile (映射对象开始地址)

7、创建内存映射对象 内核

ZwMapViewOfSection (映射对象句柄, 进程句柄, 内核映射对象基址, 0, 0, 0, 内核映射对象大小, 1, 0, 64)

8、获取GetModuleHandleA地址

GetModuleHandleA地址 = GetProcAddress (GetModuleHandleA (“kernel32.dll”), “GetModuleHandleA”)

9、创建远程线程并挂起

线程句柄 = CreateRemoteThread (进程句柄, 0, 0, GetModuleHandleA地址, 0, #CREATE_SUSPENDED, 0)

10、把APC对象加入到指定线程的APC队列中

QueueUserAPC (内核映射对象基址, 线程句柄, 内核映射对象基址 + 主要汇编指令长度)

11、关闭线程句柄

ResumeThread (线程句柄)

12、关闭映射对象句柄

CloseHandle (映射对象句柄)

13、关闭进程句柄

CloseHandle (进程句柄)

易语言APC内存注入主要源码

.版本 2
 
' 打开进程
进程句柄 = OpenProcess (2035711, 假, 进程ID)
.如果真 (进程句柄 = 0)
    信息框 (“打开进程失败!”, 0, , )
    返回 (假)
.如果真结束
加入日志 (“打开进程成功!”)
 
' 读入DLL文件及获取主要汇编指令
DLL文件 = 读入文件 (DLL路径)
DLL文件长度 = 取字节集长度 (DLL文件)
主要汇编指令长度 = 取字节集长度 (#PE文件)
 
' 创建文件映射对象
' #INVALID_HANDLE_VALUE  -1创建一个进程间共享的对象,,
' ,64区域可以执行代码,应用程序可以读写该区域。
 
映射对象句柄 = CreateFileMappingA (#INVALID_HANDLE_VALUE, 0, #PAGE_EXECUTE_READWRITE, 0, DLL文件长度 + 主要汇编指令长度, “Yous”)
.如果真 (映射对象句柄 = -1)
    信息框 (“创建映射对象失败!”, 0, , )
    返回 (假)
.如果真结束
加入日志 (“创建映射对象成功!”)
 
' 将文件映射对象映射到当前程序内存空间,,#FILE_MAP_WRITE--2可以读取和写入文件
映射对象开始地址 = MapViewOfFile (映射对象句柄, #FILE_MAP_WRITE, 0, 0, DLL文件长度 + 主要汇编指令长度)
.如果真 (映射对象开始地址 = 0)
    信息框 (“映射对象映射失败!”, 0, , )
    返回 ()
.如果真结束
加入日志 (“映射对象映射成功!”)
 
' 写入内存
RtlMoveMemory_字节集 (映射对象开始地址, #PE文件, 主要汇编指令长度)
RtlMoveMemory_字节集 (映射对象开始地址 + 主要汇编指令长度, DLL文件, DLL文件长度)
 
' 关闭文件映射对象
UnmapViewOfFile (映射对象开始地址)
 
' 创建内存映射对象 内核
ZwMapViewOfSection (映射对象句柄, 进程句柄, 内核映射对象基址, 0, 0, 0, 内核映射对象大小, 1, 0, 64)
.如果真 (内核映射对象基址 ≤ 0)
    信息框 (“映射对象内核映射失败!”, 0, , )
    返回 (假)
.如果真结束
加入日志 (“映射对象内核映射成功!”)
 
' 获取GetModuleHandleA地址
GetModuleHandleA地址 = GetProcAddress (GetModuleHandleA (“kernel32.dll), “GetModuleHandleA”)
' #CREATE_SUSPENDED=4  新进程的主线程会以暂停的状态被创建,直到调用ResumeThread函数被调用时才运行。
 
线程句柄 = CreateRemoteThread (进程句柄, 0, 0, GetModuleHandleA地址, 0, #CREATE_SUSPENDED, 0)
.如果真 (线程句柄 = 0)
    信息框 (“创建远程线程失败!”, 0, , )
    返回 (假)
.如果真结束
加入日志 (“创建远程线程成功!”)
 
.如果真 (QueueUserAPC (内核映射对象基址, 线程句柄, 内核映射对象基址 + 主要汇编指令长度) = 0)
    信息框 (“QueueUserAPC函数使用失败!”, 0, , )
    返回 (假)
.如果真结束
加入日志 (“QueueUserAPC函数使用成功!”)
 
ResumeThread (线程句柄)
CloseHandle (映射对象句柄)
CloseHandle (进程句柄)

主要api

CreateFileMappingA

.版本 2
 
.DLL命令 CreateFileMappingA, 整数型, "kernel32", "CreateFileMappingA", , 创建一个新的文件映射对象  新建文件映射对象的句柄;零意味着出错。会设置GetLastError。即使函数成功,但倘若返回的句柄属于一个现成的文件映射对象,那么GetLastError也会设置成ERROR_ALREADY_EXISTS。在这种情况下,文件映射的长度就是现有对象的长度,而不是这个函数指定的尺寸
    .参数 文件映射句柄, 整数型, , 指定欲在其中创建映射的一个文件句柄。&HFFFFFFFF&表示在内存中创建一个文件映射
    .参数 安全对象, 整数型, , SECURITY_ATTRIBUTES,指定一个安全对象,在创建文件映射时使用。如果为NULL(用ByVal As Long传递零),表示使用默认安全对象
    .参数 打开映射方式, 整数型, , 下述常数之一:;PAGE_READONLY:以只读方式打开映射;PAGE_READWRITE:以可读、可写方式打开映射;PAGE_WRITECOPY:为写操作留下备份可组合使用下述一个或多个常数;SEC_COMMIT:为文件映射一个小节中的所有页分配内存;SEC_IMAGE:文件是个可执行文件;SEC_RESERVE:为没有分配实际内存的一个小节保留虚拟内存空间
    .参数 文件映射最大长度, 整数型, , 文件映射的最大长度(高32位)
    .参数 文件映射的最小长度, 整数型, , 文件映射的最小长度(低32位)。如这个参数和dwMaximumSizeHigh都是零,就用磁盘文件的实际长度
    .参数 映射对象名, 文本型, , 指定文件映射对象的名字。如存在这个名字的一个映射,函数就会打开它。用vbNull创建一个无名的文件映射;

MapViewOfFile

.版本 2
 
.DLL命令 MapViewOfFile, 整数型, "kernel32", "MapViewOfFile", , 将一个文件映射对象映射到当前应用程序的地址空间。MapViewOfFileEx允许我们指定一个基本地址来进行映射  文件映射在内存中的起始地址。零表示出错。会设置GetLastError
    .参数 hFileMappingObject, 整数型, , 文件映像对象句柄
    .参数 dwDesiredAccess, 整数型, , 映射对象的文件数据的访问方式
    .参数 dwFileOffsetHigh, 整数型, , 文件映射起始偏移的高32位
    .参数 dwFileOffsetLow, 整数型, , 文件映射起始偏移的低32位.(64KB对齐不是必须的)
    .参数 dwNumberOfBytesToMap, 整数型, , 映射文件的字节数

ZwMapViewOfSection

.版本 2
 
.DLL命令 ZwMapViewOfSection, 整数型, "ntdll.dll", "ZwMapViewOfSection", , 创建内存映射文件 内核
    .参数 SectionHandle, 整数型, , 对象句柄
    .参数 ProcessHandle, 整数型, , 进程对象句柄
    .参数 BaseAddress, 整数型, 传址, 指向一个接收基址的变量的指针
    .参数 ZeroBits, 整数型
    .参数 CommitSize, 整数型, , 提交区域大小
    .参数 SectionOffset, 整数型, , 指向一个接收偏移量的变量
    .参数 ViewSize, 整数型, 传址, 一个指向sizet变量的指针。
    .参数 InheritDisposition, 整数型, , 指定如何与子进程共享
    .参数 AllocationType, 整数型, , 指定一组标记,用于描述为指定的页面区域执行的分配的类型。
    .参数 Win32Protect, 整数型, , 指定最初提交的页面区域的保护类型。

CreateRemoteThread

.版本 2
 
.DLL命令 CreateRemoteThread, 整数型, "kernel32", "CreateRemoteThread", 公开, 在另一进程中建立线程 
    .参数 hProcess, 整数型, , 进程句柄
    .参数 lpThreadAttributes, 整数型, , 安全属性
    .参数 dwStackSize, 整数型, , 线程初始大小
    .参数 lpStartAddress, 整数型, , 线程回调函数地址
    .参数 lpParameter, 整数型, , 线程参数
    .参数 dwCreationFlags, 整数型, , 创建标志
    .参数 lpThreadId, 整数型, 传址, 线程ID,有传址

QueueUserAPC

  1. .版本 2
  2.  
  3. .DLL命令 QueueUserAPC, 整数型, "kernel32.dll", "QueueUserAPC", , 一个APC对象加入到指定线程的APC队列中。
  4.     .参数 pfnAPC, 整数型, , 指向一个用户提供的APC函数的指针
  5.     .参数 hThread, 整数型, , 线程句柄
  6.     .参数 dwData, 整数型, , 指定一个被传到pfnAPC参数指向的APC函数的值。

PEload文件

到QQ群提供下载


发布日期:

所属分类: 易语言 标签: