Z ruby do C# – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Z ruby do C# – .NET – Fórum – Programujte.comZ ruby do C# – .NET – Fórum – Programujte.com

 

Mutagen0
Super člen
3. 10. 2012   #1
-
0
-

Zdravim. Mám tu takovej zádrhel. Mám tu script v Ruby ale upravovat ho pro mě v ruby je docela složitý, tak se chci zeptat zda by to neuměl někdo přepsat do C#, protože ja neumim v C# s TCP/DNS apod protokolama :(

script zde : 

require 'rubygems'

require 'socket'
require 'openssl'

require 'rainbow'

gem 'rubydns', '~> 0.4.0'
require 'rubydns'

# Ocra is the .exe generator
if defined?(Ocra)
	require 'rexec/client'
	exit
end

# Enter in current directory
Dir.chdir File.dirname($0)

# Change 0.0.0.0 to your LAN IP if you want
localHost = "0.0.0.0"

# You don't need to edit below this comment!!

FUCKPSN_VERSION='0.9'
PLATFORM_VERSION='04.25'
PLATFORM_PASSPHRASE='t2wSyoqasqb_wndpmdmbhputnokghlupgtpighyrsygfbmrsectfkqOb'

puts "fuckPSN v#{FUCKPSN_VERSION}".color(:green) + " by drizzt <drizzt@ibeglab.org> ".color(:red) + "-- ".color(:cyan) + "https://github.com/drizztbsd/fuckPsn".color(:cyan)

# Listening ports
localSslPort = 443
localWebPort = 80
localDnsPort = 53

# PSN (auth.np.ac.playstation.net) IP address
$remoteHost = "173.230.216.161"
$remotePort = 443

$blockSize = 1024

# Initialize OpenSSL library
cert_file = File.join("data", "cert.pem")
key_file = File.join("data", "cert.key")
list_file = File.join("data", "ps3-updatelist.txt")

cert = OpenSSL::X509::Certificate.new(File::read(cert_file))
key = OpenSSL::PKey::RSA.new(File::read(key_file))
@list_str = File::read(list_file)

@ctx = OpenSSL::SSL::SSLContext.new()
@ctx.key = key
@ctx.cert = cert

# Start servers
begin
	sslServer = TCPServer.new(localHost, localSslPort)
rescue Errno::EADDRINUSE
	$stderr.puts "Error".color(:red) + " Port " + localSslPort.to_s + " already in use"
end
begin
	webServer = TCPServer.new(localHost, localWebPort)
rescue Errno::EADDRINUSE
	$stderr.puts "Error".color(:red) + " Port " + localWebPort.to_s + " already in use"
end
begin
	dnsSocket = UDPSocket.new(Socket::AF_INET)
	dnsSocket.bind(localHost, localDnsPort)
rescue Errno::EADDRINUSE
	$stderr.puts "Error".color(:red) + " Port " + localDnsPort.to_s + " already in use"
end

if sslServer.nil? or webServer.nil? or dnsSocket.nil?
	exit 1
end

# Some prints
port = sslServer.addr[1]
addrs = sslServer.addr[2..-1].uniq

puts "Target Address: ".color(:green) + "#{$remoteHost}:#{$remotePort} - auth.np.ac.playstation.net".color(:yellow)
puts "*** ".color(:green) + "[#{Time.new}]".color(:cyan) + " [SSL]".color(:red) + " listening on #{addrs.collect{|a|"#{a}:#{port}"}.join(' ')}".color(:green)

port = webServer.addr[1]
addrs = webServer.addr[2..-1].uniq

puts "*** ".color(:green) + "[#{Time.new}]".color(:cyan) + " [WEB]".color(:red) + " listening on #{addrs.collect{|a|"#{a}:#{port}"}.join(' ')}".color(:green)

port = dnsSocket.addr[1]
addrs = dnsSocket.addr[2..-1].uniq

puts "*** ".color(:green) + "[#{Time.new}]".color(:cyan) + " [DNS]".color(:red) + " listening on #{addrs.collect{|a|"#{a}:#{port}" }.join(' ')}".color(:green)

# UDP Socket does per packet reverse lookups unless this is set.
UDPSocket.do_not_reverse_lookup = true

# abort on exceptions, otherwise threads will be silently killed in case
# of unhandled exceptions
#Thread.abort_on_exception = true

# have a thread just to process Ctrl-C events on Windows
# (although Ctrl-Break always works)
#Thread.new { loop { sleep 1 } }

R =  Resolv::DNS.new
IN = Resolv::DNS::Resource::IN

