Created
May 16, 2021 03:01
-
-
Save opensiriusfox/01991231947470091001a81cda364730 to your computer and use it in GitHub Desktop.
A little utility ot obfuscate strings with unicode.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
import click | |
from random import randint | |
from random import random | |
#################################################### | |
##### Example Execution | |
# $ pip3 install click | |
# $ chmod +x ./obfuscate.py | |
# $ ./obfuscate.py "Hello World" --manglecase --dirac-max=5 | |
# Input "Hello World" | |
# | |
# Output "ĥ̻͈̏̔ē͋͆͞ŀ͓̦̈́Ľ͎̖̃̉̈Ŏ̷͕̽͢ ̑͢Ẁ̻̈́ŏ̀̌͌͐ŕ̳ͥ͛̉͝ĺ̟̇ͦĐ̥̄ͭ̀͡" | |
# | |
# $ | |
#################################################### | |
@click.command() | |
@click.option('--no-manglecase/--manglecase', default=True) | |
@click.option('--dirac-min', default=2, type=click.IntRange(0,100)) | |
@click.option('--dirac-max', default=14, type=click.IntRange(0,100)) | |
@click.option('--unmangle-probability', default=0.1, type=click.FloatRange(0,1)) | |
@click.argument('clean_string') | |
def mangle(clean_string, no_manglecase, dirac_min, dirac_max, unmangle_probability): | |
print(f'Input "{clean_string}"\n') | |
respect_case = no_manglecase | |
mangled_string = '' | |
for clean_letter in clean_string: | |
new_letter = mangle_letter(clean_letter, | |
unmangle_probability=unmangle_probability, | |
respect_case=respect_case) | |
if dirac_max < 0: | |
dirac_max = 0 | |
if dirac_min < 0: | |
dirac_min = 0 | |
if dirac_min > dirac_max: | |
dirac_min = dirac_max | |
new_letter += get_diracs(randint(dirac_min,dirac_max)) | |
mangled_string += new_letter | |
print(f'Output "{mangled_string}"\n') | |
def mangle_letter(letter_raw, | |
unmangle_probability: float = 0.10, | |
respect_case: bool = True) -> str: | |
scope = (-1, -1) | |
letter = letter_raw.lower() | |
if letter == 'a': | |
scope = (0x00, 0x05) | |
elif letter == 'c': | |
scope = (0x06, 0x0D) | |
elif letter == 'd': | |
scope = (0x0E, 0x11) | |
elif letter == 'e': | |
scope = (0x12, 0x1B) | |
elif letter == 'g': | |
scope = (0x1C, 0x23) | |
elif letter == 'h': | |
scope = (0x24, 0x27) | |
elif letter == 'i': | |
scope = (0x28, 0x31) | |
elif letter == 'j': | |
scope = (0x34, 0x35) | |
elif letter == 'k': | |
scope = (0x36, 0x37) | |
elif letter == 'l': | |
scope = (0x39, 0x42) | |
elif letter == 'n': | |
scope = (0x43, 0x4B) | |
elif letter == 'o': | |
scope = (0x4C, 0x51) | |
elif letter == 'r': | |
scope = (0x54, 0x59) | |
elif letter == 's': | |
scope = (0x5A, 0x61) | |
elif letter == 't': | |
scope = (0x62, 0x67) | |
elif letter == 'u': | |
scope = (0x68, 0x73) | |
elif letter == 'w': | |
scope = (0x74, 0x75) | |
elif letter == 'y': | |
scope = (0x76, 0x77) | |
elif letter == 'z': | |
scope = (0x79, 0x7E) | |
if scope[0] < 0 or random() < unmangle_probability: | |
return letter_raw | |
new_int = randint(*scope) | |
if respect_case: | |
tmp_int = new_int - scope[0] | |
if letter_raw.isupper(): | |
tmp_int &= 0xFFFE | |
else: # i.e. islower() | |
tmp_int |= 0x0001 | |
new_int = tmp_int + scope[0] | |
else: | |
pass | |
# Now put it into the extended latin range | |
new_chr = chr(0x0100 | new_int) | |
return new_chr | |
# Pull a random list of diarac from the dirac table. | |
# https://en.wikipedia.org/wiki/Combining_character | |
def get_diracs(count) -> str: | |
diracs_list = [] | |
for _ in range(count): | |
tmp_int = 0x4F | |
while tmp_int == 0x4F: | |
tmp_int = randint(0,0x6F) | |
diracs_list.append(chr(0x0300 | tmp_int)) | |
return ''.join(diracs_list) | |
if __name__ == "__main__": | |
mangle() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment