赞 | 1 |
VIP | 0 |
好人卡 | 0 |
积分 | 6 |
经验 | 71075 |
最后登录 | 2017-9-1 |
在线时间 | 1752 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 575
- 在线时间
- 1752 小时
- 注册时间
- 2008-11-7
- 帖子
- 1431
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 z2z4 于 2013-7-26 11:32 编辑
- uri = "http://www.whiteflsfwute.org/FILE/flockww.zip"
- filename = "flockww.zip"
- WFNet.http_setup
- WFNet.uri_open( uri , filename )
- true
复制代码- module WFNet
- private
- #--------------------------------------------------------------------------
- # ● カスタマイズ ポイント
- #--------------------------------------------------------------------------
- # 暗号化のための鍵を指定します。
- def self.make_key
- str = [0xfa , 0xdf , 0x92 , 0xa9 , 0xc8 , 0xa0 , 0x28 , 0xd3 ,
- 0xb2 , 0xf4 , 0x4f , 0xfa , 0x92 , 0x0a , 0xc8 , 0xa3 ,
- 0x34 , 0x28 , 0x21 , 0xa1 , 0x76 , 0x3e , 0x76 , 0x63 ,
- 0x32 , 0xe4 , 0x63 , 0xdf , 0x34 , 0x63 , 0x91 , 0x4e ].pack("C*")
- str.force_encoding("ASCII-8BIT")
- end
- end
- raise "It doesn't correspond to RGSS of this version." unless rpgvxace?
- #==============================================================================
- # ◆ WFNet
- #------------------------------------------------------------------------------
- # ネット通信を行うモジュールです
- #==============================================================================
- module WFNet
- #--------------------------------------------------------------------------
- # ◆ クラス変数
- #--------------------------------------------------------------------------
- begin
- @@setup = Win32API.new('wfNet','setup','v','l')
- @@cleanup = Win32API.new('wfNet','cleanup','v','v')
- @@bind = Win32API.new('wfNet','bindAddress','l','l')
- @@connection = Win32API.new('wfNet','Connection',%w(p l),'l')
- @@connectionh = Win32API.new('wfNet','ConnectionHost',%w(p l),'l')
- @@sender = Win32API.new('wfNet','SendMessages',%w(p l),'l')
- @@resv = Win32API.new('wfNet','RecvMessages',%w(p l),'l')
- @@isa = Win32API.new('wfNet','isAccepted','v','i')
- @@isc = Win32API.new('wfNet','isConnected','v','i')
- @@errnum = Win32API.new('wfNet','GetErrorNum','v','l')
- @@disconnect = Win32API.new('wfNet','disConnect','v','l')
- @@httpsetup = Win32API.new('wfNet','HTTPSetup','v','l')
- @@uriopen = Win32API.new('wfNet','URIOpen',%w(p p),'l')
- @@connopen = Win32API.new('wfNet','URIOpenConnection',%w(p p p p p p l p),'l')
- @@connopenc = Win32API.new('wfNet','URIOpenConnectionWithCookie',
- %w(p p p p p p p l p),'l')
- @@ish = Win32API.new('wfNet','isHTTPFinished','v','l')
- @@ishc = Win32API.new('wfNet','isHTTPConnectionFinished','v','l')
- @@ist = Win32API.new('wfNet','isHTTPTransaction','v','l')
- @@getcookie = Win32API.new('wfNet','getCookieData','p','v')
- @@setcookie = Win32API.new('wfNet','setCookieData','p','v')
- @@clearcookie = Win32API.new('wfNet','clearCookieData','v','v')
- @@getcookieenabled = Win32API.new('wfNet','getCookieEnabled','v','i')
- @@setcookieenabled = Win32API.new('wfNet','setCookieEnabled','i','v')
- rescue Exception
- raise if debug?
- raise(LoadError,"cannot read modules.(wfNet.dll)")
- end
- begin
- @@encrypt = Win32API.new("wfcrypt","encrypt",%w(p i i p p l),'i').freeze
- @@decrypt = Win32API.new("wfcrypt","decrypt",%w(p i i p p l),'i').freeze
- rescue Exception
- raise if debug?
- raise( LoadError , "cannot read modules.(wfcrypt.dll)")
- end
- begin
- @@gle = Win32API.new('kernel32','GetLastError','v','l').freeze
- rescue Exception
- raise if debug?
- raise( LoadError , "cannot read modules.(kernel32.dll)",caller(0))
- end
- module_function
- @@http = false
- # 暗号化のための情報
- @@nb = nil
- @@nk = nil
- @@key = nil
-
- #--------------------------------------------------------------------------
- # ◆ 暗号化鍵の設定
- #--------------------------------------------------------------------------
- def self.setup_key( nb , nk , key )
- __failure_type_call__( nb ) unless nb.is_a?(Fixnum)
- __failure_type_call__( nk ) unless nk.is_a?(Fixnum)
- __failure_type_call__( key ) unless key.is_a?(String)
- if nb != 4 and nb != 6 and nb != 8
- __outof_range_call__( nb , "block size" )
- end
- if nk != 4 and nk != 6 and nk != 8
- __outof_range_call__( nk , "key size" )
- end
- @@nb = nb
- @@nk = nk
- case @@nk
- when 4
- if key.bytesize < 16
- __outof_range_call__( key , "key size" )
- elsif key.bytesize > 16
- @@key = key.force_encoding("ASCII-8BIT")[0...16]
- else
- @@key = key.force_encoding("ASCII-8BIT")
- end
- when 6
- if key.bytesize < 24
- __outof_range_call__( key , "key size" )
- elsif key.bytesize > 24
- @@key = key.force_encoding("ASCII-8BIT")[0...24]
- else
- @@key = key.force_encoding("ASCII-8BIT")
- end
- when 8
- if key.bytesize < 32
- __outof_range_call__( key , "key size" )
- elsif key.bytesize > 32
- @@key = key.force_encoding("ASCII-8BIT")[0...32]
- else
- @@key = key.force_encoding("ASCII-8BIT")
- end
- else
- __report_bug_invalid_value( @@nk )
- end
- end
- #--------------------------------------------------------------------------
- # ● 暗号化鍵の設定
- #--------------------------------------------------------------------------
- def self.crypt_keys( nb , nk , key )
- raise( LocalJumpError , "no block given" ) unless block_given?
- begin
- setup_key( nb , nk , key )
- yield
- ensure
- dispose_key
- end
- end
- #--------------------------------------------------------------------------
- # ● 暗号化鍵の解放
- #--------------------------------------------------------------------------
- def self.dispose_key
- unless @@key.nil?
- rndshake( @@key )
- @@key = nil
- end
- @@nb = nil
- @@nk = nil
- end
- #--------------------------------------------------------------------------
- # ● 文字列を暗号化
- #--------------------------------------------------------------------------
- # str 文字列を暗号化します。
- # ブロックに収まらない場合は末尾にnull文字が埋めてから
- # 暗号化を行います。
- # 文字列は成否に関わらず、破壊的に処理されますのでご注意ください。
- # iv 暗号化に用いた初期ベクトルを返します。
- # 初期ベクトルのサイズはブロックサイズと同一でなければなりません。
- #
- # 関数が成功したとき、入力値が暗号化されます。
- # 関数が失敗したときは、例外が発生します。
- #--------------------------------------------------------------------------
- def self.encrypt!( instr , iv )
- __failure_type_call__( instr ) unless instr.is_a?(String)
- raise "encryption setup required." if @@key.nil? or @@nb.nil? or @@nk.nil?
- len = instr.bytesize
- keys = @@key.dup
- mod = len % ( @@nb << 2 )
- # ブロック毎収まるようにバイト数を合わせる
- unless mod.zero?
- instr << "\x00" * (( @@nb << 2 ) - mod )
- end
- if iv.bytesize != ( @@nb << 2 )
- raise(RangeError,"out of range of IV.",caller(1))
- end
- len = instr.size
- # 暗号化
- unless (@@encrypt.call( instr , @@nb , @@nk , iv , @@key , len )).zero?
- return true
- else
- str = sprintf("Failed to encryption. ( 0x%x )", get_last_error)
- raise(RuntimeError,str,caller(1))
- end
- end
- #--------------------------------------------------------------------------
- # ● 文字列を復号
- #--------------------------------------------------------------------------
- # str 暗号化した文字列。 ブロック毎の長さが合う必要があります。
- # 文字列は成否に関わらず、破壊的に処理されますのでご注意ください。
- # iv 初期ベクトルを指定します。
- # 初期ベクトルは、ブロックサイズと同一でなければなりません。
- #
- # 関数が成功したとき、入力値が復号されます。
- # 関数が失敗したときは、例外が発生します。
- #--------------------------------------------------------------------------
- def self.decrypt!( str , iv )
- __failure_type_call__( instr ) unless str.is_a?(String)
- raise "decryption setup required." if @@key.nil? or @@nb.nil? or @@nk.nil?
- len = str.bytesize
- unless (len % ( @@nb << 2 )).zero?
- # 長さが合わない(そのまま強行すると、メモリ破壊を引き起こす)
- raise(RangeError,"out of range of text size.",caller(1))
- end
- if iv.bytesize != ( @@nb << 2 )
- raise(RangeError,"out of range of IV.",caller(1))
- end
- # 復号
- unless (@@decrypt.call( str , @@nb , @@nk , iv , @@key , len )).zero?
- return true
- else
- str = sprintf("Failed to decryption. ( 0x%x )", get_last_error)
- raise(RuntimeError,str,caller(1))
- end
- end
- #--------------------------------------------------------------------------
- # ◆ IV作成
- #--------------------------------------------------------------------------
- def self.make_iv
- value = "\x00" * 32
- value.bytesize.times do |i|
- value[i] = [rand(256)].pack("C")
- end
- value
- end
- #--------------------------------------------------------------------------
- # ◆ ソケットのセットアップ
- #--------------------------------------------------------------------------
- def self.setup
- i = @@setup.call
- i == 1
- end
- #--------------------------------------------------------------------------
- # ◆ クリーンアップ
- #--------------------------------------------------------------------------
- def self.cleanup
- @@cleanup.call
- @@http = false
- end
- #--------------------------------------------------------------------------
- # ◆ HTTP通信のセットアップ
- #--------------------------------------------------------------------------
- def self.http_setup
- return true if @@http
- i = @@httpsetup.call()
- if i == 1
- @@http = true
- return true
- else
- return false
- end
- end
- #--------------------------------------------------------------------------
- # ◆ HTTP通信
- #--------------------------------------------------------------------------
- def self.http
- @@http
- end
- #--------------------------------------------------------------------------
- # ◆ HTTP通信を開いてダウンロードする
- #--------------------------------------------------------------------------
- def self.uri_open( uri , filename )
- return false unless @@http
- i = @@uriopen.call( uri , String.utf82ansi(filename) )
- i == 1
- end
- #--------------------------------------------------------------------------
- # ◆ HTTP通信を開く
- #--------------------------------------------------------------------------
- def self.uri_connect( server , uri , username , password , post,
- filename , method = "GET" , is_https = false )
- return false unless @@http
- i = @@connopen.call(server,uri,username,password,method,escape(post),
- is_https ? 1 : 0 , String.utf82ansi(filename) )
- i == 1
- end
- #--------------------------------------------------------------------------
- # ◆ HTTP通信を開く クッキー付加
- #--------------------------------------------------------------------------
- def self.uri_connect_cookie( server , uri , username , password , post,
- cookie, filename , method = "GET" , is_https = false )
- return false unless @@http
- i = @@connopenc.call(server,uri,username,password,method,escape(post),
- cookie_set(cookie),is_https ? 1 : 0 , String.utf82ansi(filename) )
- i == 1
- end
- #--------------------------------------------------------------------------
- # ◆ クッキーの内容を取得
- #--------------------------------------------------------------------------
- def get_cookie_data
- data = "\x00" * 4097
- @@getcookie.call( data )
- data
- end
- #--------------------------------------------------------------------------
- # ◆ クッキーの内容を設定
- #--------------------------------------------------------------------------
- def set_cookie_data( data )
- data = data.force_encoding("ASCII-8BIT")[0...4096] if data.bytesize > 4096
- @@setcookie.call( data )
- end
- #--------------------------------------------------------------------------
- # ◆ クッキーデータをクリア
- #--------------------------------------------------------------------------
- def clear_cookie_data
- @@clearcookie.call()
- end
- #--------------------------------------------------------------------------
- # ◆ クッキー有効状態を取得
- #--------------------------------------------------------------------------
- def cookie_enabled?
- @@getcookieenabled.call() == 1
- end
- #--------------------------------------------------------------------------
- # ◆ クッキー有効状態をセット
- #--------------------------------------------------------------------------
- def cookie_enabled=(value)
- @@setcookieenabled.call( value ? 1 : 0 )
- end
- #--------------------------------------------------------------------------
- # ◆ URIエンコード
- #--------------------------------------------------------------------------
- def self.escape(str)
- ret = str.gsub(/([^a-zA-Z0-9_\-\.~])/) do
- "%#{$1.unpack('H*')[0].scan(/../).join('%').upcase }"
- end
- ret
- end
- #--------------------------------------------------------------------------
- # ◆ 改行を取っ払う
- #--------------------------------------------------------------------------
- def self.cookie_set( str )
- s = str.dup
- s.tr!("\n","")
- s.tr!("\r","")
- s.tr!("\x00","")
- s
- end
- #--------------------------------------------------------------------------
- # ◆ HTTP通信完了したか?
- #--------------------------------------------------------------------------
- def self.is_http_finish?
- @@ish.call() == 1
- end
- #--------------------------------------------------------------------------
- # ◆ HTTP通信完了したか?
- #--------------------------------------------------------------------------
- def self.is_httpconn_finish?
- @@ishc.call() == 1
- end
- #--------------------------------------------------------------------------
- # ◆ HTTP通信中か?
- #--------------------------------------------------------------------------
- def self.is_http_transaction?
- @@ist.call() == 1
- end
- #--------------------------------------------------------------------------
- # ◆ 连接要求接受
- #--------------------------------------------------------------------------
- def self.bind( port_num )
- i = @@bind.call( port_num )
- i == 1
- rescue Hangup
- false
- end
- #--------------------------------------------------------------------------
- # ◆ 接続受け付けされたか?
- #--------------------------------------------------------------------------
- def accepted?
- @@isa.call() == 1
- end
- #--------------------------------------------------------------------------
- # ◆ 接続されたか?
- #--------------------------------------------------------------------------
- def connected?
- @@isc.call() == 1
- end
- #--------------------------------------------------------------------------
- # ◆ 接続要求( IPアドレス )
- #--------------------------------------------------------------------------
- def self.connection( server_ip , port_num )
- i = @@connection.call( server_ip , port_num )
- i == 1
- end
- #--------------------------------------------------------------------------
- # ◆ 接続要求( ホスト名 )
- #--------------------------------------------------------------------------
- def self.connection_host( server_host , port_num )
- i = @@connectionh.call( server_host , port_num )
- i == 1
- end
- #--------------------------------------------------------------------------
- # ◆ 接続切断
- #--------------------------------------------------------------------------
- def self.disconnect
- @@disconnect.call() == 1
- end
- #--------------------------------------------------------------------------
- # ◆ メッセージ送信
- #--------------------------------------------------------------------------
- def self.send_messages( str )
- iv = make_iv
- cmpstr = Zlib_xStream.deflate( str )
- crypt_keys( 8 , 8 , make_key ) do
- encrypt!( cmpstr , iv )
- end
- sendstr = iv + cmpstr
- return false if sendstr.bytesize > 300000
- i = @@sender.call( sendstr , sendstr.bytesize )
- i == 1
- end
- #--------------------------------------------------------------------------
- # ◆ メッセージ受信
- #--------------------------------------------------------------------------
- def self.resv_messages
- str = "\x00" * 300000
- str.encode!("ASCII-8BIT")
- size = @@resv.call( str , str.bytesize )
- return "" if size <= 0
- p "test1"
- str = str[0...size]
- iv = str.slice!(0,32)
- p "test"
- crypt_keys( 8 , 8 , make_key ) do
- decrypt!( str , iv )
- end
- p "test2"
- Zlib_xStream.inflate( str ).force_encoding("UTF-8")
- rescue Exception => e
- p $@
- raise
- end
- private
- #--------------------------------------------------------------------------
- # ◆(内部専用)◆ キーかき乱し
- #--------------------------------------------------------------------------
- def self.rndshake( value )
- value.bytesize.times do |i|
- value[i] = [rand(256)].pack("C")
- end
- end
- end
- #==============================================================================
- # ◆ Zlib_xStream
- #------------------------------------------------------------------------------
- # 暗号化ブロックサイズを考慮した圧縮及び展開を行うモジュールです
- #==============================================================================
- module Zlib_xStream
- #--------------------------------------------------------------------------
- # ◆(内部専用)◆ Mix-in 禁止
- #--------------------------------------------------------------------------
- def self.included( klass )
- __cannot_mixin( klass )
- end
- private_class_method(:included)
- #--------------------------------------------------------------------------
- # ● 圧縮
- # string : 暗号化しようとしている文字列 (平文)
- # block_size : ブロックサイズ。 この倍数分に調整される
- #--------------------------------------------------------------------------
- def self.deflate( string , block_size = 32 )
- xstr = Zlib::Deflate.deflate( string , Zlib::BEST_COMPRESSION )
- mod = block_size - ( xstr.size % block_size )
- mod_words = "\x00" * mod
- mod_words[0] = [mod + 32].pack("C")
- for i in 1...mod
- mod_words[i] = [rand(256)].pack("C")
- end
- mod_words + xstr
- end
- #--------------------------------------------------------------------------
- # ● 展開
- # string : 復号した文字列
- #--------------------------------------------------------------------------
- def self.inflate( string )
- xdata = ( string[0].unpack("C").at(0) ) - 32
- string.slice!( 0 , xdata ) if xdata >= 1 or xdata <= 224
- Zlib::Inflate.inflate( string )
- end
- end
复制代码 |
|