{"id":19132893,"url":"https://github.com/dthung1602/pyobfusinator","last_synced_at":"2025-09-08T17:32:49.112Z","repository":{"id":155308127,"uuid":"631529746","full_name":"dthung1602/pyobfusinator","owner":"dthung1602","description":"Just another Python code obfuscator","archived":false,"fork":false,"pushed_at":"2023-04-26T17:22:08.000Z","size":278,"stargazers_count":8,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-09T04:03:31.517Z","etag":null,"topics":["builtin-functions","code-golf","obfuscator","python3","zalgo-text"],"latest_commit_sha":null,"homepage":"https://dthung1602.github.io/pyobfusinator/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dthung1602.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-04-23T10:04:34.000Z","updated_at":"2025-03-28T04:03:58.000Z","dependencies_parsed_at":"2024-08-15T10:33:05.149Z","dependency_job_id":null,"html_url":"https://github.com/dthung1602/pyobfusinator","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/dthung1602/pyobfusinator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dthung1602%2Fpyobfusinator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dthung1602%2Fpyobfusinator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dthung1602%2Fpyobfusinator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dthung1602%2Fpyobfusinator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dthung1602","download_url":"https://codeload.github.com/dthung1602/pyobfusinator/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dthung1602%2Fpyobfusinator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274222444,"owners_count":25244054,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-08T02:00:09.813Z","response_time":121,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["builtin-functions","code-golf","obfuscator","python3","zalgo-text"],"created_at":"2024-11-09T06:19:58.616Z","updated_at":"2025-09-08T17:32:48.782Z","avatar_url":"https://github.com/dthung1602.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"docs/img-social.png\" width=\"100%\" style=\"border-radius: 8px\"\u003e\n\n## What is this?\n\nJust another Python code obfuscator\n\n## Feature\n\nPyObfusinator has 2 methods to obfuscate code:\n\n### Inflation\n\nRewrite the whole program using only 4 built-in functions: `exec`, `eval`, `str`, `all`, with `()`, `[]`, and `+`\n\nFor example, a simple `print('hello world')` becomes\n\n```python\nexec(str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(eval(str(str)[all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])]+str(str)[all([])+all([])+all([])]+str(str)[all([])+all([])]+str(str)[all([])+all([])+all([])+all([])]+str(())[all([[]])]+str(())[all([])]))[all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(eval)[all([])+all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(eval(str(str)[all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])]+str(str)[all([])+all([])+all([])]+str(str)[all([])+all([])]+str(str)[all([])+all([])+all([])+all([])]+str(())[all([[]])]+str(())[all([])]))[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])+all([])+all([])+all([])]+str(eval)[all([])+all([])+all([])]+str(eval(str(str)[all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])]+str(str)[all([])+all([])+all([])]+str(str)[all([])+all([])]+str(str)[all([])+all([])+all([])+all([])]+str(())[all([[]])]+str(())[all([])]))[all([])+all([])+all([])+all([])+all([])+all([])]+str(eval(str(str)[all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])]+str(str)[all([])+all([])+all([])]+str(str)[all([])+all([])]+str(str)[all([])+all([])+all([])+all([])]+str(())[all([[]])]+str(())[all([])]))[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])+all([])+all([])+all([])]+str(eval(str(str)[all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])]+str(str)[all([])+all([])+all([])]+str(str)[all([])+all([])]+str(str)[all([])+all([])+all([])+all([])]+str(())[all([[]])]+str(())[all([])]))[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(eval)[all([])+all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])]+str(eval)[all([])]+str(str)[all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])]+str(str)[all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])+all([])+all([])+all([])]+str(eval)[all([])])\nexec(eval(str(eval)[all([])]+str([])[all([[]])]+str(all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([]))+str([])[all([])])+str(str)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(eval)[all([])+all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])]+str(())[all([[]])]+eval(str(eval)[all([])]+str([])[all([[]])]+str(all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([]))+str([])[all([])])+eval(str(eval)[all([])]+str([])[all([[]])]+str(all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([]))+str([])[all([])])+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])]+str(str)[all([])+all([])]+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])+all([])+all([])+all([])]+eval(str(eval)[all([])]+str([])[all([[]])]+str(all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([]))+str([])[all([])])+str(eval)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])]+str(str)[all([])+all([])]+eval(str(eval)[all([])]+str([])[all([[]])]+str(all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([]))+str([])[all([])])+eval(str(eval)[all([])]+str([])[all([[]])]+str(all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([]))+str([])[all([])])+str(())[all([])]+eval(str(eval)[all([])]+str([])[all([[]])]+str(all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([])+all([]))+str([])[all([])]))\n```\n\n### Unicode magic\n\n\"Compress\" the whole program using zalgo text\n\nFor example, `print('hello world')` becomes\n\n```python\nb='E͉͎͔͈͐͒̈̇͌͌ͅ͏̀͗͏͒͌̈́̇̉ͯ'.encode();exec(''.join(chr(((h\u003c\u003c6\u002664|c\u002663)+22)%133+10)for h,c in zip(b[1::2],b[2::2])))\n```\n\n## Installation\n\n1. Clone this project\n2. Make sure you have [poetry](https://python-poetry.org/) installed\n3. Run\n    ```shell\n    poetry install\n    ```\n\n## Command line\n\nOnce installed, call the command line directly\n\n```pyobfusinator -i source.py -o dest.py -f```\n\nOr using the python module\n\n```python3 -m pyobfusinator -i source.py -o dest.py -f```\n\nAll available options:\n\n```text\npyobfusinator [-h] [-i INPUT] [-o OUTPUT] [-v] (-f | -c)\noptions:\n  -h, --help                  Show this help message and exit\n  -i INPUT, --input INPUT     Input file. Leave empty to read from stdin\n  -o OUTPUT, --output OUTPUT  Output file. Leave empty to write to stdout\n  -v, --verbose               Print extra info\n  -f, --inflate               Make the code inflated by using only exec, eval, str, and all\n  -c, --compress              Compress the code with unicode magic\n```\n\n## API\n\n```python\nfrom pyobfusinator import inflate, deflate, unicode_compress, unicode_decompress\n\ntext = \"print('hello world')\"\n\n# inflate obfuscation\ninflated_text = inflate(text)  # exec(str(eval)[all([])+all([])...\noriginal_text = deflate(inflated_text)  # print('hello world')\n\n# unicode magic obfuscation\ncompressed_text = unicode_compress(text)  #  b='E͉͎͔͈͐͒̈̇͌͌ͅ͏̀͗͏͒͌̈́̇̉ͯ'.encode()...\noriginal_text = unicode_decompress(compressed_text)  # print('hello world')\n```\n\n## How does it work?\n\n### Inflation\n\nNumbers:\n\n```python\n0 == all([[]])  # this equals False\n1 == all([])  # this equals True\n2 == all([]) + all([])\n3 == all([]) + all([]) + all([])\n...\n```\n\nOnce we get the numbers down, we can use them to access any index of a string to obtain any character. \n\n```python\n\"l\" == str(str)[2]    # str(str)  == \"\u003cclass 'str'\u003e\"\n\"o\" == str(eval)[16]  # str(eval) == \"\u003cbuilt-in function eval\u003e\"\n\"b\" == str(eval)[1]   # str(eval) == \"\u003cbuilt-in function eval\u003e\"\n...\n```\n\nThis way, we are able to get 17 characters. With these 17 chars, we can write `exec(\"from string import printable as b\")`\n\nFinally, we can represent any printable character by accessing its index: b\\[idx]\n\n### Unicode zalgo magic\n\nIdea and implementation from [DaCoolOne](https://github.com/DaCoolOne/DumbIdeas/blob/main/reddit_ph_compressor/out.py) reddit comment.\n[Link]()\n\nI love it so much that I include it here\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdthung1602%2Fpyobfusinator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdthung1602%2Fpyobfusinator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdthung1602%2Fpyobfusinator/lists"}