pyc文件修复出题经历

Posted juren0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的两条指令出错,把指令删除掉,修改字节码长度后即可完成反混淆

 

以上是关于pyc文件修复出题经历的主要内容,如果未能解决你的问题,请参考以下文章

第一次出题经历

代码编译与反编译 (.py文件与.pyc文件互转)

Python啥情况下会生成pyc文件

将python代码编译为PyCodeObject并编组为pyc文件

[Python]反编译.pyc文件

Python生成pyc文件