易语言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, , )
返回 (假)
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
.版本 2
.DLL命令 QueueUserAPC, 整数型, "kernel32.dll", "QueueUserAPC", , 一个APC对象加入到指定线程的APC队列中。
.参数 pfnAPC, 整数型, , 指向一个用户提供的APC函数的指针
.参数 hThread, 整数型, , 线程句柄
.参数 dwData, 整数型, , 指定一个被传到pfnAPC参数指向的APC函数的值。
PEload文件
到VIP QQ群提供下载
交流①群:521068947
511遇见QQ:272586593
原文链接:https://blog.csdn.net/weixin_36349918/article/details/117187182?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167042854316800180664292%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=167042854316800180664292&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-25-117187182-null-null.nonecase&utm_term=%E6%98%93%E8%AF%AD%E8%A8%80%E6%BA%90%E7%A0%81