当前位置: 首页 > news >正文

西安市建设监理协会网站网站地址地图怎么做

西安市建设监理协会网站,网站地址地图怎么做,做游戏代练的网站,ssh可以做wap网站么今天第二次看见python字节码的逆向题#xff0c;然后发现了一个介绍Python逆向的文章#xff0c;所以把文章里的内容简单整理记录一下。 文章参考#xff1a;https://www.cnblogs.com/blili/p/11799398.html Python运行原理#xff1a; 一.什么是Python Python 是一种解…今天第二次看见python字节码的逆向题然后发现了一个介绍Python逆向的文章所以把文章里的内容简单整理记录一下。 文章参考https://www.cnblogs.com/blili/p/11799398.html Python运行原理 一.什么是Python Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。 二.解释性语言和编译型语言的区别 我们编程都是用的高级语言计算机不能直接理解高级语言只能理解和运行机器语言所以必须要把高级语言翻译成机器语言计算机才能运行高级语言所编写的程序。翻译的方式有两种一个是编译一个是解释。 用编译型语言写的程序执行之前需要一个专门的编译过程通过编译系统不仅仅只是通过编译器编译器只是编译系统的一部分把高级语言翻译成机器语言把源高级程序编译成为机器语言文件。 解释型语言没有严格编译汇编过程由解释器将代码块按需要变运行边翻译给机器执行。因此解释型语言一度存在运行效率底重复解释的问题。但是通过对解释器的优化!可以提高解释型语言的运行效率。Python就属于这一种编程语言。 三.Python运行原理概述 Python没有严格意义上的编译和汇编过程。一般可以认为编写好的python源文件由python解释器翻译成以.pyc为结尾的字节码文件。pyc文件是二进制文件可以由python虚拟机直接运行。 注有的朋友可能会问为什么我运行python有时候生成pyc文件有时候没有呢Python在执行import语句时将会到已设定的path中寻找对应的模块。并且把对应的模块编译成相应的PyCodeObjectpython中的一个类中间结果然后创建pyc文件并将中间结果写入该文件。然后Python会import这个pyc文件实际上也就是将pyc文件中的PyCodeObject重新复制到内存中。而被直接运行的python代码一般不会生成pyc文件。 加载模块时如果同时存在.py和.pycPython会尝试使用.pyc如果.pyc的编译时间早于.py的修改时间则重新编译.py并更新.pyc。 四.综述 Python源码-python解释器-.pyc文件-python虚拟机运行 Python的pyc文件结构 Python代码的编译结果就是PyCodeObject对象。PyCodeObject对象可以由虚拟机加载后直接运行而pyc文件就是PyCodeObject对象在硬盘上的保存形式。因此我们先分析PyCodeObject对象的结构随后再涉及pyc文件的二进制结构。 一.PyCodeObject对象结构 二.pyc文件生成 python中使用marshal.dump的方法将PyCodeObject对象转化为对应的二进制文件结构。每个字段在二进制文件中的结构如下图 pyc文件结构主要包括两部分pyc文件头部表示和PyCodeObject对象部分。上面对PyCodeObject对象的二进制部分已经有了了解pyc文件头部比较简单在python2中只占用4个字节包含两个字段magic和mtime完整的pyc文件结构见下图  python字节码反编译 经过编译的python文件可以提高程序的运行速度一定程度上也对源代码起到了保护作用。然而如果我们只有编译过的python字节码文件就给我们审查源码造成了一定的困难这就引出了python字节码反编译的需求。 根据python的编译原理我们知道PyCodeObjectData是python源文件作为一个实例化的类通过python内置库函数marshal.dumps生成的二进制数据段因此通过marshal.loads(PyCodeObjectData) 我们可以得到PyCodeObjectData反序列化的对象。 使用python内置模块dis可以对PyCodeObject进行反编译从而获取到python二进制字节码代码段的“汇编形式”。这样可以便于对字节码进行阅读。 Python字节码解读 字节码结构如下 源码行号 | 跳转注释符 | 指令在函数中的偏移 | 指令符号助记符 | 指令参数 | 实际参数值 上图表示 该字节码指令在源码中对应59行此处是跳转的目的地址82该字节指令的字节码偏移操作指令对应的助记符为LOAD_GLOBAL操作参数为6操作参数对应的实际值为disassemble 常见字节码解读 1.常量 加载常量只有一行LOAD_CONST对应源码第1行字节码偏移地址0字节常量数组中索引0实际常量值‘123 ’ 2.局部变量 加载局部变量aLOAD_CONST加载常量1调用STORE_NAME参数a并将变量a存储为1 同理加载局部变量b 3.全局变量 加载全局变量a与加载局部变量不同的是通过STORE_GLOBAL在存储变量 4.数据类型list 先将所有的list元素加载调用BUILD_LIST方法生成list于内存中通过STORE_NAME将堆栈中的list存储于局部变量a中 5.数据类型dict BUILD_MAP声明字典元素数量通过两次LOAD_CONST后调用STORE_MAP生成键值对存于堆栈最终通过STORE_NAME将堆栈中长度为2的两个键值对最为字典数据类型存储在a中 6.数学运算 字节码中显示先对局部变量a、b赋值通过LOAD_NAME加载局部变量调用加法BINARY_ADD生成结果存储与堆栈中使用STORE_NAME将堆栈中的计算结果存储与局部变量c 加减乘除的运算字节码相似不不再赘述读者可以自行分析如下图 上图中为对a、b做加减乘除的字节码因为没有存储计算结果所以每次运算完没有使用STORE_NAME方法存储解释器默认调用POP_TOP方法将计算结果从堆栈顶部弹出以保证堆栈平衡。 7.for循环 上图显示一个FOR循环的过程。SETUP_LOOP表明循环开始参数说明此循环知道字节码偏移28字节的指令结束也就是28字节开始不是循环。调用range方法生成generator存于堆栈。FOR_ITER调用堆栈声明generator作用到字节码偏移位置27字节。从第16字节起到27为generator迭代作用域。其中为一个print函数。 8.if判断 以一个简单的IF判断为例先加载需要比较的常量调用COMPARE_OP指令对堆栈中两个常量进行比较将结果存入堆栈。调用POP_JUMP_IF_FALSE指令判断栈顶值来决定程序运行顺序实现判断功能。
http://www.hkea.cn/news/14277627/

