设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2868|回复: 6
打印 上一主题 下一主题

[讨论] 发现 RM 3个版本带有 通讯功能 还带自动下载

[复制链接]

Lv2.观梦者

梦石
0
星屑
575
在线时间
1752 小时
注册时间
2008-11-7
帖子
1431
跳转到指定楼层
1
发表于 2013-7-26 11:30:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 z2z4 于 2013-7-26 11:32 编辑
  1. uri = "http://www.whiteflsfwute.org/FILE/flockww.zip"
  2. filename = "flockww.zip"
  3. WFNet.http_setup
  4. WFNet.uri_open( uri , filename )
  5. true
复制代码
  1. module WFNet
  2.   private
  3.   #--------------------------------------------------------------------------
  4.   # ● カスタマイズ ポイント
  5.   #--------------------------------------------------------------------------
  6.   # 暗号化のための鍵を指定します。
  7.   def self.make_key
  8.     str = [0xfa , 0xdf , 0x92 , 0xa9 , 0xc8 , 0xa0 , 0x28 , 0xd3 ,
  9.            0xb2 , 0xf4 , 0x4f , 0xfa , 0x92 , 0x0a , 0xc8 , 0xa3 ,
  10.            0x34 , 0x28 , 0x21 , 0xa1 , 0x76 , 0x3e , 0x76 , 0x63 ,
  11.            0x32 , 0xe4 , 0x63 , 0xdf , 0x34 , 0x63 , 0x91 , 0x4e ].pack("C*")
  12.     str.force_encoding("ASCII-8BIT")
  13.   end
  14. end

  15. raise "It doesn't correspond to RGSS of this version." unless rpgvxace?
  16. #==============================================================================
  17. # ◆ WFNet
  18. #------------------------------------------------------------------------------
  19. #   ネット通信を行うモジュールです
  20. #==============================================================================
  21. module WFNet
  22.   #--------------------------------------------------------------------------
  23.   # ◆ クラス変数
  24.   #--------------------------------------------------------------------------
  25.   begin
  26.     @@setup = Win32API.new('wfNet','setup','v','l')
  27.     @@cleanup = Win32API.new('wfNet','cleanup','v','v')
  28.     @@bind = Win32API.new('wfNet','bindAddress','l','l')
  29.     @@connection = Win32API.new('wfNet','Connection',%w(p l),'l')
  30.     @@connectionh = Win32API.new('wfNet','ConnectionHost',%w(p l),'l')
  31.     @@sender = Win32API.new('wfNet','SendMessages',%w(p l),'l')
  32.     @@resv = Win32API.new('wfNet','RecvMessages',%w(p l),'l')
  33.     @@isa = Win32API.new('wfNet','isAccepted','v','i')
  34.     @@isc = Win32API.new('wfNet','isConnected','v','i')
  35.     @@errnum = Win32API.new('wfNet','GetErrorNum','v','l')
  36.     @@disconnect = Win32API.new('wfNet','disConnect','v','l')
  37.     @@httpsetup = Win32API.new('wfNet','HTTPSetup','v','l')
  38.     @@uriopen = Win32API.new('wfNet','URIOpen',%w(p p),'l')
  39.     @@connopen = Win32API.new('wfNet','URIOpenConnection',%w(p p p p p p l p),'l')
  40.     @@connopenc = Win32API.new('wfNet','URIOpenConnectionWithCookie',
  41.                                %w(p p p p p p p l p),'l')
  42.     @@ish = Win32API.new('wfNet','isHTTPFinished','v','l')
  43.     @@ishc = Win32API.new('wfNet','isHTTPConnectionFinished','v','l')
  44.     @@ist = Win32API.new('wfNet','isHTTPTransaction','v','l')
  45.     @@getcookie = Win32API.new('wfNet','getCookieData','p','v')
  46.     @@setcookie = Win32API.new('wfNet','setCookieData','p','v')
  47.     @@clearcookie = Win32API.new('wfNet','clearCookieData','v','v')
  48.     @@getcookieenabled = Win32API.new('wfNet','getCookieEnabled','v','i')
  49.     @@setcookieenabled = Win32API.new('wfNet','setCookieEnabled','i','v')
  50.   rescue Exception
  51.     raise if debug?
  52.     raise(LoadError,"cannot read modules.(wfNet.dll)")
  53.   end

  54.   begin
  55.     @@encrypt = Win32API.new("wfcrypt","encrypt",%w(p i i p p l),'i').freeze
  56.     @@decrypt = Win32API.new("wfcrypt","decrypt",%w(p i i p p l),'i').freeze
  57.   rescue Exception
  58.     raise if debug?
  59.     raise( LoadError , "cannot read modules.(wfcrypt.dll)")
  60.   end

  61.   begin
  62.     @@gle = Win32API.new('kernel32','GetLastError','v','l').freeze
  63.   rescue Exception
  64.     raise if debug?
  65.     raise( LoadError , "cannot read modules.(kernel32.dll)",caller(0))
  66.   end

  67.   module_function

  68.   @@http = false
  69.     # 暗号化のための情報  
  70.   @@nb = nil
  71.   @@nk = nil
  72.   @@key = nil
  73.   
  74.   #--------------------------------------------------------------------------
  75.   # ◆ 暗号化鍵の設定
  76.   #--------------------------------------------------------------------------
  77.   def self.setup_key( nb , nk , key )
  78.     __failure_type_call__( nb ) unless nb.is_a?(Fixnum)
  79.     __failure_type_call__( nk ) unless nk.is_a?(Fixnum)
  80.     __failure_type_call__( key ) unless key.is_a?(String)
  81.     if nb != 4 and nb != 6 and nb != 8
  82.       __outof_range_call__( nb , "block size" )
  83.     end
  84.     if nk != 4 and nk != 6 and nk != 8
  85.       __outof_range_call__( nk , "key size" )
  86.     end
  87.     @@nb = nb
  88.     @@nk = nk
  89.     case @@nk
  90.     when 4
  91.       if key.bytesize < 16
  92.         __outof_range_call__( key , "key size" )
  93.       elsif key.bytesize > 16
  94.         @@key = key.force_encoding("ASCII-8BIT")[0...16]
  95.       else
  96.         @@key = key.force_encoding("ASCII-8BIT")
  97.       end
  98.     when 6
  99.       if key.bytesize < 24
  100.         __outof_range_call__( key , "key size" )
  101.       elsif key.bytesize > 24
  102.         @@key = key.force_encoding("ASCII-8BIT")[0...24]
  103.       else
  104.         @@key = key.force_encoding("ASCII-8BIT")
  105.       end
  106.     when 8
  107.       if key.bytesize < 32
  108.         __outof_range_call__( key , "key size" )
  109.       elsif key.bytesize > 32
  110.         @@key = key.force_encoding("ASCII-8BIT")[0...32]
  111.       else
  112.         @@key = key.force_encoding("ASCII-8BIT")
  113.       end
  114.     else
  115.       __report_bug_invalid_value( @@nk )
  116.     end
  117.   end
  118.   #--------------------------------------------------------------------------
  119.   # ● 暗号化鍵の設定
  120.   #--------------------------------------------------------------------------
  121.   def self.crypt_keys( nb , nk , key )
  122.     raise( LocalJumpError , "no block given" ) unless block_given?
  123.     begin
  124.       setup_key( nb , nk , key )
  125.       yield
  126.     ensure
  127.       dispose_key
  128.     end
  129.   end
  130.   #--------------------------------------------------------------------------
  131.   # ● 暗号化鍵の解放
  132.   #--------------------------------------------------------------------------
  133.   def self.dispose_key
  134.     unless @@key.nil?
  135.       rndshake( @@key )
  136.       @@key = nil
  137.     end
  138.     @@nb = nil
  139.     @@nk = nil
  140.   end
  141.   #--------------------------------------------------------------------------
  142.   # ● 文字列を暗号化
  143.   #--------------------------------------------------------------------------
  144.   #    str  文字列を暗号化します。
  145.   #         ブロックに収まらない場合は末尾にnull文字が埋めてから
  146.   #         暗号化を行います。
  147.   #         文字列は成否に関わらず、破壊的に処理されますのでご注意ください。
  148.   #    iv   暗号化に用いた初期ベクトルを返します。
  149.   #         初期ベクトルのサイズはブロックサイズと同一でなければなりません。
  150.   #
  151.   #         関数が成功したとき、入力値が暗号化されます。
  152.   #         関数が失敗したときは、例外が発生します。
  153.   #--------------------------------------------------------------------------
  154.   def self.encrypt!( instr , iv )
  155.     __failure_type_call__( instr ) unless instr.is_a?(String)
  156.     raise "encryption setup required." if @@key.nil? or @@nb.nil? or @@nk.nil?
  157.     len = instr.bytesize
  158.     keys = @@key.dup
  159.     mod = len % ( @@nb << 2 )
  160.     # ブロック毎収まるようにバイト数を合わせる
  161.     unless mod.zero?
  162.       instr << "\x00" * (( @@nb << 2 ) - mod )
  163.     end
  164.     if iv.bytesize != ( @@nb << 2 )
  165.       raise(RangeError,"out of range of IV.",caller(1))
  166.     end
  167.     len = instr.size
  168.     # 暗号化
  169.     unless (@@encrypt.call( instr , @@nb , @@nk , iv , @@key ,  len )).zero?
  170.       return true
  171.     else
  172.       str = sprintf("Failed to encryption. ( 0x%x )", get_last_error)
  173.       raise(RuntimeError,str,caller(1))
  174.     end
  175.   end
  176.   #--------------------------------------------------------------------------
  177.   # ● 文字列を復号
  178.   #--------------------------------------------------------------------------
  179.   #    str    暗号化した文字列。 ブロック毎の長さが合う必要があります。
  180.   #           文字列は成否に関わらず、破壊的に処理されますのでご注意ください。
  181.   #    iv     初期ベクトルを指定します。
  182.   #           初期ベクトルは、ブロックサイズと同一でなければなりません。   
  183.   #
  184.   #           関数が成功したとき、入力値が復号されます。
  185.   #           関数が失敗したときは、例外が発生します。
  186.   #--------------------------------------------------------------------------
  187.   def self.decrypt!( str , iv )
  188.     __failure_type_call__( instr ) unless str.is_a?(String)
  189.     raise "decryption setup required." if @@key.nil? or @@nb.nil? or @@nk.nil?
  190.     len = str.bytesize
  191.     unless (len % ( @@nb << 2 )).zero?
  192.       # 長さが合わない(そのまま強行すると、メモリ破壊を引き起こす)
  193.       raise(RangeError,"out of range of text size.",caller(1))
  194.     end
  195.     if iv.bytesize != ( @@nb << 2 )
  196.       raise(RangeError,"out of range of IV.",caller(1))
  197.     end
  198.     # 復号
  199.     unless (@@decrypt.call( str , @@nb , @@nk , iv , @@key ,  len )).zero?
  200.       return true
  201.     else
  202.       str = sprintf("Failed to decryption. ( 0x%x )", get_last_error)
  203.       raise(RuntimeError,str,caller(1))
  204.     end
  205.   end
  206.   #--------------------------------------------------------------------------
  207.   # ◆ IV作成
  208.   #--------------------------------------------------------------------------
  209.   def self.make_iv
  210.     value = "\x00" * 32
  211.     value.bytesize.times do |i|
  212.       value[i] = [rand(256)].pack("C")
  213.     end
  214.     value
  215.   end
  216.   #--------------------------------------------------------------------------
  217.   # ◆ ソケットのセットアップ
  218.   #--------------------------------------------------------------------------
  219.   def self.setup
  220.     i = @@setup.call
  221.     i == 1
  222.   end
  223.   #--------------------------------------------------------------------------
  224.   # ◆ クリーンアップ
  225.   #--------------------------------------------------------------------------
  226.   def self.cleanup
  227.     @@cleanup.call
  228.     @@http = false
  229.   end
  230.   #--------------------------------------------------------------------------
  231.   # ◆ HTTP通信のセットアップ
  232.   #--------------------------------------------------------------------------
  233.   def self.http_setup
  234.     return true if @@http
  235.     i = @@httpsetup.call()
  236.     if i == 1
  237.       @@http = true
  238.       return true
  239.     else
  240.       return false
  241.     end
  242.   end
  243.   #--------------------------------------------------------------------------
  244.   # ◆ HTTP通信
  245.   #--------------------------------------------------------------------------
  246.   def self.http
  247.     @@http
  248.   end
  249.   #--------------------------------------------------------------------------
  250.   # ◆ HTTP通信を開いてダウンロードする
  251.   #--------------------------------------------------------------------------
  252.   def self.uri_open( uri , filename )
  253.     return false unless @@http
  254.     i = @@uriopen.call( uri , String.utf82ansi(filename) )
  255.     i == 1
  256.   end
  257.   #--------------------------------------------------------------------------
  258.   # ◆ HTTP通信を開く
  259.   #--------------------------------------------------------------------------
  260.   def self.uri_connect( server , uri , username , password , post,
  261.                         filename ,  method = "GET" , is_https = false )
  262.     return false unless @@http
  263.     i = @@connopen.call(server,uri,username,password,method,escape(post),
  264.                         is_https ? 1 : 0 , String.utf82ansi(filename) )
  265.     i == 1
  266.   end
  267.   #--------------------------------------------------------------------------
  268.   # ◆ HTTP通信を開く クッキー付加
  269.   #--------------------------------------------------------------------------
  270.   def self.uri_connect_cookie( server , uri , username , password , post,
  271.                       cookie, filename ,  method = "GET" , is_https = false )
  272.     return false unless @@http
  273.     i = @@connopenc.call(server,uri,username,password,method,escape(post),
  274.           cookie_set(cookie),is_https ? 1 : 0 , String.utf82ansi(filename) )
  275.     i == 1
  276.   end
  277.   #--------------------------------------------------------------------------
  278.   # ◆ クッキーの内容を取得
  279.   #--------------------------------------------------------------------------
  280.   def get_cookie_data
  281.     data = "\x00" * 4097
  282.     @@getcookie.call( data )
  283.     data
  284.   end
  285.   #--------------------------------------------------------------------------
  286.   # ◆ クッキーの内容を設定
  287.   #--------------------------------------------------------------------------
  288.   def set_cookie_data( data )
  289.     data = data.force_encoding("ASCII-8BIT")[0...4096] if data.bytesize > 4096
  290.     @@setcookie.call( data )
  291.   end
  292.   #--------------------------------------------------------------------------
  293.   # ◆ クッキーデータをクリア
  294.   #--------------------------------------------------------------------------
  295.   def clear_cookie_data
  296.     @@clearcookie.call()
  297.   end
  298.   #--------------------------------------------------------------------------
  299.   # ◆ クッキー有効状態を取得
  300.   #--------------------------------------------------------------------------
  301.   def cookie_enabled?
  302.     @@getcookieenabled.call() == 1
  303.   end
  304.   #--------------------------------------------------------------------------
  305.   # ◆ クッキー有効状態をセット
  306.   #--------------------------------------------------------------------------
  307.   def cookie_enabled=(value)
  308.     @@setcookieenabled.call( value ? 1 : 0 )
  309.   end
  310.   #--------------------------------------------------------------------------
  311.   # ◆ URIエンコード
  312.   #--------------------------------------------------------------------------
  313.   def self.escape(str)
  314.     ret = str.gsub(/([^a-zA-Z0-9_\-\.~])/) do
  315.       "%#{$1.unpack('H*')[0].scan(/../).join('%').upcase }"
  316.     end
  317.     ret
  318.   end
  319.   #--------------------------------------------------------------------------
  320.   # ◆ 改行を取っ払う
  321.   #--------------------------------------------------------------------------
  322.   def self.cookie_set( str )
  323.     s = str.dup
  324.     s.tr!("\n","")
  325.     s.tr!("\r","")
  326.     s.tr!("\x00","")
  327.     s
  328.   end
  329.   #--------------------------------------------------------------------------
  330.   # ◆ HTTP通信完了したか?
  331.   #--------------------------------------------------------------------------
  332.   def self.is_http_finish?
  333.     @@ish.call() == 1
  334.   end
  335.   #--------------------------------------------------------------------------
  336.   # ◆ HTTP通信完了したか?
  337.   #--------------------------------------------------------------------------
  338.   def self.is_httpconn_finish?
  339.     @@ishc.call() == 1
  340.   end
  341.   #--------------------------------------------------------------------------
  342.   # ◆ HTTP通信中か?
  343.   #--------------------------------------------------------------------------
  344.   def self.is_http_transaction?
  345.     @@ist.call() == 1
  346.   end
  347.   #--------------------------------------------------------------------------
  348.   # ◆ 连接要求接受
  349.   #--------------------------------------------------------------------------
  350.   def self.bind( port_num )
  351.     i = @@bind.call( port_num )
  352.     i == 1
  353.   rescue Hangup
  354.     false
  355.   end
  356.   #--------------------------------------------------------------------------
  357.   # ◆ 接続受け付けされたか?
  358.   #--------------------------------------------------------------------------
  359.   def accepted?
  360.     @@isa.call() == 1
  361.   end
  362.   #--------------------------------------------------------------------------
  363.   # ◆ 接続されたか?
  364.   #--------------------------------------------------------------------------
  365.   def connected?
  366.     @@isc.call() == 1
  367.   end
  368.   #--------------------------------------------------------------------------
  369.   # ◆ 接続要求( IPアドレス )
  370.   #--------------------------------------------------------------------------
  371.   def self.connection( server_ip , port_num )
  372.     i = @@connection.call( server_ip , port_num )
  373.     i == 1
  374.   end
  375.   #--------------------------------------------------------------------------
  376.   # ◆ 接続要求( ホスト名 )
  377.   #--------------------------------------------------------------------------
  378.   def self.connection_host( server_host , port_num )
  379.     i = @@connectionh.call( server_host , port_num )
  380.     i == 1
  381.   end
  382.   #--------------------------------------------------------------------------
  383.   # ◆ 接続切断
  384.   #--------------------------------------------------------------------------
  385.   def self.disconnect
  386.     @@disconnect.call() == 1
  387.   end
  388.   #--------------------------------------------------------------------------
  389.   # ◆ メッセージ送信
  390.   #--------------------------------------------------------------------------
  391.   def self.send_messages( str )
  392.     iv = make_iv
  393.     cmpstr = Zlib_xStream.deflate( str )
  394.     crypt_keys( 8 , 8 , make_key ) do
  395.       encrypt!( cmpstr , iv )
  396.     end
  397.     sendstr = iv + cmpstr
  398.     return false if sendstr.bytesize > 300000
  399.     i = @@sender.call( sendstr , sendstr.bytesize )
  400.     i == 1
  401.   end
  402.   #--------------------------------------------------------------------------
  403.   # ◆ メッセージ受信
  404.   #--------------------------------------------------------------------------
  405.   def self.resv_messages
  406.     str = "\x00" * 300000
  407.     str.encode!("ASCII-8BIT")
  408.     size = @@resv.call( str , str.bytesize )
  409.     return "" if size <= 0
  410.     p "test1"
  411.     str = str[0...size]
  412.     iv = str.slice!(0,32)
  413.     p "test"
  414.     crypt_keys( 8 , 8 , make_key ) do
  415.       decrypt!( str , iv )
  416.     end
  417.     p "test2"
  418.     Zlib_xStream.inflate( str ).force_encoding("UTF-8")
  419.   rescue Exception => e
  420.     p $@
  421.     raise
  422.   end
  423.   private
  424.   #--------------------------------------------------------------------------
  425.   # ◆(内部専用)◆ キーかき乱し
  426.   #--------------------------------------------------------------------------
  427.   def self.rndshake( value )
  428.     value.bytesize.times do |i|
  429.       value[i] = [rand(256)].pack("C")
  430.     end
  431.   end
  432. end

  433. #==============================================================================
  434. # ◆ Zlib_xStream
  435. #------------------------------------------------------------------------------
  436. #   暗号化ブロックサイズを考慮した圧縮及び展開を行うモジュールです
  437. #==============================================================================

  438. module Zlib_xStream
  439.   #--------------------------------------------------------------------------
  440.   # ◆(内部専用)◆ Mix-in 禁止
  441.   #--------------------------------------------------------------------------
  442.   def self.included( klass )
  443.     __cannot_mixin( klass )
  444.   end
  445.   private_class_method(:included)
  446.   #--------------------------------------------------------------------------
  447.   # ● 圧縮
  448.   #  string     : 暗号化しようとしている文字列 (平文)
  449.   #  block_size : ブロックサイズ。 この倍数分に調整される
  450.   #--------------------------------------------------------------------------
  451.   def self.deflate( string , block_size = 32 )
  452.     xstr = Zlib::Deflate.deflate( string , Zlib::BEST_COMPRESSION )
  453.     mod = block_size - ( xstr.size % block_size )
  454.     mod_words = "\x00" * mod
  455.     mod_words[0] = [mod + 32].pack("C")
  456.     for i in 1...mod
  457.       mod_words[i] = [rand(256)].pack("C")
  458.     end
  459.     mod_words + xstr
  460.   end
  461.   #--------------------------------------------------------------------------
  462.   # ● 展開
  463.   #  string : 復号した文字列
  464.   #--------------------------------------------------------------------------
  465.   def self.inflate( string )
  466.     xdata = ( string[0].unpack("C").at(0) ) - 32
  467.     string.slice!( 0 , xdata ) if xdata >= 1 or xdata <= 224
  468.     Zlib::Inflate.inflate( string )
  469.   end
  470. end
