赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 紫苏 于 2010-9-27 13:01 编辑
灵感来自最近偶然看到的夏娜的 RGSS102J.dll 补丁:
http://rpg.blue/forum.php?mod=viewthread&tid=127979
http://rpg.blue/thread-118633-1-1.html
这个工程实现了在启动时准确获取句柄、修改游戏窗口分辨率、窗口外观以及加载字体的功能,通过代理 DLL 劫持了 kernel32 和 user32 这两个系统 DLL,而其中最重要的是在 kernel32 里的 LoadLibrary 或 GetProcAddress上安装钩子,因为 RM 通过这两个函数获得的地址调用了大量函数,而这些函数并不在对象文件的导入表中
1、获取句柄
hook user32 的 CreateWindowEx,返回的时候保存一个全局的句柄变量,然后再提供给 Ruby 一个接口获取这个变量。于是这个脚本可以退休了:
http://rpg.blue/forum.php?mod=viewthread&tid=133018
实际上这个脚本也确实有潜在的问题,GetWindow 在极端场合下会引起无限循环,和这个直接劫持 API 的质量没法比
2、修改分辨率
这个和目前的分辨率脚本相比之下,优势在于启动时就修改,而不是等到 RGSS 开始执行脚本时才修改。RM 的 Game.exe 创建窗口的过程是:
设计窗口类 WNDCLASS;
RegisterWindow 注册窗口类;
CreateWindowEx 创建窗口;
通过 SetRect 把一个 RECT 矩形结构体初始化为 (0, 0, 640, 480);
通过以上矩形,AdjustWindowRect 计算出 640*480 的客户区需要多大的窗口尺寸;
GetSystemMetric 获取系统屏幕等信息,计算窗口居中的坐标;
SetWindowPos 移动窗口,并调整尺寸
到这里 Game.exe 就完事儿了,但如果你只 hook 了这些函数中的一个来改分辨率,结果是一会儿又被改回了 640*480。这是因为 rgss10*j.dll 里还有龌龊的勾当,它会第二次调用 SetWindowPos 移动窗口并修改尺寸,但这一点从它的导入表里看不出来,因为它是通过 GetProcAddress 获取的函数地址来调用 API 的。于是首先要 hook Kernel 的 GetProcAddress,劫持 SetWindowPos,然后把调用转移到 user32 的代理 DLL 中。两边都劫持后,启动时修改分辨率就实现了
3、修改窗口外观
仍然是 Hook CreateWindowEx,把传递进来的 dwStyle 参数和 dwExStyle 胡改一气即可。范例工程里改了几个,但并没有全部囊括,有心人可以自行添加
4、加载字体
Kernel32 必然是首先映射到进程地址空间的 DLL,所以在 kernel32 的代理 DLL 的入口函数里调用 AddFontResourceEx 即可
以上功能中需要配置参数都可以在 Game.ini 中调整,内含详细注释。kernel32 的 代理 DLL 是 kernel33,user32 自然就是 user33。源代码在工程的 src 目录下,比较长。就不发到帖子里了,可以自行 build
范例使用的是 RGSS103J.DLL,如果你希望使用 1.02 的 DLL,那可以用十六进制编辑器把 rgss102j.dll 里的 kernel32.dll 改为 kernel33.dll(Game.exe 也是相同的改法,同时还可以改 user32 为 user33)。否则可以直接拷贝 Game.exe、Game.ini、user33.dll、kernel33.dll 到你的工程,覆盖原文件。如果你不需要范例中的字体,那可以修改 Game.ini 中的字体设置为空
这四个功能都是以前有过脚本,但多少都有点问题的,所以先行实现,但通过 DLL 劫持,可能性还有很多。proc.txt 里包含了 RMXP 通过 GetProcAddress 调用的函数(仅含“第一层”,不包含 LoadLibrary 获取真实 user32 的 GetProcAddress 地址然后又通过它调用的“第二层”函数)
欢迎提出建议,以及可能、希望实现的功能
Project4.rar
(4.01 MB, 下载次数: 13729)
|
评分
-
查看全部评分
|