Python pyobject库 - 深入对象底层,代码调试和字节码安全分析的工具 ...

打印 上一主题 下一主题

主题 958|帖子 958|积分 2874

pyobject库是一个用于操作Python对象和字节码的库,提供了一系列函数和类,方便开发者进行调试对象、欣赏、搜刮以及字节码的操作,是用于调试Python代码,以及深入Python对象底层的强大工具。
别的,pyobject库还支持3.4至3.14的所有Python版本,封装了Python对象,尤其是字节码的版本差别。
GitHub: pyobject · GitHub
一个简单的示例:
  1. >>> import sys,os
  2. >>> from pyobject import desc, browse
  3. >>> desc(sys.version_info)
  4. sys.version_info(major=3, minor=7, micro=8, releaselevel='final', serial=0):
  5.     count: <built-in method count of sys.version_info object at 0x01349600>
  6.     index: <built-in method index of sys.version_info object at 0x01349600>
  7.     major: 3
  8.     micro: 8
  9.     minor: 7
  10.     n_fields: 5
  11.     n_sequence_fields: 5
  12.     n_unnamed_fields: 0
  13.     releaselevel: 'final'
  14.     serial: 0
  15. >>> search(os, sys, recursions=3)
  16. ["sys.modules['site'].os", "sys.modules['os']", "sys.__interactivehook__.__globals__['os']", "sys.modules['__main__'].os",...]
  17. >>> 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格式),简化了复杂的版本兼容性问题。
初始化

  1. 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函数。
示例用法:
  1. >>> def f():print("Hello")
  2. >>> c=Code.fromfunc(f) # 或 c=Code(f.__code__)
  3. >>> c.co_consts
  4. (None, 'Hello')
  5. >>> c.co_consts=(None, 'Hello World!')
  6. >>> c.exec()
  7. 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企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表