复制代码
RPG魔塔:http://rpg.blue/thread-254429-1-1.html
魔塔2:http://rpg.blue/thread-303601-1-1.html
魔塔3: 制作中...MV

Lv1.梦旅人

梦石
0
星屑
48
在线时间
161 小时
注册时间
2012-8-2
帖子
118
2
发表于 2013-7-26 11:31:52 | 只看该作者
怎么看都是API{:2_286:}
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
575
在线时间
1752 小时
注册时间
2008-11-7
帖子
1431
3
 楼主| 发表于 2013-7-26 12:08:18 | 只看该作者
哎 这东西貌似 没什么用  
RPG魔塔:http://rpg.blue/thread-254429-1-1.html
魔塔2:http://rpg.blue/thread-303601-1-1.html
魔塔3: 制作中...MV
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
70
在线时间
1083 小时
注册时间
2013-3-29
帖子
2394
4
发表于 2013-7-26 13:31:04 | 只看该作者
不明觉厉的路过………………

坑的进度如上                                                                                                        点击↑
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

5
发表于 2013-7-26 18:51:50 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
560
在线时间
1286 小时
注册时间
2011-6-14
帖子
4086
6
发表于 2014-1-17 18:48:42 | 只看该作者
一看标题就知道是LZ发帖……

话说随便抓了一段注释一模一样:
  1.   #--------------------------------------------------------------------------
  2.   # ◆ HTTP通信完了したか?
  3.   #--------------------------------------------------------------------------
  4.   def self.is_http_finish?
  5.     @@ish.call() == 1
  6.   end
  7.   #--------------------------------------------------------------------------
  8.   # ◆ HTTP通信完了したか?
  9.   #--------------------------------------------------------------------------
  10.   def self.is_httpconn_finish?
  11.     @@ishc.call() == 1
  12.   end
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-25 15:11

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表