IT评测·应用市场-qidao123.com
标题:
Python pyobject库 - 深入对象底层,代码调试和字节码安全分析的工具
[打印本页]
作者:
忿忿的泥巴坨
时间:
2025-3-16 23:15
标题:
Python pyobject库 - 深入对象底层,代码调试和字节码安全分析的工具
pyobject库是一个用于操作Python对象和字节码的库,提供了一系列函数和类,方便开发者进行调试对象、欣赏、搜刮以及字节码的操作,是用于
调试
Python代码,以及深入Python
对象底层
的强大工具。
别的,pyobject库还支持3.4至3.14的所有Python版本,封装了Python对象,尤其是字节码的版本差别。
GitHub: pyobject · GitHub
一个简单的示例:
>>> import sys,os
>>> from pyobject import desc, browse
>>> desc(sys.version_info)
sys.version_info(major=3, minor=7, micro=8, releaselevel='final', serial=0):
count: <built-in method count of sys.version_info object at 0x01349600>
index: <built-in method index of sys.version_info object at 0x01349600>
major: 3
micro: 8
minor: 7
n_fields: 5
n_sequence_fields: 5
n_unnamed_fields: 0
releaselevel: 'final'
serial: 0
>>> search(os, sys, recursions=3)
["sys.modules['site'].os", "sys.modules['os']", "sys.__interactivehook__.__globals__['os']", "sys.modules['__main__'].os",...]
>>> browse(sys)
复制代码
调用browse(sys)欣赏sys模块后,sys模块的全部属性和函数一览无余:
安装pyobject库
打开命令行终端,输入pip install pyobject即可。
用于调试的重要函数
检察对象
browse(object, verbose=False, name='obj')
调用tkinter欣赏一个Python对象。双击一个属性就能导航到新的对象,
支持后退、前进、刷新,以及及时编辑对象的属性。
(注: 中文界面的版本见 test/browser_chs_locale.py)
参数说明
:
verbose: 与describe雷同,是否打印出对象的特殊方法(如__init__)。
describe(obj, level=0, maxlevel=1, tab=4, verbose=False, file=sys.stdout)
显示出一个对象,输出对象的各个属性。(别名为desc)
参数
:
maxlevel: 打印对象属性的层数。
tab: 缩进的空格数,默认为4。
verbose: 一个布尔值,是否打印出对象的特殊方法(如__init__)。
file: 一个雷同文件的对象,用于输出流。
搜刮对象
search(obj, start, recursions=3, search_str=False)
从一个起点开始搜刮目标对象,返回的是能够访问到目标对象的路径。
如search(os, sys, 3)的结果是["sys.modules['site'].os", "sys.modules['os']", ...]。
假如对象不可达,返回空列表[]。
obj:待搜刮的对象
start:起点对象
recursion:递归层数,默认为3
search_str: 是否将obj当作字符串子串来查找(要求obj必须是字符串)
Code类: 字节码的封装
Code类提供了Python字节码对象的封装,便于操作Python字节码。
Python内部的字节码对象CodeType是不可变的,这里的Code类提供了一个
可变
的字节码对象。
别的和Java字节码差别,Python字节码是
不跨版本
的,差别版本Python表明器的字节码互不兼容,
而Code类提供了字节码的
通用接口
,支持
3.4至3.14
之间的所有Python版本(甚至PyPy的.pyc格式),简化了复杂的版本兼容性问题。
初始化
def __init__(self, code=None)
复制代码
Code类可以使用现有的CodeType对象或另一个Code实例进行初始化。假如未提供参数,则会创建一个默认的CodeType对象。
属性
_code: 当前Code对象的内部字节码。
co_argcount: 位置参数的数量。
co_cellvars: 被嵌套函数所引用的局部变量名称的元组。
co_code: 表示字节码指令序列的bytes范例。
co_consts: 字节码所使用的字面值的元组。
co_filename: 被编码代码地点的文件名。
co_firstlineno: 字节码对应到源文件首行的行号。
co_flags: 表明器所用的多个旗标。
co_freevars: 自由变量名称的元组。
co_kwonlyargcount: 仅关键字参数的数量。
co_varnames: 包括局部变量名称的元组。
方法
重要方法
exec(globals_=None, locals_=None): 在全局和局部作用域字典中执行代码对象。
eval(globals_=None, locals_=None): 执行代码对象并获取返回值。
copy(): 复制一份Code对象。
to_code(): 将Code实例转换回内置的CodeType对象。
to_func(globals_=None, name=None, argdefs=None, closure=None, kwdefaults=None): 将代码对象转换为Python函数。
示例用法
:
>>> def f():print("Hello")
>>> c=Code.fromfunc(f) # 或 c=Code(f.__code__)
>>> c.co_consts
(None, 'Hello')
>>> c.co_consts=(None, 'Hello World!')
>>> c.exec()
Hello World!
复制代码
其他函数
make_list(start_obj, recursions=2, all=False)
从一个起点对象start_obj开始,天生所有可到达的对象的列表,列表中无重复的对象。
参数
:
start: 开始搜刮的对象。
recursion: 递归次数。
all: 是否将对象的特殊属性(如__init__)加入列表。
make_iter(start_obj, recursions=2, all=False)
功能与make_list雷同,但返回一个天生器,且对象可能有重复。
objectname(obj)
返回一个对象的名称,形如xxmodule.xxclass。
示例
: objectname(int) -> 'builtins.int'
bases(obj, level=0, tab=4)
打印出对象的基类。
参数
:
tab: 缩进的空格数,默认为4。
C扩展库pyobj_extension
该模块使用C语言编写,提供了直接操作Python对象的功能。
重要函数
convptr(pointer): 将pointer这个整数(表示指针)转换为Python对象,和id(obj)将对象转为指针相反。
py_decref(object, n): 将对象的引用计数减小1。
py_incref(object, n): 将对象的引用计数增长1。
getrealrefcount(obj): 获取对象的实际引用计数(不包含调用getrealrefcount()时引用计数增长的1)。
setrefcount(obj, n): 设置对象的实际引用计数,不思量调用时新增的计数。
警告: 不本地调用这些函数可能导致段错误。
使用pyobject库的案例
pyobject库目前已应用于多个字节码底层工具,如:
pyc-zipper
parallel-decompiler
关于作者的其他用pyobject的字节码文章,参见:Python pyc文件 bytecode的压缩, 加壳和脱壳解析
总结
pyobject库是面向Python开发者的强大的库,能便捷地输出、欣赏以及操作Python对象,用于调试等用途。
别的,pyobject库还封装了Python底层字节码,用于代码混淆等安全用途。
通过使用pyobject,开发者能更高效地操作Python底层对象和字节码,而无需思量复杂的底层细节。
文章到此结束,接待点赞、收藏!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4