# Thread used for DNS connections
def dnsConnThread(local)
	packet, sender = local.recvfrom(1024*5)
	puts "*** ".color(:green) + "[DNS]".color(:red) + " receiving from #{sender.last}:#{sender[1]}".color(:green)
	myIp = UDPSocket.open {|s| s.connect(sender.last, 1); s.addr.last }
	RubyDNS::Server.new do |server|
		server.logger.level = Logger::INFO
		Thread.new do
			match("auth.np.ac.playstation.net", IN::A) do |transaction|
				logger.info("#{transaction} query received, returning #{myIp}")
				transaction.respond!(myIp)
			end

			match(/ps3.update.playstation.net$/, IN::A) do |match_data, transaction|
				logger.info("#{transaction} query received, returning #{myIp}")
				transaction.respond!(myIp)
			end

			otherwise do |transaction|
				transaction.passthrough!(R)
			end

			RubyDNS::UDPHandler::process(server, packet) do |result|
				local.send(result.encode, 0, sender[2], sender[1])
			end
		end
	end
	puts "*** ".color(:green) + "[#{Time.new}]".color(:cyan) + " [DNS]".color(:red) + " done with #{sender.last}:#{sender[1]}".color(:green)
end

# Thread used for HTTP connections
def webConnThread(local)
	port, name = local.peeraddr[1..2]
	puts "*** ".color(:green) + "[#{Time.new}]".color(:cyan) + " [WEB]".color(:cyan) + " receiving from #{name}:#{port}".color(:green)

	puts "[#{Time.new}] ".color(:cyan) + local.gets.color(:yellow)
	local.write("HTTP/1.1 200/OK\r\nContent-Type: text/plain\r\nContent-Length: #{@list_str.size}\r\n\r\n#{@list_str}").color(:green)
	local.close
  
	puts "*** ".color(:green) + "[#{Time.new}]".color(:cyan) + " [WEB]".color(:cyan) + " done with #{name}:#{port}".color(:green)
end

# Thread used for HTTPS connections
def sslConnThread(local)
	port, name = local.peeraddr[1..2]
	puts "*** ".color(:green) + "[#{Time.new}]".color(:cyan) + " [SSL]".color(:yellow) + " receiving from #{name}:#{port}".color(:green)

	sslLocal = OpenSSL::SSL::SSLSocket.new(local, @ctx)
	sslLocal.accept

	# open connection to remote server
	remote = TCPSocket.new($remoteHost, $remotePort)

	sslRemote = OpenSSL::SSL::SSLSocket.new(remote)
	sslRemote.connect

	# start reading from both ends
	loop do
		ready = select([sslLocal, sslRemote], nil, nil, 120)
		if ready.nil?
			puts "[#{Time.new}]".color(:cyan) + " timeout".color(:red)
			break
		end
		if ready[0].include? sslLocal
			# local -> remote
			begin
				data = sslLocal.sysread($blockSize)
        puts "Mutagen : ".color(:green) + "#{data}".color(:cyan)
			rescue EOFError
				puts "*** ".color(:green) + "[#{Time.new}]".color(:cyan) + " local end closed connection".color(:red)
				break
			end
      
			if data.match('consoleid')
			  data.sub!(/consoleid=.*/, '00000000000000000000000000000000000000000000000000000000000000000000000000')
				puts "*** ".color(:green) + "[#{Time.new}]".color(:cyan) + " Spoofed consoleid".color(:red)
        puts "Mutagen : ".color(:green) + "#{data}".color(:cyan)
			end
      
      
			if data.match('X-Platform-Passphrase: ')
				data.sub!(/^X-Platform-Passphrase: .*/, 'X-Platform-Passphrase: ' + PLATFORM_PASSPHRASE)
				data.sub!(/^X-Platform-Version: PS3 .*/, 'X-Platform-Version: PS3 ' + PLATFORM_VERSION)
			else
				data.sub!(/^X-Platform-Version: PS3 .*/, "X-Platform-Version: PS3 #{PLATFORM_VERSION}\r\nX-Platform-Passphrase: #{PLATFORM_PASSPHRASE}")
      end
      puts "Mutagen : ".color(:green) + "#{data}".color(:cyan)
			sslRemote.write(data)
		end
		if ready[0].include? sslRemote
			# remote -> local
			begin
				data = sslRemote.sysread($blockSize)
        puts "Mutagen : ".color(:green) + "#{data}".color(:cyan)
			rescue EOFError
				puts "*** ".color(:green) + "[#{Time.new}]".color(:cyan) + " remote end closed connection".color(:red)
				break
			end
			sslLocal.write(data)
		end
	end

	sslLocal.close
	local.close
	sslRemote.close
	remote.close

	puts "*** ".color(:green) + "[#{Time.new}]".color(:cyan) + " [SSL]".color(:yellow) + " done with #{name}:#{port}".color(:green)
end

