|
- .版本 2
- .支持库 spec
- .程序集 窗口程序集_启动窗口
- .程序集变量 进程句柄, 整数型
- .子程序 __启动窗口_创建完毕
- 进程句柄 = 0 ' ???没有句柄?我搜什么?
- .子程序 搜索, 整数型
- .参数 通配符, 文本型
- .局部变量 搜索内容, 字节集, , , 欲搜索的内容 其他类型-需自行转换为字节集类型
- .局部变量 字节集段, 通配符集, , "0"
- .局部变量 长度, 整数型
- .局部变量 内存地址, 整数型
- .局部变量 内存块信息, MEMORY_BASIC_INFORMATION
- .局部变量 数据缓冲区, 字节集
- .局部变量 找到位置, 整数型
- .局部变量 计次, 整数型
- .局部变量 算偏移, 整数型
- .局部变量 完全匹配, 逻辑型
- .如果真 (进程句柄 = 0)
- 返回 (0)
- .如果真结束
- 搜索内容 = 通配符处理 (通配符, 字节集段, 算偏移)
- 长度 = 取字节集长度 (搜索内容)
- .判断循环首 (VirtualQueryEx (进程句柄, 内存地址, 内存块信息, 28) ≠ 0)
- .如果真 (内存块信息.Protect = 4 且 内存块信息.Type = 131072)
- 数据缓冲区 = 取空白字节集 (内存块信息.RegionSize)
- .如果真 (ReadProcessMemory (进程句柄, 内存地址, 数据缓冲区, 内存块信息.RegionSize, 0))
- 找到位置 = 寻找字节集 (数据缓冲区, 搜索内容, )
- .判断循环首 (找到位置 ≠ -1)
- 完全匹配 = 真
- .计次循环首 (取数组成员数 (字节集段), 计次)
- .如果 (数据匹配 (数据缓冲区, 找到位置, 字节集段 [计次]))
- .否则
- 完全匹配 = 假
- .如果结束
- .计次循环尾 ()
- .如果真 (完全匹配)
- 调试输出 (“找到了一个地址 > ” + 取文本右边 (“0000000” + 取十六进制文本 (内存地址 + 找到位置 - 算偏移), 8))
- .如果真结束
- 找到位置 = 寻找字节集 (数据缓冲区, 搜索内容, 找到位置 + 长度)
- .判断循环尾 ()
- .如果真结束
- .如果真结束
- 内存地址 = 内存地址 + 内存块信息.RegionSize
- 处理事件 ()
- .判断循环尾 ()
- 返回 (0)
- .子程序 数据匹配, 逻辑型
- .参数 缓冲区数据, 字节集
- .参数 找到位置, 整数型
- .参数 字节集段, 通配符集
- .局部变量 长度, 整数型
- 长度 = 取字节集长度 (字节集段.数据)
- 返回 (取字节集中间 (缓冲区数据, 字节集段.位置 + 找到位置, 长度) = 字节集段.数据)
- .子程序 通配符处理, 字节集
- .参数 通配符, 文本型
- .参数 处理好的字节集组, 通配符集, 参考 数组
- .参数 计算偏移用的, 整数型, 参考
- .局部变量 待处理文本, 文本型
- .局部变量 文本位置, 整数型
- .局部变量 任何字节, 逻辑型
- .局部变量 当前字节, 文本型
- .局部变量 临时, 通配符集
- .局部变量 数组, 通配符集, , "0"
- .局部变量 寻找的内容, 字节集
- .局部变量 计次, 整数型
- .局部变量 最长长度, 整数型
- .局部变量 当前长度, 整数型
- .局部变量 数组位置, 整数型
- ' 先把通配符转为字节集并记录位置
- 待处理文本 = 删全部空 (通配符)
- .变量循环首 (1, 取文本长度 (待处理文本), 2, 文本位置)
- 当前字节 = 取文本中间 (待处理文本, 文本位置, 2)
- .如果 (当前字节 = “??”)
- .如果真 (临时.数据 ≠ { })
- 临时.位置 = 文本位置 ÷ 2 - 取字节集长度 (临时.数据) + 1
- 加入成员 (数组, 临时)
- 临时.数据 = { }
- .如果真结束
- .否则
- 临时.数据 = 临时.数据 + 到十进制 (当前字节)
- .如果结束
- .变量循环尾 ()
- .如果真 (临时.数据 ≠ { })
- 临时.位置 = 文本位置 ÷ 2 - 取字节集长度 (临时.数据) + 1
- 加入成员 (数组, 临时)
- .如果真结束
- ' 然后筛选最少结果的字节集段,只是简单演示我知道我这种方法有时候会拖累搜索的速度
- ' 但只是做个例子而已,之后你们可以自己优化
- .计次循环首 (取数组成员数 (数组), 计次)
- 当前长度 = 取字节集长度 (数组 [计次].数据)
- .如果真 (最长长度 ≤ 当前长度)
- .如果 (最长长度 = 当前长度)
- .判断开始 (当前长度 ≥ 4)
- .如果真 (到整数 (数组 [计次].数据) > 到整数 (寻找的内容))
- 寻找的内容 = 数组 [计次].数据
- 数组位置 = 计次
- .如果真结束
- .判断 (当前长度 ≥ 2)
- .如果真 (到短数 (数组 [计次].数据) > 到短数 (寻找的内容))
- 寻找的内容 = 数组 [计次].数据
- 数组位置 = 计次
- .如果真结束
- .默认
- .如果真 (数组 [计次].数据 [1] > 寻找的内容 [1])
- 寻找的内容 = 数组 [计次].数据
- 数组位置 = 计次
- .如果真结束
- .判断结束
- .否则
- 寻找的内容 = 数组 [计次].数据
- 最长长度 = 取字节集长度 (数组 [计次].数据)
- 数组位置 = 计次
- .如果结束
- .如果真结束
- .计次循环尾 ()
- .如果真 (数组位置 ≠ 0)
- 计算偏移用的 = 数组 [数组位置].位置
- 删除成员 (数组, 数组位置, 1)
- .如果真结束
- ' 后面还有几段过滤的,上面的代码是减少搜索得到的结果 简单粗暴
- ' 至于下面怎么过滤优化自己看着办吧 | 第一个 万一遇到最长的字节集 全部是0怎么办? 第二个 最长的不一定结果最少的(同上) 第三个 最长的搜索效率不一定是最快的
- ' 接下来就是调整好其他字节集段的位置
- .计次循环首 (取数组成员数 (数组), 计次)
- 数组 [计次].位置 = 数组 [计次].位置 - 计算偏移用的
- .计次循环尾 ()
- ' 完毕!
- 处理好的字节集组 = 数组
- 返回 (寻找的内容)
- .子程序 到十进制, 字节集
- .参数 str, 文本型
- .局部变量 a, 文本型
- .局部变量 b, 文本型
- .局部变量 c, 文本型
- a = 到大写 (str)
- b = 取文本中间 (a, 2, 1)
- .如果 (b = “”)
- b = 取文本左边 (a, 1)
- .否则
- c = 取文本左边 (a, 1)
- .如果结束
- 返回 (到字节集 (到字节 ((寻找文本 (“0123456789ABCDEF”, c, , 真) - 1) × 16 + 寻找文本 (“0123456789ABCDEF”, b, , 真) - 1)))
- .子程序 到整数, 整数型
- .参数 字节集, 字节集
- 返回 (取字节集数据 (取字节集左边 (字节集, 4), #整数型, ))
- .子程序 到短数, 整数型
- .参数 字节集, 字节集
- 返回 (取字节集数据 (取字节集左边 (字节集, 2), #短整数型, ))
- .子程序 _按钮1_被单击
- 搜索 (编辑框1.内容) ' 编辑框,按钮自行创建!
复制代码
|
|