; .__ ; _____ ____ ____ ____ | |__ ; / \ / _ \_/ ___\/ _ \| | \ Poly Engine ;| Y Y ( <_> ) \__( <_> ) Y \ ;|__|_| /\____/ \___ >____/|___| / ; \/ \/ \/ ; ; [+] Simple PoC d'un moteur polymorphique (code et routine de déchiffrement) ; [+] 1byte XOR par clef aléatoire ; [+] Le moteur peut changer la clef, et certaines instructions (au niveau du code en lui-même et de l'ordre des instructions) ; [+] Ce n'est ni nouveau, ni avancé... Ce papier est uniquement écrit à but éducatif ; ; By: SWaNk 2019 - Back in business, VX forever! ; ;https://fr.wikipedia.org/wiki/Kerodon_rupestris (Kerodon rupestris) format PE GUI 4.0 entry start include "%include%/win32a.inc" ; Voici la macro de chiffrement polymorphe (1 byte xor). ; Il s'agit simplement d'un XOR d'un octet aléatoire (de 0x00 à 0xFF) généré lors de la compilation. ; C'est seulement un exemple de comment cela peut-être implementé... Utilisez votre imagination pour l'améliorer macro encrypt dstart,dsize { local ..char key = %t and 0xff repeat dsize load ..char from dstart+%-1 ..char = ..char xor key store ..char at dstart+%-1 end repeat } ; L'idée était de créer une macro didactique. Celle ci va séparer le champ des valeurs possibles de la clef en 2 (0xff / 2 = 0x7f) ; ; Si la clef générée est supérieure à 0x7f, edx stockera real_start, tandis que ecx recevra code_size; de plus l'opération d'incrémentation du registre edx sera "inc edx" ; Si la clef générée est inférieure à 0x7f, c'est l'inverse, l'ordre change; de plus l'opération d'incrémentation du registre edx sera "add edx, 1" macro simplePoly { if key > 0x7f mov edx,real_start mov ecx,code_size else mov ecx,code_size mov edx,real_start end if @@: xor byte [edx],key if key > 0x7f inc edx else add edx,1 end if loop @B } ; Cette macro de déchiffrement va opérer à partir de l'entry point. ; mov edx,mocoh.401010 | The order of this instructions ; mov ecx,1C | can change ; xor byte ptr ds:[edx],F4 | The key will change (this case is F4) ; inc edx | This can change to "add edx, 1" ; loop mocoh.40100A ;============================================================ section ".code" code readable writeable ;============================================================ start: simplePoly real_start: ; Ajoutez votre code ici, c'est là que la routine de chiffrement commence à opérer stdcall [MessageBox],0,msg,title,MB_ICONASTERISK stdcall [ExitProcess],0 ; Fin du code chiffré display "Encrypting this shit... " code_size = $ - real_start encrypt real_start,code_size display "done",13,10 ;============================================================ section ".data" data readable writeable import ;============================================================ library kernel32,"kernel32.dll",user32,"user32.dll" include "%include%/api/kernel32.inc" include "%include%/api/user32.inc" title db "SWaNk 2019",0 msg db "compile 2 times and compare the hashes and decryption instruction bitches!",0 ;Traduit par S01den (@s01den) ;) ;Share knowledge!