loop do
	# whenever server.accept returns a new connection, start
	# a handler thread for that connection
	ready = select([sslServer, webServer, dnsSocket], nil, nil)
	if ready[0].include? sslServer
		Thread.start(sslServer.accept) { |local| sslConnThread(local) }
	end
	if ready[0].include? webServer
		Thread.start(webServer.accept) { |local| webConnThread(local) }
	end
	if ready[0].include? dnsSocket
		Thread.start(dnsSocket) { |local| dnsConnThread(local) }
	end
end

# vim: set ts=4 sw=4 sts=4 tw=120
Nahlásit jako SPAM
IP: 89.190.90.–
Mutagen0
Super člen
13. 10. 2012   #2
-
0
-

Opravdu nikdo neví? :( Nevím si s tím vubec rady :(

Nahlásit jako SPAM
IP: 89.190.90.–
ingiraxo+15
Grafoman
13. 10. 2012   #3
-
0
-

spíš nikdo nechce... tady nejde o přepsání, ale o úplně novej script, ruby a c# jsou 2 odlišný jazyky

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Mutagen0
Super člen
13. 10. 2012   #4
-
0
-

Aha tak to potom jo :( ... Ale jak teda mám použít ty knihovny když mi nejdou jako reference přidat do projektu? a přes DLLImport to sice jde ale bohužel nevím jaky příkazy z toho používat a jak :( ... Ale upravovat to v ruby když ten jazyk mi skoro nic neříká je taky na 2 věci :/

Nahlásit jako SPAM
IP: 89.190.90.–
ingiraxo+15
Grafoman
13. 10. 2012   #5
-
0
-

jaký knihovny? ty chceš použít ruby knihovny v c#?

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Mutagen0
Super člen
13. 10. 2012   #6
-
0
-

#5 ingiraxo
Ne ty knihovny jsou normalne psany v C++ (teda aspon myslim) a jde o knihovny ssleay32-1.0.0-msvcrt.dll (OpenSSL) a nějaka libeay32-1.0.0-msvcrt.dll

Nahlásit jako SPAM
IP: 89.190.90.–
ingiraxo+15
Grafoman
13. 10. 2012   #7
-
0
-

#6 Mutagen
ty můžeš normálně použít přes DllImport, akorát musejí být externí (globální) a né uzavřený ve třídě třeba.. hlavně musíš znát přesný API pro deklaraci funkce

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Mutagen0
Super člen
13. 10. 2012   #8
-
0
-

#7 ingiraxo
No právě, a to nevim a nevim kde bych to získal, když jsem našel knihovnu o OpenSSL přímo pro .NET tak sice dohrabavam se fukcím ale třeba to zase vyhodí error hnedka u čtení nebo co 

OpenSSL.Core.BIO readCert = new OpenSSL.Core.BIO(@"data\cert.pem");

A vyhodí to tohle The type initializer for 'OpenSSL.Core.Native' threw an exception. A to je hnedka první řádek co tu mam a vyhazuje to error. Ale podle syntaxe to je dobře.

Nahlásit jako SPAM
IP: 89.190.90.–
Mutagen0
Super člen
13. 10. 2012   #9
-
0
-

Prostě vůbec nevím co s tím ... vždycky se to sekne a vyhodi ten error ... A google nic neradí ...

Edit : jsem přemejšlel že bych použil DLLImport ale zase to nevím jak používat když neznám deklaraci funkcí :(

Nahlásit jako SPAM
IP: 89.190.90.–
ingiraxo+15
Grafoman
13. 10. 2012   #10
-
0
-

měl by sis napřed zjistit, jestli ta libka vůbec podporuje externí volání funkcí.. pokud k tomu není žádný dostupný API, tak většinou funkce volat nejdou

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Mutagen0
Super člen
13. 10. 2012   #11
-
0
-

#10 ingiraxo
No jo tak proč mi ale když mam stahnutou libku přímo pro C# (ManagedOpenSsl.dll) tak mi to hází tenhle error "TypeInitializationException was unhandled, The type initializer for 'OpenSSL.Core.Native' threw an exception."

A přitom ten příkaz podle syntaxe mám dobře

var cert_file = new X509Certificate(BIO.File("/data/cert.pem", "r"));


Edit : Tak už mi to konečně nehází error. Error byl v tom že jsem tam měl jinou libku (o pár kb větší) a která není kompatibilní s libkou na .NET

Nahlásit jako SPAM
IP: 89.190.90.–
ingiraxo+15
Grafoman
13. 10. 2012   #12
-
0
-

to nevim, nikdy jsem nepoužíval openssl v c#..  nech si udělat kompletní výpis chyby do konzole třeba a dej to sem

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Mutagen0
Super člen
13. 10. 2012   #13
-
0
-

 Jak to tak prolízám tak ne a ne najjít tuhle funkci v ty knihovně :( ... A tím pádem ani nevim jak něco podobnýho vytvořit kde by vlastně si zapsalo key certifikat a pak jen poslal na adresu apod ... prostě jako socket

@ctx = OpenSSL::SSL::SSLContext.new()
@ctx.key = key
@ctx.cert = cert
Nahlásit jako SPAM
IP: 89.190.90.–
ingiraxo+15
Grafoman
13. 10. 2012   #14
-
0
-

a jen tak btw. je nutnost použít openSSL? protože v .NET už existuje pár tříd pro práci s SSL

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Mutagen0
Super člen
13. 10. 2012   #15
-
0
-

#14 ingiraxo
No jako není to nutnost, mě jde jen o to abych docílil toho výsledku jako je tenhle kod v ruby (emuluje a zaměnuje POSTy na web)

Nahlásit jako SPAM
IP: 89.190.90.–
Mutagen0
Super člen
13. 10. 2012   #16
-
0
-

A nebo kdyby tu byla možnost to nějak napsat v C++ tak se taky nebudu bránit, sice v něm sem začátečník ale možná by to bylo nezproblemovejší než v C#, nemyslíš?

Protože co jsem tak zjistil, tak ta libka na .NET používá libky který jsou o 1mb menší :D a ta druha asi o 100kb takže asi tím to je ... Nevím no teda ... Kdyby tu byla možnost si Importnout tyhle libky abych je mohl používat jako tady v ruby nebo spíš podobně tak by to bylo nejelpší ale bohužel enznám příkazy co jsou v libce a vypsat asi nijak nejdou co?

Nahlásit jako SPAM
IP: 89.190.90.–
ingiraxo+15
Grafoman
13. 10. 2012   #17
-
0
-
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Mutagen0
Super člen
13. 10. 2012   #18
-
0
-

#17 ingiraxo
Na tohle už jsem právě koukal, ale tam není ta možnost s těma klíčema nebo nevím ale nepříjde mi to že by tam byla ... Je to zapeklitý tohle ... A nevíš jak by se dal použít z libky co si tam importnu příkaz? Nebo příkazy spíš? Že bych to zkusil přes tamto?

Nahlásit jako SPAM
IP: 89.190.90.–
ingiraxo+15
Grafoman
13. 10. 2012   #19
-
0
-
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Mutagen0
Super člen
13. 10. 2012   #20
-
0
-

#19 ingiraxo
tak určitě je to složitější no ... Ale ono třeba v tom ruby to vypada uplně primitivně, když to je vlastně jen pař řádku ... No pak se na to kouknu, protože teďka si dám oraz, už toho je na mě moc ... Furt jenom něco zkouším a zkouším a výsledek žádnej.

Nahlásit jako SPAM
IP: 89.190.90.–
ingiraxo+15
Grafoman
13. 10. 2012   #21
-
0
-

#20 Mutagen
nj, tohle neni scriptovací jazyk, Ruby se používá primárně pro web, takže práce s SSL je jednodušší (stejně tak, jako v PHP třeba)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Mutagen0
Super člen
13. 10. 2012   #22
-
0
-

#21 ingiraxo
Jono docela hodně lehce ... A docela hodně velká nevýhoda ... No mrknu se na to dyl ... Musím si od toho odpočinout ... Ale i tak prostě ... žádná pormenná nic, tak to je pak lehký no :X

Nahlásit jako SPAM
IP: 89.190.90.–
Mutagen0
Super člen
13. 10. 2012   #23
-
0
-

No tak jak to procházím tu stránku na msdn tak pořád nějak nemůžu najít žádou zmínku o nějakých klíčích :( To je prostě naprd ... A ještě k tomu ani pořádně nevím jak to funguje tenhle kod z ruby protoze nevim co se kdy spouší ... Ale tak hlavní priorita je zprovoznit pripojování ... Proč to není v C# taky tak jednoduchy jako v ruby :X

Nahlásit jako SPAM
IP: 89.190.90.–
Mutagen0
Super člen
13. 10. 2012   #24
-
0
-

Jako tohle mě funguje normálně ... Jak certifikát tak klíče to v pohodě vypíše, teďka jenom jak to poslat na server.

	public static void Main(string[] args)
        {
            X509Certificate cert_file = new X509Certificate(BIO.File("data/cert.pem", "r"));
            RSA key_file = RSA.FromPrivateKey(BIO.File("data/cert.key", "r"));
            StreamReader list_file = new StreamReader("data/ps3-updatelist.txt");

            Console.WriteLine(cert_file);
            Console.WriteLine(key_file);

            Console.ReadKey();
        }
Nahlásit jako SPAM
IP: 89.190.90.–
Mutagen0
Super člen
13. 10. 2012   #25
-
0
-
Nahlásit jako SPAM
IP: 89.190.90.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

Podobná vlákna

RUBY — založil plasmo

Znáš základy Ruby on Rails? — založil Monika Jorníčková

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý