Project1

标题: 注册表v0.1 [打印本页]

作者: hide秀    时间: 2008-8-14 17:40
标题: 注册表v0.1
本帖最后由 后知后觉 于 2009-8-11 00:03 编辑

注:这个脚本只给一些对游戏制作有特殊要求的人

在完善RGSSHIDE的时候
发现如果一些RTP素材没有打入RGSSHIDE
则读取RTP 但是RTP的默认路径在每个系统下的目录都不一样
如window,lunix,vista等。。。。
怎么办呢,还好安装RM的时候在注册表中写入了个安装路径
没办法只好获取注册表来获取RTP路径
这个脚本只给出了一个获取RTP路径范例
其他的注册表操作 比如新建,删除,写入等 没有给出范例 因为风险较大
这些操作 如对注册表不熟悉的人 请谨慎使用~
改出问题了别pia我{/cy}

------------获取RTP路径的范例-----------------
http://rpg.blue/upload_program/f ... 秀秀_99135614.rar
-----------------------------------------------

module Regedit
  HKEY_CLASSES_ROOT         = 0x80000000
  HKEY_CURRENT_USER         = 0x80000001
  HKEY_LOCAL_MACHINE        = 0x80000002
  HKEY_USERS                = 0x80000003
  HKEY_PERFORMANCE_DATA     = 0x80000004
  HKEY_PERFORMANCE_TEXT     = 0x80000050
  HKEY_PERFORMANCE_NLSTEXT  = 0x80000060
  HKEY_CURRENT_CONFIG       = 0x80000005
  HKEY_DYN_DATA             = 0x80000006
  
  STANDARD_RIGHTS_READ      = 0x00020000
  STANDARD_RIGHTS_WRITE     = 0x00020000
  KEY_QUERY_VALUE           = 0x0001
  KEY_SET_VALUE             = 0x0002
  KEY_CREATE_SUB_KEY        = 0x0004
  KEY_ENUMERATE_SUB_KEYS    = 0x0008
  KEY_NOTIFY                = 0x0010
  KEY_CREATE_LINK           = 0x0020
  KEY_READ = STANDARD_RIGHTS_READ |
           KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY
  KEY_WRITE = STANDARD_RIGHTS_WRITE |
           KEY_SET_VALUE | KEY_CREATE_SUB_KEY
  KEY_EXECUTE = KEY_READ
           KEY_ALL_ACCESS = KEY_READ | KEY_WRITE | KEY_CREATE_LINK
           
  MAX_KEY_LENGTH   = 514
  MAX_VALUE_LENGTH = 32768  
           
  @@reg = []
  
  # 0:打开 1:查询 2: 建立 3:枚举(v) 4:枚举(k)
  # 5:设置 6:删除(v) 7:删除(k) 8:关闭 9:信息
  [
        %w/RegOpenKeyEx     LPLLP        L/, #0
        %w/RegQueryValueEx  LPLPPP       L/, #1
        %w/RegCreateKeyEx   LPLLLLPPP    L/, #2
        %w/RegEnumValue     LLPPPPPP     L/, #3
        %w/RegEnumKeyEx     LLPPLLLP     L/, #4
        %w/RegSetValueEx    LPLLPL       L/, #5
        %w/RegDeleteValue   LP           L/, #6
        %w/RegDeleteKey     LP           L/, #7
        %w/RegCloseKey      L            L/, #8
        %w/RegQueryInfoKey  LPPPPPPPPPPP L/, #9
  ].each do |fn|
  @@reg << Win32API.new("advapi32.dll", *fn)
  end

  module_function
  
  def REG
    return @@reg
  end  
  
  # 返回句柄
  def OpenKey(hkey, name, opt, desired)
    result = packdw(0)
    check self.REG[0].call(hkey, name, opt, desired, result)
    @reg_jb = unpackdw(result)
  end
  
  def QueryValue(hkey, name)
    type = packdw(0)
    size = packdw(0)
    data = "\0"*256
    check self.REG[1].call(hkey, name, 0, type, 0, size)
    check self.REG[1].call(hkey, name, 0, type, data, size)
    data.delete!("\0")
    @value_inf = [data,unpackdw(type),unpackdw(size)]
  end
  
  def CreateKey(hkey, name, opt, desired)
    result = packdw(0)
    disp = packdw(0)
    check self.REG[2].call(hkey, name, 0, 0, opt, desired,
                      0, result, disp)
    [ unpackdw(result), unpackdw(disp) ]
  end
      
  def EnumValue(hkey, index)
    name = "" * MAX_KEY_LENGTH
    size = packdw(MAX_KEY_LENGTH)
    check self.REG[3].call(hkey, index, name, size, 0, 0, 0, 0)
    name[0, unpackdw(size)]
  end
      
  def EnumKey(hkey, index)
    name = "" * MAX_KEY_LENGTH
    size = packdw(MAX_KEY_LENGTH)
    wtime = "" * 8
    check self.REG[4].call(hkey, index, name, size, 0, 0, 0, wtime)
    [ name[0, unpackdw(size)], unpackqw(wtime) ]
  end
      
  def SetValue(hkey, name, type, data, size)
    check self.REG[5].call(hkey, name, 0, type, data, size)
  end
      
  def DeleteValue(hkey, name)
    check self.REG[6].call(hkey, name)
  end
      
  def DeleteKey(hkey, name)
    check self.REG[7].call(hkey, name)
  end
     
  def CloseKey(hkey)
    check self.REG[8].call(hkey)
  end
      
  def QueryInfoKey(hkey)
    subkeys = packdw(0)
    maxsubkeylen = packdw(0)
    values = packdw(0)
    maxvaluenamelen = packdw(0)
    maxvaluelen = packdw(0)
    secdescs = packdw(0)
    wtime = " " * 8
    check self.REG[9].call(hkey, 0, 0, 0, subkeys, maxsubkeylen, 0,
      values, maxvaluenamelen, maxvaluelen, secdescs, wtime)
    [ unpackdw(subkeys), unpackdw(maxsubkeylen), unpackdw(values),
      unpackdw(maxvaluenamelen), unpackdw(maxvaluelen),
      unpackdw(secdescs), unpackqw(wtime) ]
  end
  
  def check(result)
    raise "注册表打开失败!" if result != 0
  end
      
  def packdw(dw)
    [dw].pack("V")
  end
      
  def unpackdw(dw)
    dw += [0].pack("V")
    dw.unpack("V")[0]
  end
      
  def packqw(qw)
    [ qw & 0xFFFFFFFF, qw >> 32 ].pack("VV")
  end
      
  def unpackqw(qw)
    qw = qw.unpack("VV")
    (qw[1] << 32) | qw[0]
  end

  def get_jb
    return @reg_jb if @reg_jb != nil
  end  
  
  def get_value(kind)
    return if @value_inf == nil
    case kind
    when "data"
      return @value_inf[0]
    when "type"
      return @value_inf[1]
    when "size"  
      return @value_inf[2]
    end  
  end  
  