相关文章:

  • 四川住房和城乡建设厅网站三类人员网站开发职责
  • 贵阳市网站建设营销方案模板范文
  • 网站建设模板哪里下载营销软文案例
  • 南通网站建设外包wordpress root权限
  • 学做面包到什么网站植物设计网站推荐
  • 网站更改wordpress更新删除
  • 大型网站建设动力无限山东省建设厅举报网站
  • swoole做网站公众号做微网站吗
  • 建筑网站图片godaddy wordpress迁移
  • PPT做音乐网站介绍网站开发都用什么数据库
  • 甘肃做网站多少钱wordpress图片备用地址
  • 网页制作企业网站作业网上设计接单的网站
  • 建设网站联盟c2c网站有哪些
  • 芜湖网站建设优化库尔勒谁在做电商网站建设
  • 河南网站建设推广公司荣成网站建设
  • 易网官方网站南通门户网站建设
  • 南京市建设工程网站南宁定制网站建设
  • 平阳县住房和城乡规划建设局网站如何用网站做淘宝客
  • 洞泾做网站公司网站pv是什么
  • 360免费建站 服务期班级网页模板
  • 哪里有门户网站开发.net 开源 企业网站
  • 江苏住房和城乡建设网站做网站用哪个开发工具好
  • 简述企业网站如何推广wordpress采集功能
  • 网站icp没有备案怎么检查六安人论坛最新招聘
  • 网上服务旗舰店东昌府聊城网站优化
  • 网站建设的基本内容外贸模版网站
  • icp备案后要建网站吗正规网站有哪些
  • 自适应型网站建设服务电话折腾wordpress
  • WordPress网站接入公众号杭州优化公司哪家好
  • 网站开发用户需求说明书定西网站建设公司排名照片