zoukankan      html  css  js  c++  java
  • pyc文件修复出题经历

      pyc文件是python程序编译生成的字节码文件,uncompyle工具或者在线反编译工具可以很容易将pyc文件反编译,通过加入混淆指令可以达到在不影响运行的情况下欺骗过反编译工具的目的,从而达到保护目的。混淆的方法可以是加入一些无意义的跳转分支,错误的语句使反编译工具工作失败,但又在跳转语句的作用下跳过了执行。

    1.生成pyc文件

    python -m xxx.py 

    2.pyc文件的格式

    附上pyc文件的字节码,

    03f3 0d0a magic表示python的版本信息;

    6206 b160  时间戳,编译的时间信息

    63   Blockde的开头

    后4字节0000 0000 :argcount参数个数

    后4字节0000 0000: nlocals局部变量个数

    后4字节1b00 0000: stacksize栈空间大小

    后4字节4000 0000:flags

    73:类型string

    3501 0000 字节长度(小端模式)

    之后即为opcode

    参考:PYC文件格式分析 (kdr2.com)

    混淆实现:

    在opcode中添加一句加载超过范围的变量指令,而后再添加一句跳转指令跳过,达成不影响执行而且能欺骗反编译工具的目的

    JUMP_ABSOLUTE  6
    LOAD_CONST  255
    

     如上,无条件跳转到偏移为6的地方去执行,后面跟一条出错指令加载数据255;调到偏移为6是因为添加混淆指令后原正确指令的第一句在偏移为6处;注意还应该修改长度,即加6

    添加混淆之后:

    完成混淆。

    二、解答:

    pycdump工具对pyc文件进行转储,如果文件被混淆过会报出相应的错

    python pycdump.py xxx.pyc
    

      

     

     可以看到相应的报错信息,在偏移为0和偏移为3的两条指令出错,把指令删除掉,修改字节码长度后即可完成反混淆

  • 相关阅读:
    jstl核心标签库
    乱码的解决
    eclipse 中 Servlet 模板代码(其实是代码提示模板)
    因为最近一直在和数据库打交道,所以做了几个小封装
    意外发现的大批量导入数据SqlBulkCopy类
    Http相关
    Tomcat相关
    对于反射中的invoke()方法的理解
    SqlCommandBuilder类是如何构建T-Sql语句
    模拟在内存中的数据库DataSet相关的类
  • 原文地址:https://www.cnblogs.com/ren-ctfnote/p/14837478.html
Copyright © 2011-2022 走看看