Project1

标题: RMVA修复$stdin.gets [打印本页]

作者: fux2    时间: 2017-5-10 21:33
标题: RMVA修复$stdin.gets
理论上VA任何版本通用,可以自行魔改到STDIN.gets上,修改最下面一段就可以

RUBY 代码复制
  1. #by Fux2 20170510 21:47:15
  2. #转载请说明出处
  3. class String
  4.  
  5.   def byte_length
  6.     ret = 0
  7.     self.each_byte{ret+=1}
  8.     ret
  9.   end
  10.  
  11.   def address
  12.     [self].pack("p").unpack("L")[0]
  13.   end
  14.  
  15. end
  16.  
  17. module Fux2
  18.   module Win32Tools
  19.  
  20.     ReadProcessMemory = Win32API.new('kernel32','ReadProcessMemory','llpll','l')
  21.     WriteProcessMemory = Win32API.new('kernel32','WriteProcessMemory','llpll','l')
  22.     VirtualProtect = Win32API.new('kernel32','VirtualProtect','lllp','l')
  23.     GetModuleHandle = Win32API.new('kernel32','GetModuleHandle','p','l')
  24.     GetProcAddress = Win32API.new('kernel32','GetProcAddress','lp','l')
  25.     GetCurrentProcess = Win32API.new('kernel32','GetCurrentProcess','v','l')
  26.  
  27.     module_function
  28.     def readmem(addr,buf,len)
  29.       ReadProcessMemory.call(@@hProc,addr,buf,len,0)
  30.     end
  31.  
  32.     def writemem(addr,buf,len)
  33.       WriteProcessMemory.call(@@hProc,addr,buf,len,0)
  34.     end
  35.  
  36.     def unprotect(addr,len)
  37.       VirtualProtect.call(addr,len,0x40,"\0"*4)
  38.     end
  39.  
  40.     def getmodule(name)
  41.       GetModuleHandle.call(name)
  42.     end
  43.  
  44.     def getaddr(dll,name)
  45.       GetProcAddress.call(dll,name)
  46.     end
  47.  
  48.     def init
  49.       @@hProc = GetCurrentProcess.call
  50.       raise "cannot open process" if @@hProc==0
  51.     end
  52.     init
  53.  
  54.   end
  55.   class ReadFileHooker
  56.  
  57.     include Win32Tools
  58.  
  59.     HookCode = ([0xC7,0x44,0x24,0x0C,0x12,0x05,0x00,0x00]+[0]*6).pack("C*")
  60.  
  61.     def SetHookOn
  62.       cad = @code_address
  63.       cal = @code_length
  64.  
  65.       hook_addr = cad-@proc-5
  66.       Win32Tools.writemem(cad+cal-6,@origin_code_readfile,6)
  67.       Win32Tools.writemem(@proc,[0xE9,hook_addr,0x90].pack("ClC"),6)
  68.     end
  69.  
  70.     def SetHookOff
  71.       return unless @origin_code_readfile
  72.       Win32Tools.writemem(@proc,@origin_code_readfile,6)
  73.     end
  74.  
  75.     def initialize
  76.       dll = Win32Tools.getmodule("kernel32")
  77.       @proc = Win32Tools.getaddr(dll,"ReadFile")
  78.       @code_address = HookCode.address
  79.       @code_length = HookCode.byte_length
  80.       @origin_code_readfile = "\0"*6
  81.       Win32Tools.readmem(@proc,@origin_code_readfile,6)
  82.       unprotect(@code_address,@code_length)
  83.     end
  84.  
  85.   end
  86. end
  87.  
  88. class << $stdin
  89.   def hack
  90.     @tool = Fux2::ReadFileHooker.new
  91.     alias _gets gets
  92.     def gets
  93.       @tool.SetHookOn
  94.       ret = _gets
  95.       @tool.SetHookOff
  96.       return ret
  97.     end
  98.   end
  99. end
  100.  
  101. $stdin.hack

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


有gets这么方便的函数,干啥要自己去造轮子
作者: fgh445566191    时间: 2017-7-30 20:41
表示无法运行出错
作者: 陈大帅帅帅哥    时间: 2017-7-30 22:42
这个脚本怎么用的啊
作者: fux2    时间: 2017-7-30 23:02
陈大帅帅帅哥 发表于 2017-7-30 22:42
这个脚本怎么用的啊

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




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1