查看: 3054|回复: 10

[RMVA发布] RMVA修复$stdin.gets

[复制链接]

老黄鸡

梦石
4
星屑
45699
在线时间
7948 小时
注册时间
2009-7-6
回帖
13337

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2017-5-10 21:33:51 | 显示全部楼层 |阅读模式

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

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

×
理论上VA任何版本通用,可以自行魔改到STDIN.gets上,修改最下面一段就可以

[pre lang="ruby"]
#by Fux2 20170510 21:47:15
#转载请说明出处
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

    ReadProcessMemory = Win32API.new('kernel32','ReadProcessMemory','llpll','l')
    WriteProcessMemory = Win32API.new('kernel32','WriteProcessMemory','llpll','l')
    VirtualProtect = Win32API.new('kernel32','VirtualProtect','lllp','l')
    GetModuleHandle = Win32API.new('kernel32','GetModuleHandle','p','l')
    GetProcAddress = Win32API.new('kernel32','GetProcAddress','lp','l')
    GetCurrentProcess = Win32API.new('kernel32','GetCurrentProcess','v','l')

    module_function
    def readmem(addr,buf,len)
      ReadProcessMemory.call(@@hProc,addr,buf,len,0)
    end
   
    def writemem(addr,buf,len)
      WriteProcessMemory.call(@@hProc,addr,buf,len,0)
    end
   
    def unprotect(addr,len)
      VirtualProtect.call(addr,len,0x40,"\0"*4)
    end

    def getmodule(name)
      GetModuleHandle.call(name)
    end
   
    def getaddr(dll,name)
      GetProcAddress.call(dll,name)
    end
   
    def init
      @@hProc = GetCurrentProcess.call
      raise "cannot open process" if @@hProc==0
    end
    init

  end
  class ReadFileHooker
   
    include Win32Tools
   
    HookCode = ([0xC7,0x44,0x24,0x0C,0x12,0x05,0x00,0x00]+[0]*6).pack("C*")

    def SetHookOn
      cad = @code_address
      cal = @code_length

      hook_addr = cad-@proc-5
      Win32Tools.writemem(cad+cal-6,@origin_code_readfile,6)
      Win32Tools.writemem(@proc,[0xE9,hook_addr,0x90].pack("ClC"),6)
    end
   
    def SetHookOff
      return unless @origin_code_readfile
      Win32Tools.writemem(@proc,@origin_code_readfile,6)
    end

    def initialize
      dll = Win32Tools.getmodule("kernel32")
      @proc = Win32Tools.getaddr(dll,"ReadFile")
      @code_address = HookCode.address
      @code_length = HookCode.byte_length
      @origin_code_readfile = "\0"*6
      Win32Tools.readmem(@proc,@origin_code_readfile,6)
      unprotect(@code_address,@code_length)
    end
   
  end
end

class << $stdin
  def hack
    @tool = Fux2::ReadFileHooker.new
    alias _gets gets
    def gets
      @tool.SetHookOn
      ret = _gets
      @tool.SetHookOff
      return ret
    end
  end
end

$stdin.hack[/pre]

评分

参与人数 1梦石 +1 收起 理由
taroxd + 1 醋虾

查看全部评分

RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
梦石
0
星屑
1580
在线时间
1564 小时
注册时间
2008-7-30
回帖
4207

贵宾

发表于 2017-6-8 11:39:45 | 显示全部楼层
好久没上6R了,不知道RM系列现在是个啥情况。我都怀疑VA是否有调用$stdin.gets的需要,我记得各种输入都是RGSS自己魔改的吧?

点评

难得见到DeathKing前辈www  发表于 2017-6-15 22:17

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复

使用道具 举报

老黄鸡

梦石
4
星屑
45699
在线时间
7948 小时
注册时间
2009-7-6
回帖
13337

MZ评测员RM创作大赛01组委会开拓者贵宾

 楼主| 发表于 2017-6-8 11:51:48 | 显示全部楼层
DeathKing 发表于 2017-6-8 11:39
好久没上6R了,不知道RM系列现在是个啥情况。我都怀疑VA是否有调用$stdin.gets的需要,我记得各种输入都是R ...


有gets这么方便的函数,干啥要自己去造轮子
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

梦石
0
星屑
70
在线时间
58 小时
注册时间
2012-9-24
回帖
5
发表于 2017-7-30 20:41:25 | 显示全部楼层
表示无法运行出错

点评

具体错误提示呢  发表于 2017-7-30 23:01
回复

使用道具 举报

梦石
0
星屑
4657
在线时间
1069 小时
注册时间
2013-3-28
回帖
309

开拓者

发表于 2017-7-30 22:42:14 | 显示全部楼层
这个脚本怎么用的啊
回复

使用道具 举报

老黄鸡

梦石
4
星屑
45699
在线时间
7948 小时
注册时间
2009-7-6
回帖
13337

MZ评测员RM创作大赛01组委会开拓者贵宾

 楼主| 发表于 2017-7-30 23:02:30 | 显示全部楼层

插入后生效,$stdin.gets修复,标题写的很明确了呀。

点评

可我很想知道嘛,查又查不到  发表于 2017-7-31 10:39
不知道的话没必要使用这个脚本辣。  发表于 2017-7-31 00:08
$stdin.gets是什么  发表于 2017-7-30 23:22
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部