文章目录[隐藏]
易语言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群提供下载