设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 25284|回复: 24
打印 上一主题 下一主题

[原创发布] 启动时获取句柄 | 修改分辨率 | 窗口外观 | 加载字体

[复制链接]

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
跳转到指定楼层
1
发表于 2010-9-27 05:25:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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)

评分

参与人数 2星屑 +820 收起 理由
eve592370698 + 120 毫不犹豫,要是能帮我解决卡屏问题更好了。.
后知后觉 + 700 紫苏大人你太强大了.鼓励III

查看全部评分

Lv3.寻梦者

酱油的

梦石
0
星屑
1030
在线时间
2161 小时
注册时间
2007-12-22
帖子
3271

贵宾

2
发表于 2010-9-27 11:13:03 | 只看该作者
把腳本已備份這東西也kill掉他吧!

点评

夏娜和我都先后写过hangup killer,不过确实可以考虑集成到 DLL 劫持中...  发表于 2010-9-28 06:20
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复 支持 反对

使用道具 举报

Lv1.梦旅人

前进之卒

梦石
0
星屑
55
在线时间
20 小时
注册时间
2010-8-17
帖子
176
3
发表于 2010-9-27 11:43:43 | 只看该作者
本帖最后由 红灯 于 2010-9-27 11:48 编辑

盼着出VX的dll补丁!

点评

嗯,过几天就发布,基本没啥区别,就是 VX 统一用的 Unicode 版 API,需要额外编译一份代理 DLL  发表于 2010-9-28 06:21
开始拼吧!
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
21 小时
注册时间
2007-7-3
帖子
573
4
发表于 2010-9-28 10:40:42 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6855
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

5
发表于 2010-9-28 14:48:13 | 只看该作者
欢迎提出建议,以及可能、希望实现的功能


更改分辨率后(比如800X600).全屏的分辨率也是 800X600.

我把ini塞进exe里去了.
但是 分辨率和字体 无效.
需要在exe旁边再放个Game.ini单独把分辨率和字体写进去才行.
把设置分辨率露在外面感觉怪怪的.字体的话就无所谓了...

点评

感谢!全屏我给忘了,hook ChangeDisplaySettings 应该有戏;ini 那个,如果不想给用户设置,可以自行在 DLL 里硬编码  发表于 2010-9-28 19:57











你知道得太多了

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1347
在线时间
676 小时
注册时间
2009-11-11
帖子
2790
6
发表于 2010-10-1 11:56:24 | 只看该作者
这是高科技

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

菜鸟飞呀飞 该用户已被删除
7
发表于 2010-10-1 13:17:25 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

小小的百鬼夜行<

梦石
0
星屑
54
在线时间
579 小时
注册时间
2010-7-29
帖子
2682

贵宾

8
发表于 2010-10-2 21:47:10 | 只看该作者
跑来支持一下,DLL甚么的对我来说还是天方夜谈哦。
某只PHP/HTML小白鼠→退屈の间


Cause I knew you were trouble when you walked in
So shame is on me now
I flow me to place i ve never been
till you put me down oh
Now Im lying on the cold hard ground
回复 支持 反对

使用道具 举报

Lv3.寻梦者

宛若

梦石
0
星屑
1568
在线时间
526 小时
注册时间
2007-8-19
帖子
1493

极短24参与开拓者

9
发表于 2010-10-2 22:50:26 | 只看该作者
这是因为 rgss10*j.dll 里还有龌龊的勾当

看到龌龊的勾当我喷了- -|||
[url=http://rpg.blue/thread-219730-1-1.html]http://unhero.sinaapp.com/wi.php[/url]
[color=Red]如你所见这是个死坑,没错这就是打我的脸用的[/color]
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
1
星屑
10091
在线时间
4432 小时
注册时间
2005-10-22
帖子
6960

开拓者贵宾

10
发表于 2010-10-3 01:45:46 | 只看该作者
龌龊的东西是美的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-25 08:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表