| 赞 | 486 |
| VIP | |
| 好人卡 | |
| 积分 | 497 |
| 经验 | |
| 最后登录 | 2026-9-30 |
| 在线时间 | 7947 小时 |
老黄鸡
- 梦石
- 4
- 星屑
- 45692
- 在线时间
- 7947 小时
- 注册时间
- 2009-7-6
- 回帖
- 13335
   
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
此脚本面向脚本开发者,不能直接使用。
附代码。
[fold=代码]- class String
-
- def byte_length
- ret = 0
- self.each_byte{ret+=1}
- ret
- end
-
- def address
- [self].pack("p").unpack("L")[0]
- end
-
- end
- module Fux2
- module Win32Tools
- RtlMoveMemoryLP = Win32API.new('kernel32','RtlMoveMemory','lpl','l')
- RtlMoveMemoryPL = Win32API.new('kernel32','RtlMoveMemory','pll','l')
- GetModuleHandle = Win32API.new('kernel32','GetModuleHandle','p','l')
- VirtualProtect = Win32API.new('kernel32','VirtualProtect','lllp','l')
-
- def self.readmem(buf,addr,len)
- RtlMoveMemoryPL.call(buf,addr,len)
- end
-
- def self.writemem(addr,buf,len)
- RtlMoveMemoryLP.call(addr,buf,len)
- end
-
- def self.unprotect(addr,len)
- VirtualProtect.call(addr,len,0x40,"\0"*4)
- end
-
- def self.init
- @@hModule = GetModuleHandle.call("RGSS300.dll")
- end
-
- def self.module_handle
- @@hModule
- end
-
- init
- end
- module Exit_Hook
-
- @@hwnd = 0
-
- Addr_Close_Catch = Win32Tools.module_handle+0x17F396
- Addr_Eval = Win32Tools.module_handle+0xC580
- Addr_Hwnd = Win32Tools.module_handle+0x25EB00
-
- Code_Close_Catch = "\x90"*23
- Str_Close_Catch = "Fux2::Exit_Hook.exit_func"
-
- def self.unprotectfunc(func)
- Fux2::Win32Tools.unprotect(func.address,func.byte_length)
- end
-
- def self.unprotect_all
- unprotectfunc(Code_Close_Catch)
- end
-
- def self.hook_exit
- cad = Code_Close_Catch.address
- cal = Code_Close_Catch.byte_length
- rem = "\0"*5
- Fux2::Win32Tools.readmem(rem,Addr_Close_Catch,5)
- rem = rem.unpack("C*")
- retn_addr = Addr_Close_Catch+5-cad-cal
- hook_addr = cad-Addr_Close_Catch-5
- Fux2::Win32Tools.writemem(Addr_Close_Catch,[0xE9,hook_addr].pack("CL"),5)
- eval_addr = Addr_Eval-cad-10
- hook_code = [0x68,Str_Close_Catch.address,0xE8,eval_addr,0x83,0xC4,0x4,*rem,0xE9,retn_addr].pack("CLCLCCCCCCCCCL")
- Fux2::Win32Tools.writemem(cad,hook_code,cal)
- end
-
- def self.get_hwnd
- rem = "\0"*4
- Fux2::Win32Tools.readmem(rem,Addr_Hwnd,4)
- base_addr = rem.unpack("L")[0]
- Fux2::Win32Tools.readmem(rem,base_addr+8,4)
- @@hwnd = rem.unpack("L")[0]
- end
-
- def self.hwnd
- @@hwnd
- end
-
- def self.exit_func
- msgbox "退出"
- end
-
- hook_exit
-
- end
- end
复制代码 [/fold]
插入脚本到游戏工程内,游戏进程结束时会执行Fux2::Exit_Hook.exit_func方法,
当然你可以通过修改Str_Close_Catch的值来决定eval的内容。
注意:
1.仅限于RGSS300.dll保证有效,其他版本未测试。
2.并不能阻止游戏退出,退出方法若有错误,不会产生提示。
3.若游戏被外部软件通过结束进程的方法终止,退出方法也不会被执行。
这个小脚本一般配合系统变量之类的脚本使用,游戏退出时做一些变量记录。
比如记录游戏玩的次数,当前是否为第一次打开游戏的标志,甚至某些游戏做及时存档也是可以的。 |
评分
-
查看全部评分
|