概述
易语言完成内存注入的难度很大。
内存注入流程
1、获取注入进程ID
2、获取注入DLL的路径
3、打开进程,获取进程句柄
4、申请内存,读入DLL
5、将DLL路径写入内存地址
6、将DLL路径写入内存地址
7、为内存中的汇编指令申请内存地址
8、把汇编指令写入内存
9、把汇编指令写入内存
10、创建远程线程,执行装载DLL函数
11、线程等待
12、取终止线程退出的代码
13、 关闭线程和进程句柄
易语言内存注入源码:
.版本 2
.子程序 内存注入, 逻辑型
.参数 进程ID, 整数型
.参数 DLL文件, 文本型
.局部变量 DLL数据, 字节集
.局部变量 DLL数据大小, 整数型
.局部变量 主要汇编指令, 字节集
.局部变量 线程句柄, 整数型
' 打开进程,获取进程句柄
进程句柄 = OpenProcess (#PROCESS_ALL_ACCESS, 假, 进程ID)
.如果真 (进程句柄 = 0)
信息框 (“打开进程失败!!”, 16, , )
返回 (假)
.如果真结束
' 申请内存,读入DLL
DLL数据 = 读入文件 (DLL文件)
DLL数据大小 = 取字节集长度 (DLL数据) + 1
申请DLL内存地址 = VirtualAllocEx (进程句柄, 0, DLL数据大小, #MEM_COMMIT, #PAGE_EXECUTE_READWRITE)
.如果真 (申请DLL内存地址 = 0)
信息框 (“申请DLL内存地址失败!!”, 16, , )
CloseHandle (进程句柄)
返回 (假)
.如果真结束
' 将DLL路径写入内存地址
WriteProcessMemory (进程句柄, 申请DLL内存地址, DLL数据, DLL数据大小, 0)
' 将一些汇编指令写入内存,进行加载
主要汇编指令 = #load_code + #getaddr_code + #free_code
' 为内存中的汇编指令申请内存地址
申请装载地址 = VirtualAllocEx (进程句柄, 0, 取字节集长度 (主要汇编指令), #MEM_COMMIT, #PAGE_EXECUTE_READWRITE)
.如果真 (申请装载地址 = 0)
信息框 (“申请装载地址失败!!”, 16, , )
CloseHandle (进程句柄)
返回 (假)
.如果真结束
' 把汇编指令写入内存
WriteProcessMemory (进程句柄, 申请装载地址, 主要汇编指令, 取字节集长度 (主要汇编指令), 0)
' 保存获取的DLL函数地址功能和卸载DLL的地址
getaddr_code地址 = 申请装载地址 + 取字节集长度 (#load_code)
free_code地址 = getaddr_code地址 + 取字节集长度 (#getaddr_code)
' 创建远程线程,执行装载DLL函数
线程句柄 = CreateRemoteThread (进程句柄, 0, 0, 申请装载地址, 申请DLL内存地址, 0, 0)
' 线程等待
WaitForSingleObject (线程句柄, #DMUS_SEG_REPEAT_INFINITE)
' 取终止线程退出的代码
GetExitCodeThread (线程句柄, DLL句柄)
.如果真 (线程句柄 = 0)
信息框 (“内存注入失败!!”, 16, , )
CloseHandle (进程句柄)
返回 (假)
.如果真结束
' 关闭线程和进程句柄
CloseHandle (线程句柄)
CloseHandle (进程句柄)
返回 (真)
注入步骤
1、获取进程ID
2、获取注入DLL路径
3、获取注入DLL里的函数名称
4、执行内存注入
5、调用注入函数
6、释放注入
注入DLL源码
.版本 2
.程序集 程序集1
.子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码
_临时子程序 () ' 在初始化代码执行完毕后调用测试代码
返回 (0) ' 返回值被忽略。
.子程序 _临时子程序
' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。
.子程序 Start, , 公开
载入 (窗口1, , 真)
加载内存中的DLL
.版本 2
.子程序 LoadMemLibrary, 整数型, 公开, 加载内存中的DLL
.参数 pData, 字节集
置入代码 ({ 139, 69, 8, 139, 0, 133, 192, 117, 4, 201, 194, 4, 0, 131, 192, 8, 137, 69, 8, 235, 3 })
置入代码 (#load_code)
返回 (0)
释放内存中的DLL
.版本 2
.子程序 FreeMemLibrary, 逻辑型, 公开, 释放内存中的DLL
.参数 hLibModule, 整数型
置入代码 ({ 235, 3 })
置入代码 (#free_code)
返回 (假)
调用注入函数接口
.版本 2
.支持库 spec
.局部变量 hAddress, , , , 函数地址
.局部变量 返回值
hAddress = GetMemProcAddress (hModule, 编辑框3.内容)
.如果真 (hAddress ≠ 0)
返回值 = 调用子程序_asm (hAddress, , , , , , , , , , , , , , , )
调试输出 (“返回值” + 到文本 (返回值))
释放注入句柄
.版本 2
.支持库 spec
.局部变量 ret, 逻辑型
ret = FreeMemLibrary (hModule)
调试输出 (ret)
hModule = 0
源码参考:http://www.511yj.com/eyuyan-hook-71.html
最后
以上就是俊秀凉面为你收集整理的易语言内存注入的全部内容,希望文章能够帮你解决易语言内存注入所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复