交流
功能说明:
本程序是使用易语言开发的一款进程内存查看与修改工具,旨在提供类似十六进制编辑器的功能,允许用户直接查看和修改指定进程的内存数据。程序界面基于自定义的 HexEdit 控件构建,结合了 Windows API 进行底层内存操作。以下是对程序功能的详细总结:
一、程序启动与界面初始化
程序的入口点为“启动子程序”,其主要作用是加载主窗口“窗口 1"。
在“窗口 1_创建完毕”子程序中,完成了核心组件的初始化工作:
1. 获取主窗口句柄(启动窗口)。
2. 初始化一个编辑框(编辑框 1)用于输入内存地址,默认显示地址为"00400000"(典型的可执行文件基址)。
3. 对该编辑框进行底层消息钩挂(SetWindowLong),拦截其键盘和鼠标消息,以实现自定义的输入逻辑,如回车跳转定位、禁用特定按键等。
4. 创建核心的十六进制编辑器控件(HexEdit1),设置窗口位置及尺寸,并应用了“Courier New"字体以优化代码阅读体验。
5. 配置 HexEdit 控件的颜色方案,例如标题栏设为黑色背景绿色文字,正文内容根据数据类型区分颜色(白色、紫色、红色等)。
6. 绑定关键事件:包括光标位置改变事件(HexEdit__PointVary)、窗口消息处理事件(HexEdit__WndProc)以及数据变化事件(HexEdit__DataVary),确保用户操作能即时反馈到后台逻辑。
二、内存读取与显示机制
当用户在十六进制编辑区移动光标时,触发"_MemoryEdit1_指针位置被改变”子程序:
1. 程序首先通过 VirtualQueryEx API 查询当前指针指向的内存页属性(内存块信息)。
2. 判断内存块的访问权限(Protect 属性),如果权限允许读取,则调用“读内存字节集”函数读取从当前地址开始的连续 16*显示行数 个字节的数据。
3. 将读取到的二进制数据更新回 HexEdit 控件中显示(HexEditSetData)。
4. 如果内存不可读或权限受限,则在界面上填充"?? ??"等占位符,表示该区域无法访问。
5. 实时更新地址栏显示,将当前光标对应的绝对内存地址转换为十六进制文本显示在编辑框 1 中,方便用户了解当前位置。
6. 此外,程序还预定义了单字节、双字节、四字节整数的读取变量,暗示后续支持多种数据类型的内存预览功能。
三、内存写入与修改机制
当用户在十六进制编辑器中修改数据时,触发"MemoryEdit_数据内容被改变”子程序:
1. 程序接收用户输入的文本(Text)和偏移位置(Pos)。
2. 根据输入内容的长度进行逻辑判断。如果是单字节输入,尝试解析为字节型;如果是普通文本(通常是十六进制字符串),则转换为十进制数值。
3. 在执行写入前,程序调用 VirtualProtectEx API 修改目标内存区域的保护属性(设置为 PAGE_EXECUTE_READWRITE,即 8),以确保写入操作合法。
4. 随后调用“写内存整数”函数,将转换后的数值写入到 进程句柄 指定的 当前地址 + Pos 偏移处。
5. 如果写入失败,程序会弹出错误提示框告知用户“写内存出错”,保证了操作的稳定性和反馈。
四、辅助功能与技术细节
1. 字体管理:提供了独立的“设置字体”子程序,利用 Windows SendMessage 和 CreateFont API 动态创建并替换控件字体,支持加粗、斜体、下划线等样式定制。
2. 消息拦截:在“_编辑框 1 程序”中重写了输入框的消息循环。例如拦截 WM_COPY(768)消息将其改为复制行为,拦截 WM_PASTE(770)等消息阻止粘贴,防止非法字符输入破坏地址格式。同时检测退格键和回车键以维持正常的编辑流。
3. 全局变量设计:程序定义了一系列关键的全局变量,如“进程句柄”用于标识目标进程,“当前地址”作为读写基准点,“内存块信息”存储虚拟内存查询结果。这表明程序具有扩展性,支持针对外部特定进程句柄的操作(尽管当前代码片段中将句柄初始化为 -1,实际使用时需连接 OpenProcess 逻辑)。
4. 库依赖:代码顶部标记了".支持库 iext",表明使用了扩展支持库来增强系统调用能力或简化某些 API 封装。
五、总结
综上所述,该程序是一个功能完备的底层内存调试助手。它通过集成自定义 HexEdit 控件实现了可视化的内存浏览,利用 Windows API 实现了进程级的内存读写能力。其主要应用场景包括游戏外挂开发、软件逆向分析、内存漏洞测试以及程序运行时状态监控。程序结构清晰,分离了界面渲染与数据处理逻辑,具备较高的可扩展性,能够作为更复杂内存工具的基础框架。虽然提供的代码片段在末尾处有截断(“双字节整数 = 读内”),但核心流程已完整展现了内存编辑器的基本运作模式。
======程序集1
| |
| |------ _启动子程序
| |
| |
======窗口程序集1
| |
| |------ 设置字体
| |
| |------ _窗口1_创建完毕
| |
| |------ MemoryEdit_数据内容被改变
| |
| |------ _编辑框1程序
| |
| |------ _MemoryEdit1_指针位置被改变
| |
| |------ _MemoryEdit2_指针位置被改变
| |
| |------ _HexEdit1_WndProc
| |
| |------ _HexEdit2_WndProc
| |
| |------ 定位
| |
| |------ 十六到十
| |
| |------ 写内存整数
| |
| |------ 读内存长整数
| |
| |------ 读内存字节集
| |
| |------ 屏蔽按键
| |
| |------ _工具条1_被单击
| |
| |------ _窗口1_尺寸被改变
| |
| |------ _选择框1_被单击
| |
| |------ _时钟1_周期事件
| |
| |
======调用的Dll
| |
| |---[dll]------ 读整数内存
| |
| |---[dll]------ SetWindowLong
| |
| |---[dll]------ CallWindowProc
| |
| |---[dll]------ VirtualQueryEx
| |
| |---[dll]------ 读字节集内存
| |
| |---[dll]------ MoveWindow
| |
| |---[dll]------ StrToIntEx
| |
| |---[dll]------ 写整数内存
| |
| |---[dll]------ VirtualProtectEx
| |
| |---[dll]------ CreateFont
| |
| |---[dll]------ SendMessage
| |
| |---[dll]------ DeleteObject
======窗口程序集1
| |
| |------ 设置字体
| |
| |------ __启动窗口_创建完毕
| |
| |------ 拖放路径
| |
| |------ _HexEdit_WndProc
| |
| |------ _滚动条位置被改变
| |
| |------ 十六到十
| |
| |------ _数据被修改
| |
| |------ _按钮1_被单击
| |
| |------ _按钮2_被单击
| |
| |------ _按钮3_被单击
| |
| |------ _按钮4_被单击
| |
| |------ __启动窗口_尺寸被改变
| |
| |------ _编辑框1_内容被改变
| |
| |------ _按钮5_被单击
| |
| |------ _时钟1_周期事件
| |
| |------ _编辑框1_按下某键
| |
| |
======拖放文件
| |
| |------ 拖放文件
| |
| |------ 拖放文件子程序
| |
| |------ 禁止拖放
| |
| |------ 拖放结果
| |
| |------ 取文件路径
| |
| |------ 取路径文件名
| |
| |
======调用的Dll
| |
| |---[dll]------ StrToIntEx
| |
| |---[dll]------ MoveWindow
| |
| |---[dll]------ DragAcceptFiles
| |
| |---[dll]------ DragQueryFile
| |
| |---[dll]------ DragFinish
| |
| |---[dll]------ SetWindowLong
| |
| |---[dll]------ CallWindowProc
| |
| |---[dll]------ StrDup
| |
| |---[dll]------ GetFileTitle
| |
| |---[dll]------ CreateFont
| |
| |---[dll]------ SendMessage
| |
| |---[dll]------ DeleteObject
======DLL接口
| |
| |------ _启动子程序
| |
| |------ _临时子程序
| |
| |------ Dll入口函数
| |
| |------ InstallHook
| |
| |------ Hook过程程序
| |
| |------ UninstallHook
| |
| |------ MyOpenProcess
| |
| |------ MyCreateProcess
| |
| |------ MyGetLocalTime
| |
| |
======help
| |
| |------ 取模块句柄
| |
| |------ 指针到整数
| |
| |------ 指针到短整数
| |
| |------ 取整数型指针
| |
| |------ A2W
| |
| |------ W2A
| |
| |
======apihook
| |
| |------ _初始化
| |
| |------ _销毁
| |
| |------ 安装2
| |
| |------ 安装
| |
| |------ 卸载
| |
| |------ 继续
| |
| |------ 暂停
| |
| |
======窗口程序集1
| |
| |------ 设置字体
| |
| |------ _窗口1_创建完毕
| |
| |------ MemoryEdit_数据内容被改变
| |
| |------ _编辑框1程序
| |
| |------ _MemoryEdit1_指针位置被改变
| |
| |------ _MemoryEdit2_指针位置被改变
| |
| |------ _HexEdit1_WndProc
| |
| |------ _HexEdit2_WndProc
| |
| |------ 定位
| |
| |------ 十六到十
| |
| |------ 写内存整数
| |
| |------ 读内存长整数
| |
| |------ 读内存字节集
| |
| |------ 屏蔽按键
| |
| |------ _工具条1_被单击
| |
| |------ _窗口1_尺寸被改变
| |
| |------ _选择框1_被单击
| |
| |------ _时钟1_周期事件
| |
| |
======调用的Dll
| |
| |---[dll]------ ZwResumeThread
| |
| |---[dll]------ GetProcAddress
| |
| |---[dll]------ GetModuleHandle
| |
| |---[dll]------ VirtualProtect
| |
| |---[dll]------ CallNextHookEx
| |
| |---[dll]------ VirtualQuery
| |
| |---[dll]------ OpenFileMapping
| |
| |---[dll]------ MapViewOfFile
| |
| |---[dll]------ UnmapViewOfFile
| |
| |---[dll]------ CopyMemory_Write
| |
| |---[dll]------ CopyMemory_Read
| |
| |---[dll]------ GetLocalTime
| |
| |---[dll]------ SetLocalTime
| |
| |---[dll]------ OpenProcess
| |
| |---[dll]------ ZwOpenProcess
| |
| |---[dll]------ FreeLibrary
| |
| |---[dll]------ SendMessage
| |
| |---[dll]------ WriteProcessMemory
| |
| |---[dll]------ WriteProcessMemory字节集
| |
| |---[dll]------ SetWindowsHookEx
| |
| |---[dll]------ UnhookWindowsHookEx
| |
| |---[dll]------ CreateFileMapping
| |
| |---[dll]------ GetCurrentProcessId
| |
| |---[dll]------ LoadLibrary
| |
| |---[dll]------ GetModuleInformation
| |
| |---[dll]------ CreateProcess
| |
| |---[dll]------ MessageBoxTimeout
| |
| |---[dll]------ IsBadCodePtr
| |
| |---[dll]------ 寻找窗口_
| |
| |---[dll]------ 寻找窗口_2
| |
| |---[dll]------ 寻找窗口_3
| |
| |---[dll]------ 寻找子窗口2
| |
| |---[dll]------ CreateMutex
| |
| |---[dll]------ IsWindowVisible
| |
| |---[dll]------ GetMessage
| |
| |---[dll]------ CreateWindowEx
| |
| |---[dll]------ DispatchMessage
| |
| |---[dll]------ 结束线程
| |
| |---[dll]------ ResumeThread
| |
| |---[dll]------ TranslateMessage
| |
| |---[dll]------ TerminateProcess
| |
| |---[dll]------ GetModuleFileName
| |
| |---[dll]------ GetFileTitle
| |
| |---[dll]------ MultiByteToWideChar
| |
| |---[dll]------ WideCharToMultiByte
| |
| |---[dll]------ 读整数内存
| |
| |---[dll]------ SetWindowLong
| |
| |---[dll]------ CallWindowProc
| |
| |---[dll]------ VirtualQueryEx
| |
| |---[dll]------ 读字节集内存
| |
| |---[dll]------ MoveWindow
| |
| |---[dll]------ StrToIntEx
| |
| |---[dll]------ 写整数内存
| |
| |---[dll]------ VirtualProtectEx
| |
| |---[dll]------ CreateFont
| |
| |---[dll]------ DeleteObject
======窗口程序集1
| |
| |------ _按钮1_被单击
| |
| |------ _按钮2_被单击
| |
| |------ __启动窗口_创建完毕
| |
| |
======调用的Dll
| |
| |---[dll]------ InstallHook
| |
| |---[dll]------ UninstallHook
| |
| |---[dll]------ 取自进程ID
======程序集1
| |
| |------ _启动子程序
| |
| |------ MemoryEdit_数据内容被改变
| |
| |------ MemoryEdit
| |
| |------ _编辑框1程序
| |
| |------ _MemoryEdit1_指针位置被改变
| |
| |------ _MemoryEdit2_指针位置被改变
| |
| |------ _启动窗口程序
| |
| |------ _工具条1_被单击
| |
| |------ _HexEdit1_WndProc
| |
| |------ 定位
| |
| |------ 十六到十
| |
| |------ 写内存整数
| |
| |------ 读内存长整数
| |
| |------ 读内存字节集
| |
| |------ 屏蔽按键
| |
| |------ 设置时钟
| |
| |------ 销毁时钟
| |
| |
======调用的Dll
| |
| |---[dll]------ 读整数内存
| |
| |---[dll]------ SetWindowLong
| |
| |---[dll]------ CallWindowProc
| |
| |---[dll]------ VirtualQueryEx
| |
| |---[dll]------ 读字节集内存
| |
| |---[dll]------ MoveWindow
| |
| |---[dll]------ SendMessage
| |
| |---[dll]------ StrToIntEx
| |
| |---[dll]------ 写整数内存
| |
| |---[dll]------ SetTimer
| |
| |---[dll]------ KillTimer
注:本站源码主要来源于网络收集。如有侵犯您的利益,请联系我们,我们将及时删除!
部分源码可能含有危险代码,(如关机、格式化磁盘等),请看清代码在运行。
由此产生的一切后果本站均不负责。源码仅用于学习使用,如需运用到商业场景请咨询原作者。
使用本站源码开发的产品均与本站无任何关系,请大家遵守国家相关法律。