易语言APC应用层注入

步骤

1、打开需要注入的进程
2、获取DLL文件路径的长度
3、申请内存地址
4、将DLL路径写入内存
5、获取loadlibraryA在kernel32.dll中的地址
6、获取系统线程快照句柄,4在快照中包含所有的线程
7、初始化线程结构大小
8、验证检索与线程相关的第一个线程的信息
9、判断父进程ID等于 参数的进程ID
10、打开线程
11、不等于说明打开线程成功,开始核心注入
(1)指向一个我们提供的APC函数指针
(2)线程句柄
(3)指定一个被传到APC参数指向的函数的值
12、关闭进程句柄
13、关闭线程局部

易语言APC应用层注入源码:

.版本 2
 
.子程序 APC注入_R3, 逻辑型, , APC应用层注入
.参数 进程ID, 整数型
.参数 DLL文件, 文本型
.局部变量 dll文件大小, 整数型
.局部变量 内存地址, 整数型
.局部变量 LoadLibraryA地址, 整数型
.局部变量 快照句柄, 整数型
.局部变量 线程信息, THREADENTRY32
 
' 1、打开需要注入的进程
进程句柄 = OpenProcess (2035711, 假, 进程ID)
.如果真 (进程句柄 = 0)
    信息框 (“打开进程失败!”, 0, , )
    返回 (假)
.如果真结束
 
' 2、获取DLL文件路径的长度
 
dll文件大小 = 取文本长度 (DLL文件)1
 
' 3、申请内存地址
 
内存地址 = VirtualAllocEx (进程句柄, 0, dll文件大小, 4096, 64)
 
.如果真 (内存地址 = 0)
    信息框 (“申请内存地址失败!”, 0, , )
    返回 (假)
 
.如果真结束
 
' 4、将DLL路径写入内存
 
WriteProcessMemory (进程句柄, 内存地址, 到字节集 (DLL文件), dll文件大小, 0)
 
' 5、获取loadlibraryA在kernel32.dll中的地址
 
LoadLibraryA地址 = GetProcAddress (GetModuleHandleA (“kernel32”), “LoadLibraryA”)
.如果真 (LoadLibraryA地址 = 0)
    信息框 (“获取loadlibraryA失败!”, 0, , )
    返回 (假)
 
.如果真结束
 
' 6、获取系统线程快照句柄,4在快照中包含所有的线程
 
快照句柄 = CreateToolhelp32Snapshot (4, 0)
.如果真 (快照句柄 = 0)
    信息框 (“获取系统线程快照句柄失败!”, 0, , )
    返回 ()
 
.如果真结束
 
' 7、初始化线程结构大小
 
线程信息.dwSize = 28
 
' 8、验证检索与线程相关的第一个线程的信息,
.如果真 (Thread32First (快照句柄, 线程信息))
    .循环判断首 ()
        ' 9、判断父进程ID等于 参数的进程ID
        .如果真 (线程信息.th32OwnerProcessID = 进程ID)
            ' 10、打开线程,
            线程句柄 = OpenThread (2032639, 0, 线程信息.th32ThreadID)
            .如果真 (线程句柄 ≠ 0)
                ' 11、不等于说明打开线程成功,开始核心注入
                '1)指向一个我们提供的APC函数指针
                ' (2)线程句柄
                '3)指定一个被传到APC参数指向的函数的值
 
                .如果真 (QueueUserAPC (LoadLibraryA地址, 线程句柄, 内存地址)0)
                    信息框 (“QueueUserAPC失败!”, 0, , )
                    返回 ()
 
                .如果真结束
 
 
            .如果真结束
            CloseHandle (线程句柄)
 
        .如果真结束
 
    .循环判断尾 (Thread32Next (快照句柄, 线程信息))
 
.如果真结束
 
CloseHandle (快照句柄)
CloseHandle (进程句柄)
返回 ()

我们将会在下一课完成注入DLL的编写

教程获取下载:


发布日期:

所属分类: 易语言 标签: