python字节码手工还原python源码的示例分析


今天就跟大家聊聊有关python字节码手工还原python源码的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。> Python 代码先被编译为字节码后,再由Python虚拟机来执行字节码, Python的字节码是一种类似汇编指令的中间语言, 一个Python语句会对应若干字节码指令,虚拟机一条一条执行字节码指令, 从而完成程序执行。Python dis 模块支持对Python代码进行反汇编, 生成字节码指令。dis.dis()将CPython字节码转为可读的伪代码(类似于汇编代码)。结构如下:其实就是这样的结构:LOAD_CONST加载const变量,比如数值、字符串等等,一般用于传给函数的参数转为python代码就是:LOAD_FAST一般加载局部变量的值,也就是读取值,用于计算或者函数调用传参等。STORE_FAST一般用于保存值到局部变量。这段bytecode转为python就是:函数的形参也是局部变量,如何区分出是函数形参还是其他局部变量呢?形参没有初始化,也就是从函数开始到LOAD_FAST该变量的位置,如果没有看到STORE_FAST,那么该变量就是函数形参。而其他局部变量在使用之前肯定会使用STORE_FAST进行初始化。具体看下面的实例:对应的python代码如下,对比一下就一目了然。LOAD_GLOBA免费云主机域名L用来加载全局变量,包括指定函数名,类名,模块名等全局符号。STORE_GLOBAL用来给全局变量赋值。对应的python代码BUILD_LIST用于创建一个list结构。对应python代码是:另外再看看一种常见的创建list的方式如下:一个实例bytecode如下:转为python代码是:BUILD_MAP用于创建一个空的dict。STORE_MAP用于初始化dict的内容。对应的python代码是:再看看修改dict的bytecode:对应的python代码是:BUILD_SLICE用于创建slice。对于list、元组、字符串都可以使用slice的方式进行访问。但是要注意BUILD_SLICE用于[x:y:z]这种类型的slice,结合BINARY_SUBSCR读取slice的值,结合STORE_SUBSCR用于修改slice的值。另外SLICE+n用于[a:b]类型的访问,STORE_SLICE+n用于[a:b]类型的修改,其中n表示如下:下面看具体实例:SETUP_LOOP用于开始一个循环。SETUP_LOOP 26 (to 35)35表示循环退出点。对应python代码是:这是典型的for+in结构,转为python代码就是:POP_JUMP_IF_FALSEJUMP_FORWARD一般用于分支判断跳转。POP_JUMP_IF_FALSE表示条件结果为FALSE就跳转到目标偏移指令。JUMP_FORWARD直接跳转到目标偏移指令。转为python代码是:前面介绍第二列表示指令在函数中的偏移地址,所以看到0就是函数开始,下一个0前一条指令就是函数结束位置,当然也可以通过RETURN_VALUE来确定函数结尾函数调用类似于push+call的汇编结构,压栈参数从左到右依次压入(当然不是push,而是读取指令LOAD_xxxx来指定参数)。函数名一般通过LOAD_GLOBAL指令指定,如果是模块函数或者类成员函数通过LOAD_GLOBAL+LOAD_ATTR来指定。先指定要调用的函数,然后压参数,最后通过CALL_FUNCTION调用。CALL_FUNCTION后面的值表示有几个参数。支持嵌套调用:这段bytecode转换成python代码就是其他常见指令,一看就明白,就不具体分析了,更多详细内容请看官方文档。基础运算还有一套对应的BINARY_xxxx指令,两者区别很简单。看完上述内容,你们对python字节码手工还原python源码的示例分析有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注云编程开发博客行业资讯频道,感谢大家的支持。

相关推荐: https域名如何配置

小编给大家分享一下https域名如何配置,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!任何东西都是有保质期的网络安全证书也不例外,失效大多是因为您在浏览器上访问网上银行,银行类,财付通,邮件邮箱等等个人私密性的网站较多时会出现安全证书失效国企的提…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 02/03 11:23
Next 02/03 11:23