end  
  

作者: 夏胧    时间: 2008-8-14 17:51
呵呵 ms8错。。。 支持。。{/tp}
作者: yangff    时间: 2008-8-14 18:03
厄...
被UAC咔嚓了
作者: hide秀    时间: 2008-8-14 18:15
以下引用yangff于2008-8-14 10:03:01的发言:

厄...
被UAC咔嚓了

?????????
作者: IamI    时间: 2008-8-14 18:37
UAC……Vista的保护装置?
只是读取键值也会启动?
作者: yangff    时间: 2008-8-14 19:21
以下引用IamI于2008-8-14 10:37:26的发言:

UAC……Vista的保护装置?
只是读取键值也会启动?


[本贴由作者于 2008-8-14 10:37:51 最后编辑]

我这里被拦截。
其他的不知
作者: 凌冰    时间: 2008-8-14 20:35
= =
关闭UAC就可以了
= =
作者: 越前リョーマ    时间: 2008-8-14 20:41
制作加密补丁的么……
作者: hide秀    时间: 2008-8-14 20:51
额。。。不是 我那个加密只需要使用获取RTP路径就可以了
至于其他作用么。。。自制安装包阿。。。安装完成把路径等信息写入注册表
还有让你的程序开机自动运行等等。。。。
。。。赫赫 修改。。。删除等功能。。。都可能导致系统瘫痪。。
如果用在邪恶的地方就。。。{/gg}


作者: Defanive    时间: 2008-8-14 21:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: hide秀    时间: 2008-8-15 05:53
别说出来啊。。。否则会显得这个脚本很恶劣。。。
作者: ONEWateR    时间: 2008-8-15 05:56
真是佩服秀秀,膜拜秀秀君{/hx}
作者: orochi2k    时间: 2008-8-16 05:35
呃...我是用RGSS调用某C++写的动态连接库在干相同的事-_-0
作者: danny8376    时间: 2008-8-17 00:53
用这就可以取得RTP路径

这个有个好处

就是不会被UAC挡

因为这是调用RGSS10XX.dll (RM运行库)

如果UAC会挡的话

RM应该也读不到RTP才对

getRTPPath(rtpnum)就是RTP路径

rtpnum => 1 => RTP1
       => 2 => RTP2
       => 3 => RTP3





  1. gppsa = Win32API.new('kernel32', 'GetPrivateProfileStringA', 'PPPPLP', 'L')
  2. dll = "\0" * 255
  3. gppsa.call('Game', 'Library', '', dll, 255, '.\\Game.ini')
  4. dll.delete!("\0")
  5. $rtprgssgrp = Win32API.new(dll, 'RGSSGetRTPPath', 'L', 'L')
  6. $rtprgssgpwr = Win32API.new(dll, 'RGSSGetPathWithRTP', 'L', 'P')
  7. def getRTPPath(rtpnum)
  8.   return "" if rtpnum < 1 or rtpnum > 3
  9.   rp = $rtprgssgpwr.call($rtprgssgrp.call(rtpnum))
  10.   return "" if rp == "" or rp.nil?
  11.   rp.gsub!("\\"){"/"} + "/"
  12.   return rp
  13. end
复制代码

作者: 幻獬豸    时间: 2008-8-18 06:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: danny8376    时间: 2008-8-19 06:03
以下引用Defanive于2008-8-14 13:45:56的发言:

例如禁止regedit,删除.exe、.reg关联,开机自动运行病毒,禁止运行任务管理器,删除杀毒软件的开机自动运行。。。

加上数十条,就麻烦了。。。

解决也很好办。。。

载入Windows前按F8选批次指令
输入
C:\WINDOWS\regedit.exe
不就能开启regedit了
作者: 莉可    时间: 2008-8-22 23:49
提示: 作者被禁止或删除 内容自动屏蔽
作者: 灯笼菜刀王    时间: 2008-8-23 00:02
修改注册表本身就很恶劣= =....

不懂注册表的人飘过..............
作者: 做游戏的新手    时间: 2008-8-23 02:19
如何修改?{/se}
作者: 轮回者    时间: 2008-9-7 17:59
很好,很邪恶
作者: 叮当猫的马甲    时间: 2008-10-21 05:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: david50407    时间: 2009-8-10 21:42
能讀取中文字嗎?
作者: DeathKing    时间: 2009-8-11 15:35
纯顶

惊异了一下,不过既然RGSS可以对注册表经行操作,那么以后会不会有游戏捆绑恶意代码捏?
作者: 霜冻之狼    时间: 2009-8-11 15:39
记得曾听说有人用RGBY写出一个病毒脚本
不知道是不是谣传
作者: 瓦沙尔    时间: 2009-8-17 17:39
提示: 作者被禁止或删除 内容自动屏蔽




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