CoddityTeam / movaicode

Concours mensuel du Pire Développeur de France
123 stars 10 forks source link

Python Obfuscation #242

Open arueco opened 2 years ago

arueco commented 2 years ago

Movai Code #12 compteurDeMailsPrioritaires()

Introduction

Je déteste les personnes qui relisent mon code, j'ai donc décidé de l'obfusquer un peu...

Code final

Voici mon code final, passé dans python golfer : https://clemg.github.io/pythongolfer/

exec(bytes('牰潩楲慴物獥㴠嬠搢楷桧䁴畤摮牥洭晩汦湩挮浯Ⱒ洢捩慨汥摀湵敤⵲業晦楬⹮潣≭∬桰汹楬䁳畤摮牥洭晩汦湩挮浯崢攊灸摥瑩略獲㴠嬠搢楷桧䁴畤摮牥洭晩汦湩挮浯Ⱒ樢汵瑀瑯浥牰摯捵楴湯昮≲∬桰汹楬䁳畤摮牥洭晩汦湩挮浯Ⱒ洢捩慨汥摀湵敤⵲業晦楬⹮潣≭∬慭瑴楨略捀摯楤祴挮浯崢搊晥挠浯瑰略䑲䵥楡獬牐潩楲慴物獥攨灸摥瑩略獲瀬楲牯瑩楡敲⥳਺††㵸瑳⡲楤⡲牰湩⥴㉛⥝㍛⭝瑳⡲楤⡲牰湩⥴ⵛ崱嬩崴猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩崰嬩崲∫✨⬢瑳⡲楤⡲牰湩⥴㉛⥝㉛㐺⁝ੜ†††猫牴搨物瀨楲瑮嬩崶嬩崲∫∠猫牴搨物瀨楲瑮嬩崰嬩崲猫牴搨物瀨楲瑮嬩崴嬩崳猫牴搨物瀨楲瑮嬩崶嬩崵猫牴搨物瀨楲瑮嬩㜭⥝㑛⁝ੜ†††猫牴搨物瀨楲瑮嬩崸嬩㐭ⴺ崲猫牴搨物瀨楲瑮嬩ㄭ⥝ⵛ㨵㌭⭝䐢⬢瑳⡲楤⡲牰湩⥴㉛⥝㍛⭝䴢⬢瑳⡲楤⡲牰湩⥴せ⥝㍛⭝瑳⡲楤⡲牰湩⥴㍛⥝㍛⁝ੜ†††猫牴搨物瀨楲瑮嬩崰嬩崴∫≐猫牴搨物瀨楲瑮嬩崸嬩㨸〱⭝瑳⡲楤⡲牰湩⥴㙛⥝㍛㔺⭝瑳⡲楤⡲牰湩⥴ㅛ崱嬩㐭ⴺ崲猫牴搨物瀨楲瑮嬩崰嬩崳尠 ††⬠瑳⡲楤⡲牰湩⥴㍛⥝㍛⭝瑳⡲楤⡲牰湩⥴ⵛ崱嬩㐭ⴺ崲猫牴搨物瀨楲瑮嬩崱嬩㌭⭝⠢⬢瑳⡲楤⡲牰湩⥴ⵛ崱嬩㨳崵猫牴搨物瀨楲瑮嬩㜭⥝㑛⁝ੜ†††猫牴搨物瀨楲瑮嬩㠭⥝㍛㔺⭝瑳⡲楤⡲牰湩⥴ㅛ崱嬩㐭ⴺ崲猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩ㄭ⥝ⵛ㨵㌭⭝Ⱒ∠猫牴搨物瀨楲瑮嬩㜭⥝ⵛ崴尠 ††⬠瑳⡲楤⡲牰湩⥴㡛⥝㡛ㄺ崰猫牴搨物瀨楲瑮嬩崶嬩㨳崵猫牴搨物瀨楲瑮嬩ㄱ⥝ⵛ㨴㈭⭝瑳⡲楤⡲牰湩⥴せ⥝㍛⭝瑳⡲楤⡲牰湩⥴㍛⥝㍛⁝ੜ†††猫牴搨物瀨楲瑮嬩ㄭ⥝ⵛ㨴㈭⭝瑳⡲楤⡲牰湩⥴ㅛ⥝ⵛ崳∫㨩屜†∠猫牴搨物瀨楲瑮嬩崰嬩崲猫牴搨物瀨楲瑮嬩崴嬩崳猫牴搨物瀨楲瑮嬩崶嬩崵尠 ††⬠瑳⡲楤⡲牰湩⥴㉛崲嬩崴猫牴搨物瀨楲瑮嬩崲嬩崶猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩崸嬩ㄱ⭝瑳⡲楤⡲牰湩⥴㉛⥝㡛⭝•‽尰湜††•ੜ†††猫牴搨物瀨楲瑮嬩崶嬩崲猫牴搨物瀨楲瑮嬩崴嬩崳猫牴搨物瀨楲瑮嬩崲嬩崸∫∠猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩ㄲ⥝ㅛ崰猫牴搨物瀨楲瑮嬩㈲⥝㑛⁝ੜ†††猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩崲嬩崲猫牴搨物瀨楲瑮嬩崳嬩崳猫牴搨物瀨楲瑮嬩崲嬩崶猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩崸嬩ㄱ⁝ੜ†††猫牴搨物瀨楲瑮嬩崲嬩崸∫∠猫牴搨物瀨楲瑮嬩崳嬩崳猫牴搨物瀨楲瑮嬩ㄱ⥝㍛⭝••猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩ㄲ⥝ㅛ崰尠 ††⬠瑳⡲楤⡲牰湩⥴㉛崲嬩崴猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩崲嬩崲猫牴搨物瀨楲瑮嬩崳嬩崳猫牴搨物瀨楲瑮嬩崲嬩崶猫牴搨物瀨楲瑮嬩崲嬩崳尠 ††⬠瑳⡲楤⡲牰湩⥴㡛⥝ㅛ崱猫牴搨物瀨楲瑮嬩崲嬩崸猫牴搨物瀨楲瑮嬩崱嬩崵∫∺∫屜†††∠猫牴搨物瀨楲瑮嬩崳嬩崳猫牴搨物瀨楲瑮嬩崶嬩崲∫∠尠 ††⬠瑳⡲楤⡲牰湩⥴㉛⥝㍛⭝瑳⡲楤⡲牰湩⥴㉛崱嬩〱⭝瑳⡲楤⡲牰湩⥴㉛崲嬩崴猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩崲嬩崲猫牴搨物瀨楲瑮嬩崳嬩崳尠 ††⬠瑳⡲楤⡲牰湩⥴㉛⥝㙛⭝瑳⡲楤⡲牰湩⥴㉛⥝㍛⭝瑳⡲楤⡲牰湩⥴㡛⥝ㅛ崱猫牴搨物瀨楲瑮嬩崲嬩崸∫∠猫牴搨物瀨楲瑮嬩崳嬩崳猫牴搨物瀨楲瑮嬩ㄱ⥝㍛⁝ੜ†††∫∠猫牴搨物瀨楲瑮嬩㈲⥝㑛⭝瑳⡲楤⡲牰湩⥴㉛⥝㡛⭝瑳⡲楤⡲牰湩⥴㍛⥝㍛⭝瑳⡲楤⡲牰湩⥴㑛⥝㍛⭝瑳⡲楤⡲牰湩⥴㉛⥝㡛⭝瑳⡲楤⡲牰湩⥴㍛⥝㍛⁝ੜ†††猫牴搨物瀨楲瑮嬩崲嬩崶猫牴搨物瀨楲瑮嬩崰嬩崳猫牴搨物瀨楲瑮嬩崳嬩崳猫牴搨物瀨楲瑮嬩崲嬩崸猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩崱嬩崵∫尺湜††††††•ੜ†††猫牴搨物瀨楲瑮嬩崰嬩崲猫牴搨物瀨楲瑮嬩崴嬩崳猫牴搨物瀨楲瑮嬩崶嬩崵猫牴搨物瀨楲瑮嬩㈲⥝㑛⭝瑳⡲楤⡲牰湩⥴㉛⥝㙛⭝瑳⡲楤⡲牰湩⥴㉛⥝㍛⁝ੜ†††猫牴搨物瀨楲瑮嬩崸嬩ㄱ⭝瑳⡲楤⡲牰湩⥴㉛⥝㡛⭝•⬢⬢⬢㴢⬢•⬢瑳⡲⤱∫屜†∠猫牴搨物瀨楲瑮嬩崲嬩崸猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩崲嬩崶尠 ††⬠瑳⡲楤⡲牰湩⥴㡛⥝ㅛ崱猫牴搨物瀨楲瑮嬩崲嬩崸猫牴搨物瀨楲瑮嬩ㄱ⥝㍛⭝•⬢瑳⡲楤⡲牰湩⥴せ⥝㉛⭝瑳⡲楤⡲牰湩⥴㑛⥝㍛⭝瑳⡲楤⡲牰湩⥴㙛⥝㕛⁝ੜ†††猫牴搨物瀨楲瑮嬩㈲⥝㑛⭝瑳⡲楤⡲牰湩⥴㉛⥝㙛⭝瑳⡲楤⡲牰湩⥴㉛⥝㍛⭝瑳⡲楤⡲牰湩⥴㡛⥝ㅛ崱猫牴搨物瀨楲瑮嬩崲嬩崸∫⤧ਢ††硥捥砨਩††敲畴湲攠慶⡬瑳⡲楤⡲牰湩⥴せ⥝㉛⭝瑳⡲楤⡲牰湩⥴㑛⥝㍛⭝瑳⡲楤⡲牰湩⥴㙛⥝㕛⭝瑳⡲楤⡲牰湩⥴㉛崲嬩崴猫牴搨物瀨楲瑮嬩崲嬩崶猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩崸嬩ㄱ⭝瑳⡲楤⡲牰湩⥴㉛⥝㡛⭝䐢⬢瑳⡲楤⡲牰湩⥴㉛⥝㍛⭝䴢⬢瑳⡲楤⡲牰湩⥴せ⥝㍛⭝瑳⡲楤⡲牰湩⥴㍛⥝㍛⭝瑳⡲楤⡲牰湩⥴せ⥝㑛⭝倢⬢瑳⡲楤⡲牰湩⥴㉛⥝㡛⭝瑳⡲楤⡲牰湩⥴㍛⥝㍛⭝瑳⡲楤⡲牰湩⥴㑛⥝㍛⭝瑳⡲楤⡲牰湩⥴㉛⥝㡛⭝瑳⡲楤⡲牰湩⥴㍛⥝㍛⭝瑳⡲楤⡲牰湩⥴㉛⥝㙛⭝瑳⡲楤⡲牰湩⥴せ⥝㍛⭝瑳⡲楤⡲牰湩⥴㍛⥝㍛⭝瑳⡲楤⡲牰湩⥴㉛⥝㡛⭝瑳⡲楤⡲牰湩⥴㉛⥝㍛⭝瑳⡲楤⡲牰湩⥴ㅛ⥝㕛⭝⠢⬢瑳⡲楤⡲牰湩⥴㉛⥝㍛⭝瑳⡲楤⡲牰湩⥴㉛崱嬩〱⭝瑳⡲楤⡲牰湩⥴㉛崲嬩崴猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩崲嬩崲猫牴搨物瀨楲瑮嬩崳嬩崳猫牴搨物瀨楲瑮嬩崲嬩崶猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩崸嬩ㄱ⭝瑳⡲楤⡲牰湩⥴㉛⥝㡛⭝瑳⡲楤⡲牰湩⥴ㅛ⥝㕛⭝Ⱒ⬢瑳⡲楤⡲牰湩⥴㉛崲嬩崴猫牴搨物瀨楲瑮嬩崲嬩崸猫牴搨物瀨楲瑮嬩崳嬩崳猫牴搨物瀨楲瑮嬩崴嬩崳猫牴搨物瀨楲瑮嬩崲嬩崸猫牴搨物瀨楲瑮嬩崳嬩崳猫牴搨物瀨楲瑮嬩崲嬩崶猫牴搨物瀨楲瑮嬩崰嬩崳猫牴搨物瀨楲瑮嬩崳嬩崳猫牴搨物瀨楲瑮嬩崲嬩崸猫牴搨物瀨楲瑮嬩崲嬩崳猫牴搨物瀨楲瑮嬩崱嬩崵∫∩਩牰湩⡴潣灭整牵敄慍汩偳楲牯瑩楡敲⡳硥数楤整牵ⱳ瀠楲牯瑩楡敲⥳
','u16')[2:])

Etape intermédiaire

Si quelqu'un parvenait malencontreusement à lire le code final, sachez que je lui réserve encore des surprises !

prioritaires = ["dwight@dunder-mifflin.com","michael@dunder-mifflin.com","phyllis@dunder-mifflin.com"]

expediteurs = ["dwight@dunder-mifflin.com","jul@totemproduction.fr","phyllis@dunder-mifflin.com","michael@dunder-mifflin.com","matthieu@coddity.com"]

def compteurDeMailsPrioritaires(expediteurs,prioritaires):
    x=str(dir(print)[2])[3]+str(dir(print)[-1])[4]+str(dir(print)[2])[3]+str(dir(print)[0])[2]+"('"+str(dir(print)[2])[2:4] \
      +str(dir(print)[6])[2]+" "+str(dir(print)[0])[2]+str(dir(print)[4])[3]+str(dir(print)[6])[5]+str(dir(print)[-7])[4] \
      +str(dir(print)[8])[-4:-2]+str(dir(print)[-1])[-5:-3]+"D"+str(dir(print)[2])[3]+"M"+str(dir(print)[0])[3]+str(dir(print)[3])[3] \
      +str(dir(print)[0])[4]+"P"+str(dir(print)[8])[8:10]+str(dir(print)[6])[3:5]+str(dir(print)[11])[-4:-2]+str(dir(print)[0])[3] \
      +str(dir(print)[3])[3]+str(dir(print)[-1])[-4:-2]+str(dir(print)[1])[-3]+"("+str(dir(print)[-1])[3:5]+str(dir(print)[-7])[4] \
      +str(dir(print)[-8])[3:5]+str(dir(print)[11])[-4:-2]+str(dir(print)[2])[3]+str(dir(print)[-1])[-5:-3]+", "+str(dir(print)[-7])[-4] \
      +str(dir(print)[8])[8:10]+str(dir(print)[6])[3:5]+str(dir(print)[11])[-4:-2]+str(dir(print)[0])[3]+str(dir(print)[3])[3] \
      +str(dir(print)[-1])[-4:-2]+str(dir(print)[1])[-3]+"):\\n    "+str(dir(print)[0])[2]+str(dir(print)[4])[3]+str(dir(print)[6])[5] \
      +str(dir(print)[22])[4]+str(dir(print)[2])[6]+str(dir(print)[2])[3]+str(dir(print)[8])[11]+str(dir(print)[2])[8]+" = 0\\n    " \
      +str(dir(print)[6])[2]+str(dir(print)[4])[3]+str(dir(print)[2])[8]+" "+str(dir(print)[2])[3]+str(dir(print)[21])[10]+str(dir(print)[22])[4] \
      +str(dir(print)[2])[3]+str(dir(print)[2])[2]+str(dir(print)[3])[3]+str(dir(print)[2])[6]+str(dir(print)[2])[3]+str(dir(print)[8])[11] \
      +str(dir(print)[2])[8]+" "+str(dir(print)[3])[3]+str(dir(print)[11])[3]+" " +str(dir(print)[2])[3]+str(dir(print)[21])[10] \
      +str(dir(print)[22])[4]+str(dir(print)[2])[3]+str(dir(print)[2])[2]+str(dir(print)[3])[3]+str(dir(print)[2])[6]+str(dir(print)[2])[3] \
      +str(dir(print)[8])[11]+str(dir(print)[2])[8]+str(dir(print)[1])[5]+":"+"\\n        "+str(dir(print)[3])[3]+str(dir(print)[6])[2]+" " \
      +str(dir(print)[2])[3]+str(dir(print)[21])[10]+str(dir(print)[22])[4]+str(dir(print)[2])[3]+str(dir(print)[2])[2]+str(dir(print)[3])[3] \
      +str(dir(print)[2])[6]+str(dir(print)[2])[3]+str(dir(print)[8])[11]+str(dir(print)[2])[8]+" "+str(dir(print)[3])[3]+str(dir(print)[11])[3] \
      +" "+str(dir(print)[22])[4]+str(dir(print)[2])[8]+str(dir(print)[3])[3]+str(dir(print)[4])[3]+str(dir(print)[2])[8]+str(dir(print)[3])[3] \
      +str(dir(print)[2])[6]+str(dir(print)[0])[3]+str(dir(print)[3])[3]+str(dir(print)[2])[8]+str(dir(print)[2])[3]+str(dir(print)[1])[5]+":\\n            " \
      +str(dir(print)[0])[2]+str(dir(print)[4])[3]+str(dir(print)[6])[5]+str(dir(print)[22])[4]+str(dir(print)[2])[6]+str(dir(print)[2])[3] \
      +str(dir(print)[8])[11]+str(dir(print)[2])[8]+" "+"+"+"="+" "+str(1)+"\\n    "+str(dir(print)[2])[8]+str(dir(print)[2])[3]+str(dir(print)[2])[6] \
      +str(dir(print)[8])[11]+str(dir(print)[2])[8]+str(dir(print)[11])[3]+" "+str(dir(print)[0])[2]+str(dir(print)[4])[3]+str(dir(print)[6])[5] \
      +str(dir(print)[22])[4]+str(dir(print)[2])[6]+str(dir(print)[2])[3]+str(dir(print)[8])[11]+str(dir(print)[2])[8]+"')"

    exec(x)
    return eval(str(dir(print)[0])[2]+str(dir(print)[4])[3]+str(dir(print)[6])[5]+str(dir(print)[22])[4]+str(dir(print)[2])[6]+str(dir(print)[2])[3]+str(dir(print)[8])[11]+str(dir(print)[2])[8]+"D"+str(dir(print)[2])[3]+"M"+str(dir(print)[0])[3]+str(dir(print)[3])[3]+str(dir(print)[0])[4]+"P"+str(dir(print)[2])[8]+str(dir(print)[3])[3]+str(dir(print)[4])[3]+str(dir(print)[2])[8]+str(dir(print)[3])[3]+str(dir(print)[2])[6]+str(dir(print)[0])[3]+str(dir(print)[3])[3]+str(dir(print)[2])[8]+str(dir(print)[2])[3]+str(dir(print)[1])[5]+"("+str(dir(print)[2])[3]+str(dir(print)[21])[10]+str(dir(print)[22])[4]+str(dir(print)[2])[3]+str(dir(print)[2])[2]+str(dir(print)[3])[3]+str(dir(print)[2])[6]+str(dir(print)[2])[3]+str(dir(print)[8])[11]+str(dir(print)[2])[8]+str(dir(print)[1])[5]+","+str(dir(print)[22])[4]+str(dir(print)[2])[8]+str(dir(print)[3])[3]+str(dir(print)[4])[3]+str(dir(print)[2])[8]+str(dir(print)[3])[3]+str(dir(print)[2])[6]+str(dir(print)[0])[3]+str(dir(print)[3])[3]+str(dir(print)[2])[8]+str(dir(print)[2])[3]+str(dir(print)[1])[5]+")")

print(compteurDeMailsPrioritaires(expediteurs, prioritaires))

Comment cela fonctionne

dir() est une méthode qui retourne la liste des attributs valides d'un objet passé en paramètre.

Ici, j'utilise dir() sur print et j'obtiens une liste comme celle ci :

['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__text_signature__']

Ensuite, je génère un alphabet avec ces attributs grâce à la fonction suivante :

def generateurAlphabet():
    t="abcdefghijklmnopqrstuvwxyz"
    alphabet = {}
    found=False
    for lettre in t:
        for i in range(len(dir(print))):
            for j in range(len(str(dir(print)[i]))):
                if str(dir(print)[i])[j] == lettre:
                    alphabet[lettre]="str(dir(print)[{}])[{}]".format(i,j)
                    found=True
                if found:
                    break
            if found:break
        found=False

    return alphabet

Ainsi, j'obtiens l'alphabet suivant :

{'a': 'str(dir(print)[0])[3]', 'b': 'str(dir(print)[8])[10]', 'c': 'str(dir(print)[0])[2]', 'd': 'str(dir(print)[2])[2]', 'e': 'str(dir(print)[2])[3]', 'f': 'str(dir(print)[6])[2]', 'g': 'str(dir(print)[7])[2]', 'h': 'str(dir(print)[10])[2]', 'i': 'str(dir(print)[3])[3]', 'k': 'str(dir(print)[27])[13]', 'l': 'str(dir(print)[0])[4]', 'm': 'str(dir(print)[6])[5]', 'n': 'str(dir(print)[11])[3]', 'o': 'str(dir(print)[4])[3]', 'p': 'str(dir(print)[22])[4]', 'q': 'str(dir(print)[5])[3]', 'r': 'str(dir(print)[2])[8]', 's': 'str(dir(print)[1])[5]', 't': 'str(dir(print)[2])[6]', 'u': 'str(dir(print)[8])[11]', 'w': 'str(dir(print)[18])[4]', 'x': 'str(dir(print)[21])[10]', 'z': 'str(dir(print)[25])[4]'}

Plus qu'à chiffrer du code grâce à cet alphabet, j'ai décidé de chiffrer le code suivant (on dit bien chiffrer et pas crypter ! https://chiffrer.info/ ):

def compteurDeMailsPrioritairesNormal(expediteurs, prioritaires):
    compteur = 0
    for expediteur in expediteurs:
        if expediteur in prioritaires:
            compteur += 1
    return compteur

Afin d'utiliser un string en tant que code, nous pouvons utiliser exec et eval en python :

def compteurDeMailsPrioritairesAvecEval(expediteurs,prioritaires):
    x="exec('def compteurDeMailsPrioritaires(expediteurs, prioritaires):\\n    compteur = 0\\n    for expediteur in expediteurs:\\n        if expediteur in prioritaires:\\n            compteur += 1\\n    return compteur')"
    exec(x)
    return eval('compteurDeMailsPrioritaires(expediteurs,prioritaires)')

J'espère que ce Movai code vous a plu :)

Matthieu-Coddity commented 2 years ago

c'est... IGNOBLE <3

Matthieu-Coddity commented 2 years ago

Hello @arueco ! avec beaucoup de retard, tu es déclaré grand gagnant de l'édition de septembre ! Peux tu m'envoyer un email à matthieu@coddity.com pour ton magnifique gain? thx!