Project1
标题:
发现 RM 3个版本带有 通讯功能 还带自动下载
[打印本页]
作者:
z2z4
时间:
2013-7-26 11:30
标题:
发现 RM 3个版本带有 通讯功能 还带自动下载
本帖最后由 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
复制代码
作者:
1105741847
时间:
2013-7-26 11:31
怎么看都是API{:2_286:}
作者:
z2z4
时间:
2013-7-26 12:08
哎 这东西貌似 没什么用
作者:
黄濑凉太
时间:
2013-7-26 13:31
不明觉厉的路过………………
作者:
晴兰
时间:
2013-7-26 18:51
提示:
作者被禁止或删除 内容自动屏蔽
作者:
satgo1546
时间:
2014-1-17 18:48
一看标题就知道是LZ发帖……
话说随便抓了一段注释一模一样:
#--------------------------------------------------------------------------
# ◆ HTTP通信完了したか?
#--------------------------------------------------------------------------
def self.is_http_finish?
@@ish.call() == 1
end
#--------------------------------------------------------------------------
# ◆ HTTP通信完了したか?
#--------------------------------------------------------------------------
def self.is_httpconn_finish?
@@ishc.call() == 1
end
复制代码
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1