py2dis - A disassembly engine & library for Python.
py2dis is a disassembly library for Python that does not use any modules/libraries other than colorama, comes with a miniature built-in disassembler engine, and features to assist in disassembling classes, functions, raw bytecode, source code strings, and more!
Features
- Opcode lookups
- Dumping bytecode
- Instruction lookups
- Disassembling Classes
- Disassembling Functions
- Disassembling raw bytecode (passed to function)
- Disassembling source code strings (passed to function)
Disassembling Classes
from lib.py2dis import *
# example.py
# Date: 01/09/22
# Author: 0x80000000
class Target:
def __init__(self: None, message: str) -> None:
self.message = message
def function(self: None) -> None:
print(self.message)
class Example:
def __init__(self: None, Class: None) -> None:
self.Class = Class
def execute(self: None) -> None:
py2dis.disassemble_class(self.Class)
if __name__ == "__main__":
Example(Target).execute()
Disassembling Functions
from lib.py2dis import *
# example.py
# Date: 01/09/22
# Author: 0x80000000
def LoginSystem() -> bool:
if input("Enter the secret code: ") == "1337":
print("You have successfully authenticated!")
return True
return False
class Example:
def __init__(self: None, function: None) -> None:
self.function = function
def execute(self: None) -> None:
py2dis.disassemble_function(self.function)
if __name__ == "__main__":
Example(LoginSystem).execute()
Disassembling Raw Bytecode
from lib.py2dis import *
# example.py
# Date: 01/09/22
# Author: 0x80000000
class Example:
def __init__(self: None, bytecode: bytes) -> None:
self.bytecode = bytecode
def execute(self: None) -> None:
py2dis.disassemble_bytecode(self.bytecode)
if __name__ == "__main__":
Example(b"t\x00d\x01\x83\x01\x01\x00d\x00S\x00").execute()
Disassembling Source Code Strings
from lib.py2dis import *
# example.py
# Date: 01/09/22
# Author: 0x80000000
class Example:
def __init__(self: None, code: str) -> None:
self.code = code
def execute(self: None) -> None:
py2dis.disassemble_source_code(self.code)
if __name__ == "__main__":
Example("print('Hello, World!')").execute()
Looking up Opcodes
from lib.py2dis import *
# example.py
# Date: 01/09/22
# Author: 0x80000000
class Example:
def __init__(self: None, opcode: int) -> None:
self.opcode = opcode
def execute(self: None) -> None:
return py2dis.opcode_lookup(self.opcode)
if __name__ == "__main__":
print(Example(123).execute())
Looking up Instructions
from lib.py2dis import *
# example.py
# Date: 01/09/22
# Author: 0x80000000
class Example:
def __init__(self: None, instruction: str) -> None:
self.instruction = instruction
def execute(self: None) -> None:
return py2dis.instruction_lookup(self.instruction)
if __name__ == "__main__":
print(Example("SEND").execute())
Exporting Bytecode from a Function
from lib.py2dis import *
# example.py
# Date: 01/09/22
# Author: 0x80000000
def LoginSystem() -> bool:
if input("Enter the secret code: ") == "1337":
print("You have successfully authenticated!")
return True
return False
class Example:
def __init__(self: None, function: None) -> None:
self.function = function
def execute(self: None) -> None:
return py2dis.export_raw_bytecode(self.function)
if __name__ == "__main__":
print(Example(LoginSystem).execute())
Requirements
pip3 install colorama
Screenshots
Credits
https://github.com/0x80000000