易语言EIP永久注入

EIP是寄存器的一种,它和EBP、ESP都是为“栈”而生,用来存储CPU要读取指令的地址,CPU通过EIP寄存器读取即将要执行的指令。每次CPU执行完相应的汇编指令之后,EIP寄存器的值就会增加。EIP存储着下一条指令的地址,每执行一条指令,该寄存器变化一次。 易语言实现EIP永久注入,步骤难道很大,需要先看看以下文章:易语言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))
调试输出 (汇编代码)
 
' 将汇编代码写入内存
 
WriteProcessMemory (进程句柄, 申请内存地址, 汇编代码, 取字节集长度 (汇编代码), 0)
' 设置新的EIP寄存器值
线程环境.EIP = 申请内存地址
SetThreadContext (线程句柄, 线程环境)
 
' 恢复线程
ResumeThread (线程句柄)
 
' 关闭线程句柄,关闭进程句柄
CloseHandle (线程句柄)
CloseHandle (进程句柄)
返回 (真)

参考源码:http://www.511yj.com/eyuyan-hook-65.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

511遇见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值