#======================================================================= # Module Marshal Amélioré 2.1 - Sphinx # finalisé le 12/08/2011 # Correction de bugs le 08/12/2013 - Palbolsky # # Crédits demandés #======================================================================= module Marshal # MARSHALGROUP MARSHALGROUP = 655 # STANDARDS regroupe les 3 masques statiques utilisés par le Module Marshal 2.0. # Les 3 masques hexadécimaux doivent convenir chaque chiffre hexadécimal (0 -> 9 et A -> F) # une et une seule fois. #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STANDARDS = [ # Masque statique hexadécimal 1 "51847e6a03bfc2d9", # Masque statique hexadécimal 2 "79d32501b4c86fea", # Masque statique hexadécimal 3 "cdfb5210ae768943" ] #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Marshal.genMasks # génère de nouveaux masques valides pour remplacer les masques existants def self.genMasks keys = [] loop do keys = genKeys break if validKeys(keys) end file = File.open("Masques.log", "w") file.write(" STANDARDS = [\n # Masque statique hexadécimal 1\n \"#{keys[0]}\",\n # Masque statique hexadécimal 2\n \"#{keys[1]}\",\n # Masque statique hexadécimal 3\n \"#{keys[2]}\"\n ]\n") file.close end def self.genKeys keys = [] hexa = [ ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"].sort {rand(3) - 1}, ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"].sort {rand(3) - 1}, ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"].sort {rand(3) - 1} ] for j in 0...3 keys[j] = "" for i in 0...16 index = rand(hexa[j].size) keys[j] += hexa[j][index] hexa[j].delete_at(index) end end return keys end def self.validKeys(keys) for i in 0...keys[0].length return false if keys[0][i] == keys[1][i] or keys[0][i] == keys[2][i] or keys[1][i] == keys[2][i] end return true end # Marshal.encrypt # encode l'objet obj def self.encrypt(obj, filename = nil, *cles) for cle in cles unless cle.nil? or cle.empty? cle = cle.unpack("C*") obj = dump(obj).unpack("C*") i = 0 for c in 0...obj.length obj[c] += cle[c % cle.length] end end end key1 = "" key2 = "" key3 = "" hexa1 = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"] hexa2 = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"] alphanum3 = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" ] for i in 0...16 index1 = rand(hexa1.size) index2 = rand(hexa2.size) index3 = rand(alphanum3.size) key1 += hexa1[index1] key2 += hexa2[index2] key3 += alphanum3[index3] hexa1.delete_at(index1) hexa2.delete_at(index2) alphanum3.delete_at(index3) end obj = dump(obj) str = "" for c in 0...obj.length str += sprintf("%02x", obj[c]).tr(key1, key2) end write = key1.tr(STANDARDS[0], STANDARDS[1]) write += (sprintf("%04x", MARSHALGROUP)).tr(STANDARDS[1], key1) write += key2.tr(STANDARDS[1], key1) write += key3.tr(key1, key2) write += str.tr(STANDARDS[2], key3) if filename.is_a?(String) file = File.open(filename, "w") file.write(write) file.close else return write end end # Marshal.uncrypt # retourne l'objet encodé def self.uncrypt(filename, isFile = false, *cles) chunked = true a = filename if isFile file = File.open(filename, "r") a = file.read file.close end
# Localise les octets ajoutés si le serveur envoie du chunked i,j = 0 loop do if a[i..i] == "\n" i += 1 break end if i > 12 chunked = false break end i += 1 end # Supprime les octets ajoutés si le serveur envoie du chunked if chunked b = filename (b.size-i-1).times do |j| b[j..j] = a[j+i..j+i] end a = b b = nil end key1 = a[0..15].tr(STANDARDS[1], STANDARDS[0]) marshalgroup = a[16..19].tr(key1, STANDARDS[1]) if MARSHALGROUP != 0 and MARSHALGROUP != marshalgroup.to_i(16) print "Le MARSHALGROUP " + marshalgroup.to_i(16).to_s + " des données n'est pas compatible avec le\nMARSHALGROUP " + MARSHALGROUP.to_s + " de cette partie. Les données n'ont pas été intégrées." return end key2 = a[20..35].tr(key1, STANDARDS[1]) key3 = a[36..51].tr(key2, key1) a = a.tr(key3, STANDARDS[2]) str = "" for i in 26...a.size / 2 str += (a[(i * 2)..(i * 2) + 1].tr(key2, key1)).to_i(16).chr end obj = load(str) for cle in cles.reverse unless cle.nil? or cle.empty? cle = cle.unpack("C*") i = 0 for c in 0...obj.length obj[c] -= cle[c % cle.length] end obj = Marshal.load(obj.pack("C*")) end end return obj end end |