社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 道具中心
主题 : VX的dll改造教程。。。一年多了竟然没有忘记,竟然有耐心写这个玩意
secondsen 离线
级别: 总版主
显示用户信息 
0  发表于: 2011-04-29   
来源于 个人创意 分类

VX的dll改造教程。。。一年多了竟然没有忘记,竟然有耐心写这个玩意

开始。。。MS是鄙人最先发现的怎么破解VX的dll的分辨率大小限制。。嗯嗯。。。应该是这样。。。。

声明:禁止转载

正文——基础篇(第一帖扫盲)

开始吧!

那么作为扫盲贴,希望没基础的同学仔细阅读。当然我偶尔会语无伦次,还望见谅

先给大家说说教程内容(也就是修改些什么)
1.屏蔽F1,F2,Alt+Enter 热键
2.屏蔽 F12 重新运行游戏的功能 
3.修改分辨率大小的限制 
4.修改Bitmap类尺寸的限制 

其次呢,说说都用什么工具
如果dll没有脱壳的话。。那么使用peid 或者 fastscaner 查壳
然后下载对应的脱壳机,给dll脱壳

图片为 fastscaner 查壳图

然后是重要的,我们改 dll 需要的工具

1.ODB
2.U32
3.Restorator

开始扫盲!
先说说 字节 吧。
什么是字节??。。。其实我真说不清楚。。。学过点编程的人都知道 0xFF就是一个字节 8位!
什么是 “位” ? FUCK,真不知道怎么说好。。。电脑计算,存储都是2进制的。。也就是电脑其实是0和1的世界。。。比如 十进制 15 电脑的存储 位 1111  <-这里一个1就是1位
八位就是一个字节!也就是0b1111  1111 换成16进制 0xFF

再说说存储在dll中的常量。。。常量的概念自己找去吧。。简单而又不准确的说,就是一个不会变的数
那么大家知道32位机整形 Int 是 32位的也就是4字节 0xFF FF FF FF那么怎么存的呢??
三个字!倒着存!!!!
那么一个十进制的数 480 怎么存呢??先要换成 16进制的 0x00 00 01 E0
然后倒着存放!也就是存在文件中是 E0 01 00 00 这样的!
那么 480 我们想改成 768 (0x00 00 03 00)怎么办?
很简单 E0 01 00 00 改成 00 03 00 00 只要注意 倒着存放就可以了!

扫盲完毕!下边的帖子就不说怎么改数字了,自己根据此帖改,我只说查找方法了。
[ 此帖被secondsen在2014-04-09 19:15重新编辑 ]
描述:FastScaner查壳
图片:查壳.png
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
secondsen 离线
级别: 总版主
显示用户信息 
1  发表于: 2011-04-29   
正文——屏蔽和修改 F1 F2 Alt+Enter方法
 
这一修改只需要用restorator就可以了 
先说,为什么要改这三个。。。有的人可能就像全屏,不希望自己的游戏进入窗口模式 那就要屏蔽掉 Alt+Enter
有的人要全键盘 操作,用了全键盘脚本,但是一点击F1 就弹出窗口,导致F1没法用,那就需要屏蔽掉F1.
 
下面是教程
 
结合图片说比较好。。
1.先用restorator打开RGSS2XXX.dll
2.找到“快捷键”这一栏,进入分项,发现“102”的项目。点击之
3.右边出现了文本。。这就可以了!
4.资源->导出->导出为->导出为     导出为102.txt   文件存放的文件夹自己要记住!
5.修改这个102.txt
6.第一行为 "F1"  二行"F2" 三行 "Alt+Enter"
 
我来说屏蔽的方法   比如 要屏蔽F1 功能 那么可以 将"F1" 改成"\0x00"
修改方法 比如 F1 想改成 ctrl+F1 那就将 "F1" 改成 "Ctrl+\0x00F1\0x00"就可以了!
修改或者屏蔽的方法以此类推!
 
7.资源->导入->导入   把我们改好的 102.txt导入就可以了,保存一下,完成!
[ 此帖被secondsen在2013-08-17 09:31重新编辑 ]
描述:打开dll,找"快捷键"
图片:restorator打开dll.png
描述:导出
图片:导出.png
描述:修改
图片:更改快捷键.png
描述:更改后到入102.txt的效果
图片:更改后导入.png
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
secondsen 离线
级别: 总版主
显示用户信息 
2  发表于: 2011-04-29   
正文——屏蔽F12

目前我没有做实验看看能不能把F12修改成 Crtl+F12  但是 如果只是一个按键的话可以修改 比如改成 F11等等,如果改成两个按键的话,我觉得没啥可能性。。。嗯嗯

开始!
1.用ODB打开RGSS20xx.dll
2(第一种方法).全局搜索变量 123(十进制) 或者是 7B(16进制)  这个数字代表的是 F12,大家可以查阅一下键盘每个键子对应的数字。。。google或者baidu“键盘码”就行。
2(第二种方法)ctrl+F 搜索 push 7B找到和下面相同的指令就可以。。(关于push 下面有说明) 
3.进入第一个选项就是。。。

为什么说第一个就是呢??我把这一段 写出来讲解吧

    偏移量      机器码                      汇编指令                                                                       注释
1000B100    6A 7B                       push 7B                                                             压栈F12键盘码VK_F12
1000B102    FF15 D4F20F10    dword ptr[<&user32.GetAsyncKeyState>]    GetAsyncKeyState 
1000B108    66:85C0                   text ax,ax

就这些吧,全局搜索0x7B 为什么说这个就是 F12 而别的不是  push 7B 这个指令搜出来很多个啊,怎么确定的?答案就在 1000B102这个指令上,GetAsyncKeyState表示的是 获取按键状态也就是 这个键子是按下的,还是松开的那么push 7B就是个这个函数传参数的来检测F12是否被按下,汇编给函数 传参都是用push压栈的,多个参数逆着压。。

关于 压栈 这个是基础了我不细说了,简单说明吧。。。

压栈push 读取pop这两个指令是成对的,push是寄存数据,pop是从这之中读数据,那么是什么规则呢??“放盘子规则
现在,我们有一组数据0,1,9,2
压栈
push 0
push 1
push 9
push 2

这样数据的存放 是 (head 在这里)2 9 1 0 看到了吧 后存放的数据放在前面,这也是问什么是压栈了,因为后来的数据要把以前的数据压下去,自己放在最上面,就像放盘子一样,要不停的往上摞

pop呢是取数据,从头开始取  取的顺序自然是 2 9 1 0 了,因为要从最上面取,这和盘子是一样的,摞完的盘子,我们也都是从最上面开始拿啊!

关于传参 函数传参是 push 压栈 来完成的如果一个函数
C语言为例

int tmp_Func(int a,int b,int,c)
这有3个参数,比如a = 1,b = 2,c = 3将参数传给函数,那么压栈怎么压?
没错,逆压
push 3
push 2
push 1
这样的。。那么像我们现在遇到的情况 只有一个参数,这就很明了了。。就是一个0x7B,

好了,扫盲结束。继续话题
我们这就找了到了判断 F12 是否按下的指令了
4.那么用 U32 打开 RGSS20xx.dll 找到偏移量 0000B100  <-怎么找,请结合图片
5.找到 6A 7B
6.吧 7B 改成 00 就能屏蔽 F12重启游戏的功能了,如果想改成别的按键只要改成对应的键盘码就可以了。关闭ODB,U32保存。
7.拷贝到工程下测试吧!
完毕!


[ 此帖被secondsen在2013-08-17 09:53重新编辑 ]
描述:ODB查找位置
图片:搜7B.png
描述:U32找到数据更改之
图片:U32找7B.png
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
secondsen 离线
级别: 总版主
显示用户信息 
3  发表于: 2011-04-29   
正文——修改屏幕大小限制

那么。最后一项了,突破屏幕限制。。。

开工!

1。用ODB打开dll然后鼠标右击空白位置。。查找常量。。。参看前两幅图,指导你怎么找常量。。。(ODB查找常量01E.png ODB查找常量.png 

2。搜索之后会出现这样的窗口,显示所有含有1E0常量的汇编指令。参看图 ODB查找常量结果.png 

3。观看这个结果。。我们要找什么呢??参看上一章,push
没错,还是pushpush 1E0,为什么呢??
上一张就说过传参用push.
push 1E0
push 280
压栈传参给窗口创立的函数。
但是显然push是不全面的,为色很难么??我们用RMVX的都知道用默认的函数调整窗口大小的时候,如果大于640X480的话会强制限制在640X480.
C风格示意代码
复制代码
  1. void resize_window(int width.int height)
  2. {
  3.     if (width>640)
  4.         width = 640;
  5.     if (height>480)
  6.         height = 480;
  7. .............省略
  8. }

大家看到了吧,就是类似于这样的校验。
既然有if判断,那么一定存在 cmp的汇编指令,配合jzjn等等的指令
那么太幸运了,在搜索结果中只有一个cmp!那么就是这个了!。

那么,以下我就以这个为例说说。。。另外参看需要改的地方.png 这个图里的是我们需要修改的东西,方法同我要讲述的内容。

4。那么我们双击cmp的搜索结果,进入这一段代码!

 

偏移量                机器码                        汇编指令 

10001BDE        81FA 80020000        cmp edx,280

10001BE4         7E 05                           jle short 10001BEB

10001BE6         BA 80020000             mov edx,280                  <====# code 1

10001BEB        81FE E0010000        cmp esi,1E0

10001BF1         7E 05                           jle short 10001BF8

10001BF3         BE E0010000            mov esi,1E0                   <====# code 2

 

code 1对应

if(width>640)

    width = 640;

 

code 2对应

if(height>480)

    height= 480;

 

那么就明白了吧,只要把这4个常量改成我们需要的数字就可以了!然后记下偏移量,参看记录.png 


5。用UE打开dll,找到偏移量。参看图片UE找到位置.png ,图片指引你。

 

6。把找到的常量改成我们需要的数字。。改法参看第一章,另外参看图片已经改的地方.png 

 

7。另外各位看官自己根据需要改的地方.png 来把其他地方都改了,每个1E0附近必然有对应的280,这是成对出现的,一个是宽,一个是高,我将这两个数改成400 300了。。记住都是16进制的,对应的10进制是1024X768.

 

终于完事了!谢幕! 
应承的事情都完成了,我终于可以华丽的转身了。


 


[ 此帖被secondsen在2013-08-17 09:55重新编辑 ]
图片:ODB查找常量01E.png
图片:ODB查找常量.png
图片:UE找到位置.png
图片:记录.png
图片:需要改的地方.png
图片:ODB查找常量结果.png
图片:已经改的地方.png
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
secondsen 离线
级别: 总版主
显示用户信息 
4  发表于: 2011-04-29   
最后补充一个修改bitmap尺寸的方法。。。


跟前面一样。。


bitmap类的最大尺寸是2048×2048 = xxxx,忘记了。。只记得16进制下是0x400000


在ollyice中查找所有变量 填 0x400000


有一行 cmp 400000 就是这个了 偏移量是 0x41xx(忘记了)


在U32中找到所在位置,吧 00004000 改成 FFFFFFFF 再试试bitmap的尺寸吧!是不是没有限制了呢!!!!

另一个修改方法是(更彻底),吧00004000后面的7E改成EB, 也就是汇编指令 jle改成jmp强制跳转,这样就完全的屏蔽了尺寸判断!

完结!因为是最近突发奇想的,所以才完成。。。










最后!
先上一个dll

1024X768

F1 F2 改成 ctrl+F1 ctrl+F2

屏蔽 F12 和Alt + Enter


dll没有加壳
[ 此帖被secondsen在2014-04-09 19:35重新编辑 ]
附件: RGSS202E.rar (796 K) 下载次数:9 下载该附件需要支付1积分
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
daipeng76 离线
级别: ②入门
显示用户信息 
5  发表于: 2011-05-04   
不要只说一半呀呀?说完了,咔嚓吧
secondsen 离线
级别: 总版主
显示用户信息 
6  发表于: 2011-05-04   
来了来了。。。我也是有自己的事情啊。。。。OTZ。。。。
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
secondsen 离线
级别: 总版主
显示用户信息 
7  发表于: 2011-05-04   
最后的篇章发了N次了,才发出来。。OTZ,着什么破网络。。。但是总算是弄完了。。。汗。。。我想我身上仅存的价值也发散出来了
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
daipeng76 离线
级别: ②入门
显示用户信息 
8  发表于: 2011-05-05   
回 7楼(secondsen) 的帖子
这回有点相信楼主是最先发现破解VX的dll的分辨率大小限制,我手头上有3个dll, 1024,800,640,经过比对发觉1024和640修改的内容就是楼主说的(前几天等不及教程自己比对),800的修改内容有点出入,也因此800的dll文件才有点显示问题,教程很棒,对我来说“16进制倒着存放”这句话很有启发,怪不得,当初怎么也看不懂。楼主啥时能拜读下你的vx作品,相信你的大作一定很特别
secondsen 离线
级别: 总版主
显示用户信息 
9  发表于: 2011-05-05   
我似乎说过移动硬盘报销,东西全没了的话了吧。。。。我已经不用RM了。。。。都已经一年多了。。。

我写的这些东西也都是当初我摸索出来的而已,我回来发现有些忘记发了,就补上。。。

以前倒是做过一些东西。。。VX半成品pixel+ABS但是没有发,也有一些工程。。无非就是pixelmovent 多动画重叠,翻书菜单,扩充VX地图图块。。。这些都能在本区找到。。。我只是做的时候是做成一个工程的,然后拆开了,发单个的教程。。。汗,可惜我的工程没了,我花了很多心血做的地图,关于地图,我敢自信的说,几乎没人做得比我的好,将近200幅地图啊!
我就是你们的神,庶民们,追随我吧!跟着我一起拖后腿!
拖后腿的人发勋章!
描述
快速回复

认证码:

验证问题:
22-5=?,答案:17 正确答案:17
按"Ctrl+Enter"直接提交