易语言EIP永久注入

易语言EIP永久注入步骤

1、获取进程ID和注入DLL路径
2、打开进程,获取进程句柄
3、获取系统线程快照句柄,包涵进程中所有的块照
4、通过对比获取线程ID
5、打开线程,2032639给予线程所有可能的权限
6、挂起线程
7、保存线程寄存器相关信息,获取EIP值,65543线程环境信息的全部内容
8、申请内存 ,4096 #MEM_COMMIT为特定的页面区域分配内存中或磁盘的页面文件中的物理存储,#PAGE_EXECUTE_READWRITE 64应用程序可读写改区域
9、先将DLL路径写入内存中 0x100的位置
10、获取LoadLibraryA函数地址,还有就是要知道,Kernel32.LoadLibraryW的地址不同进程是一样的,这样就可以直接得到相关RVA
11、易语言完成主要汇编代码
12、将汇编代码写入内存
13、设置新的EIP寄存器值
14、恢复线程
15、关闭线程句柄,关闭进程句柄

EIP注入原理

挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,然后把相关的指令机器码和数据拷贝到里面去,然后修改目标进程EIP使其强行跳转到我们拷贝进去的相关机器码位置,执行相关,然后跳转回来。

易语言EIP永久注入源码:

.版本 2
.支持库 spec
 
.子程序 EIP_永久注入, 逻辑型
.参数 进程ID, 整数型
.参数 DLL文件, 文本型, , DLL文件全路径
.局部变量 线程ID, 整数型
.局部变量 快照句柄, 整数型
.局部变量 线程信息, THREADENTRY32
.局部变量 bool, 逻辑型
.局部变量 申请内存地址, 整数型
.局部变量 LoadLibraryA地址, 整数型
.局部变量 线程环境, CONTEXT
.局部变量 EIP, 整数型
.局部变量 汇编代码, 字节集
.局部变量 VirtualFree地址, 整数型
.局部变量 DLL路径大小, 整数型
.局部变量 DLL路径地址, 整数型
' 打开进程
进程句柄 = OpenProcess (#PROCESS_ALL_ACCESS, 假, 进程ID)
.如果 (进程句柄 = 0)
    信息框 (“打开进程失败!”, 0, , )
    返回 (假)
.否则
.如果结束
' 获取系统线程快照句柄,4之包涵进程中所有的块照
快照句柄 = CreateToolhelp32Snapshot (#TH32CS_SNAPTHREAD, 0)
.如果 (快照句柄 = 0)
    信息框 (“获取系统进程快照句柄失败!”, 0, , )
    CloseHandle (快照句柄)
    返回 ()
.否则
 
.如果结束
 
' 通过对比获取线程ID,初始化28
线程信息.dwSize = 28
bool = Thread32Next (快照句柄, 线程信息)
.判断循环首 (bool)
    .如果真 (线程信息.th32OwnerProcessID = 进程ID)
        线程ID = 线程信息.th32ThreadID
        跳出循环 ()
 
    .如果真结束
    bool = Thread32Next (快照句柄, 线程信息)
.判断循环尾 ()
.如果真 (线程ID = 0)
    信息框 (“获取线程ID失败”, 0, , )
    CloseHandle (进程句柄)
    返回 (假)
.如果真结束
 
' 打开线程,2032639给予线程所有可能的权限
线程句柄 = OpenThread (#THREAD_ALL_ACCESS, 0, 线程ID)
.如果真 (线程句柄 = 0)
    信息框 (“打开线程失败”, 0, , )
    返回 ()
.如果真结束
' 挂起线程
SuspendThread (线程句柄)
 
' 保存线程寄存器相关信息,获取EIP值,65543线程环境信息的全部内容
线程环境.ContextFlags = #CONTEXT_FULL
GetThreadContext (线程句柄, 线程环境)
EIP = 线程环境.EIP
调试输出 (EIP)
 
' 申请内存 ,4096 #MEM_COMMIT为特定的页面区域分配内存中或磁盘的页面文件中的物理存储,#PAGE_EXECUTE_READWRITE 64应用程序可读写改区域
申请内存地址 = VirtualAllocEx (进程句柄, 0, 2048, #MEM_COMMIT, #PAGE_EXECUTE_READWRITE)
.如果真 (申请内存地址 = 0)
    信息框 (“申请内存地址失败”, 0, , )
    ResumeThread (线程句柄)
    CloseHandle (线程句柄)
    CloseHandle (进程句柄)
    返回 (假)
.如果真结束
 
' 先将DLL路径写入内存中 0x100的位置
DLL路径大小 = 取文本长度 (DLL文件)1
DLL路径地址 = 申请内存地址 + 256
WriteProcessMemory (进程句柄, DLL路径地址, 到字节集 (DLL文件), DLL路径大小, 0)
' 获取LoadLibraryA函数地址,还有就是要知道,Kernel32.LoadLibraryW的地址不同进程是一样的,这样就可以直接得到相关RVA
LoadLibraryA地址 = GetProcAddress (GetModuleHandleA (“Kernel32.dll”), “LoadLibraryA”)
.如果真 (LoadLibraryA地址 = 0)
    信息框 (“LoadLibraryA地址失败”, 0, , )
    ResumeThread (线程句柄)
    CloseHandle (线程句柄)
    CloseHandle (进程句柄)
    返回 (假)
.如果真结束
' 主要汇编代码
汇编代码 = { 96, 156, 104 } + 到字节集 (到整数 (申请内存地址 + 256))
汇编代码 = 汇编代码 + { 232 } + 到字节集 (到整数 (LoadLibraryA地址 - (申请内存地址 + 取字节集长度 (汇编代码))5)){ 157, 97 }
汇编代码 = 汇编代码 + { 232 } + 到字节集 (到整数 (EIP - (申请内存地址 + 取字节集长度 (汇编代码))5))
调试输出 (汇编代码)
' 将汇编代码写入内存
' 恢复线程
ResumeThread (线程句柄)
' 关闭线程句柄,关闭进程句柄
CloseHandle (线程句柄)
CloseHandle (进程句柄)
返回 (真)

教程获取下载:


发布日期:

所属分类: 编程 标签:   


没有相关文章!