精华内容
下载资源
问答
  • pyc反编译.rar

    2019-11-24 09:12:20
    这是个windows版的工具,可以反编译单个pyc,pyo 文件,或者选定反编译一个指定文件夹下面的pyc,pyo 文件, 确实很好用.
  • python文件编译与pyc反编译

    千次阅读 2020-07-10 17:02:41
    既然有反编译的需求,为了保护pyc文件不被反编译,我们又希望找到一个方法来防止pyc文件被反编译。 本文介绍了如何将py文件编译成pyc和pyo文件,也介绍了如何反编译pyc文件, 又给出了一种字节码混淆方法来防止pyc...

    pyc是编译py之后生成的二进制文件。当我们发布系统的时候不想让别人看到源代码,就需要将py文件编译生成pyc文件,对外只提供pyc文件。同样,如果拿到一个python程序,只有pyc文件,我们就无法看到源码,希望有办法反编译pyc文件以获得源码。

    既然有反编译的需求,为了保护pyc文件不被反编译,我们又希望找到一个方法来防止pyc文件被反编译。

    本文介绍了如何将py文件编译成pyc和pyo文件,也介绍了如何反编译pyc文件, 又给出了一种字节码混淆方法来防止pyc文件被反编译。

     

    1 编译py文件到pyc和pyo

    pyc是编译py之后生成的二进制文件,由python虚拟机来执行的。当我们发布系统的时候不想让别人看到源代码,就需要将py文件编译生成pyc文件,对外只提供pyc文件。

    同时,在模块被加载时,.pyc文件比.py文件更快

    但是pyc的内容跟python的版本相关,不同的版本编译后的pyc文件不同,2.5编译的pyc文件不能到3.5上执行.

     

     

    发布python软件的过程为:

    1. 生产pyc文件: python -m compileall .

    2. 删除py文件: find . -name “*.py” |xargs rm -rf

    3. 删除pycache目录: find . -name “pycache” |xargs rm -rf

    1.1 Python2 编译

    命令:

    python -m py_compile file.py

    python -m py_compile {file1,file2}.py

    编译完成后,生成的 .pyc文件在当前目录。

     

    可以使用-O或者-OO转换python命令来减少编译模块的大小

        -O转换会帮你去掉assert语句

        -OO转换会帮你去掉assert语句和__doc__文档字符串

    由于一些程序可能依赖于assert语句或文档字符串,应该在确认需要的情况下使用这些选项。

    例如 python –O -m py_compile file.py 会在本目录生成 file.pyo

     

    1.2 python3 编译

    Python3的编译和python2一样,只是在python3之后编译后的文件在pycache目录下,而不是与源文件同一目录。

    那么如何让python3实现生成的pyc与源代码在同一目录呢?可以加上-b参数,例如

    Python3 -m py_compile -b file.py

     

     

    1.3 批量编译

    python -m compileall DIR

    python3 -m compileall –b DIR

    DIR为需要编译的目录

    例如: python -m compileall .

     

    参数说明:

    usage: python compileall.py [-l] [-f] [-q] [-d destdir] [-x regexp] [-i list] [directory|file ...]

     

    arguments: zero or more file and directory names to compile; if no arguments given,

               defaults to the equivalent of -l sys.path

     

    options:

    -l: don't recurse into subdirectories

    -f: force rebuild even if timestamps are up-to-date

    -q: output only error messages

    -d destdir: directory to prepend to file paths for use in compile-time tracebacks and in

                runtime tracebacks in cases where the source file is unavailable

    -x regexp: skip files matching the regular expression regexp; the regexp is searched for

               in the full path of each file considered for compilation

    -i file: add all the files and directories listed in file to the list considered for

             compilation; if "-", names are read from stdin

    1.4 代码实现

    单文件编译:

    import py_compile
    py_compile.compile('path') //path
    是包括.py文件名的路径

    批量编译:

          import compileall

    compileall.compile_dir('$dir')

     

    2反编译pyc

    如果只有pyc文件,我们是无法直接查看内容的,这时,就需要反编译工具将pyc文件反编译成py源程序。 这里介绍uncompyle6反编译工具。Pyc文件能够反编译的前提是文件没有被加密或者代码混淆。

    2.1 Uncompyle6安装

    > git clone https://github.com/rocky/python-uncompyle6.git

    > git checkout python-2.4

    > sudo python setup.py install

    如果没有报错,则安装成功了。

    2.2反编译

    执行命令:

    >uncompyle6 -o . *.pyc

    这时会在当前目录生成.py源文件。

    3 防止反编译pyc文件

    如何防止pyc文件被反编译呢? 这里介绍字节码混淆的方法,此方法能够抵挡低端的反编译手段,例如第2章的方法,但是,要到高手,还是抵挡不住。

    字节码混淆可以非常容易的欺骗通常的反汇编器和反编译器,同时不影响代码的正常执行。下面这个例子展示了如何欺骗Uncompyle6反编译器以及dis反汇编器:

    #一个简单的Python应用 sample1.py

    print 'Hello World'

    对其进行编译:

    python -m py_compile sample1.py

    对编译后的sample1.pyc使用Python内置dis模块反汇编:

          >>> import marshal,dis

    >>> fd = open('sample1.pyc', 'rb')

    >>> fd.seek(8)

    >>> sample1_code_obj = marshal.load(fd)

    >>> fd.close()

    >>> dis.dis(sample1_code_obj)

      1           0 LOAD_CONST               0 ('Hello World')

                  3 PRINT_ITEM

                  4 PRINT_NEWLINE

                  5 LOAD_CONST               1 (None)

                  8 RETURN_VALUE

    >>>

     

    以上的汇编代码笔者肉眼反汇编的结果如下:

    0 LOAD_CONST     0 ('Hello World') #加载co_consts[0]到栈顶,co_consts[0]存储着常量字符串'Hello World'

    3 PRINT_ITEM                       #打印栈顶到sys.stdout,即print 'Hello World'

    4 PRINT_NEWLINE                    #打印新行到sys.stdout,此指令因print语句而由编译器自动生成

    5 LOAD_CONST     1 (None)          #加载co_consts[1]到栈顶,co_consts[1]存储着None

    8 RETURN_VALUE                     #将栈顶返回给调用者,此两条指令为编译器自动生成

     

    现在我们修改sample1.pyc,在程序入口增加一条绝对跳转指令(可以使用UltraEdit 16进制插入功能修改pyc文件,”JUMP_ABSOLUTE 3”在Python 2.7中对应的字节码为 0x71 0x03 0x00。修改code string内容的同时应修改code string的长度,此处增加了一个3字节指令),使用内置dis模块反汇编的结果如下:

      1           0 JUMP_ABSOLUTE            3                 #自行添加

            >>    3 LOAD_CONST               0 ('Hello World')

                  6 PRINT_ITEM

                  7 PRINT_NEWLINE

                  8 LOAD_CONST               1 (None)

                 11 RETURN_VALUE

     

    如果读者对汇编代码有一定认识,就会明白此处的绝对跳转对Python虚拟机执行此程序基本没有影响(除了增加一个指令执行周期),然而这个绝对跳转将成功欺骗反编译器。使用Uncompyle6反编译的结果如下:

    <<< Error: Decompiling stopped due to <class 'uncompyle6.semantics.pysource.ParserError'>

    如果一个pyc文件无法被反编译,初级的破解者可能就会止步于此了,但对于有经验的工程师来说这还远远不够。同样的,我们还要让通常的反汇编器也无法工作才行。按下面的汇编代码继续加工上面的sample1.pyc。

    |   1           0 JUMP_ABSOLUTE        [71 06 00]     6

    |               3 LOAD_CONST           [64 FF FF] 65535 (FAKE!)

    |         >>    6 LOAD_CONST           [64 00 00]     0 (Hello World)

    |               9 PRINT_ITEM           [47 -- --]

    |              10 PRINT_NEWLINE        [48 -- --]

    |              11 LOAD_CONST           [64 01 00]     1 (None)

    |              14 RETURN_VALUE         [53 -- --]

     

    以上第二条指令的意思是加载code object常量表的第65535项到栈顶。在上述sample1.pyc中,常量表的长度为2,下标65535已超出常量表的范围,所以这是条非法指令。但由于第一条绝对跳转的存在,第二条指令永远都不会被执行。通常的反汇编器如dis会尽全力列举有用的信息,但并不能理解实际执行的控制流,当反汇编器尝试反汇编第二条指令时,会试着去读取code object常量表的第65535项并且抛出一个’tuple index out of range’的意外。Python内置dis模块的出错信息如下:

    >>> fd = open('sample1.pyc', 'rb')

    >>> fd.seek(8)

    >>> import marshal,dis

    >>> sample1_code_obj = marshal.load(fd)

    >>> dis.dis(sample1_code_obj)

      1           0 JUMP_ABSOLUTE            6

                  3 LOAD_CONST           65535

    Traceback (most recent call last):

      File "<stdin>", line 1, in <module>

      File "C:\Python27\lib\dis.py", line 43, in dis

        disassemble(x)

      File "C:\Python27\lib\dis.py", line 96, in disassemble

        print '(' + repr(co.co_consts[oparg]) + ')',

    IndexError: tuple index out of range

    >>>

     

    现在Uncompyle6和dis都被欺骗了,代码得到了有效的保护。

    4 Reference

    https://blog.csdn.net/ir0nf1st/article/details/61650984

    https://www.cnblogs.com/nickchen121/p/10802465.html

    https://www.cnblogs.com/dkblog/archive/2009/04/16/1980757.html

    展开全文
  • python的pyc反编译

    千次阅读 2019-07-11 15:24:32
    1,下载反编译工具:Easy Python Decompiler 下截地址:https://sourceforge.net/projects/easypythondecompiler/ 2,准备好字节码表,方便对照。使用python2.7和python3.6进行获取字节码: 获取方法: import ...

    首先先介绍一个在线反编译工具(基本上大多文件都可以实现):
    https://tool.lu/pyc/
    如果出现无法反编译的文件可以参照下面的方法进行反编译

    1,下载反编译工具:Easy Python Decompiler

    2,准备好字节码表,方便对照。使用python2.7和python3.6进行获取字节码:

    获取方法:

    import opcode  
    for op in range(len(opcode.opname)):  
      print('0x%.2X(%.3d): %s' % (op, op, opcode.opname[op]))  
    

    字节码表附在最后面;

    在使用Easy Python Decompiler反编译一个第三方pyc文件时,总是提示失败,并成生对应的文件test.pyc_dis_failed:

    打开test.pyc_dis_failed文件查看时,最后一行有提示报错的地方:
    在这里插入图片描述
    根据提示,找到 1436行:
    在这里插入图片描述
    用ueditor工具打开pyc文件,按照这编文章的介绍进行理解字节码:
    http://www.xumenger.com/01-python-pyc-20180521/

    重点操作:

    找到报错的 1436这一行对应的字节[71 46 03],然后将这三字节换成三个 BREAK_LOOP(对应为 50),即[50 50 50],然后继续pyc编译反编译,如果还是报错,根据报错的地方字节码,继续换成 BREAK_LOOP(一个字节换成一个BREAK_LOOP,直到没报错,反编译成功。

    附:字节码表:
    
    python2.7字节码:
    
    0x00(000): STOP_CODE
    0x01(001): POP_TOP
    0x02(002): ROT_TWO
    0x03(003): ROT_THREE
    0x04(004): DUP_TOP
    0x05(005): ROT_FOUR
    0x06(006): <6>
    0x07(007): <7>
    0x08(008): <8>
    0x09(009): NOP
    0x0A(010): UNARY_POSITIVE
    0x0B(011): UNARY_NEGATIVE
    0x0C(012): UNARY_NOT
    0x0D(013): UNARY_CONVERT
    0x0E(014): <14>
    0x0F(015): UNARY_INVERT
    0x10(016): <16>
    0x11(017): <17>
    0x12(018): <18>
    0x13(019): BINARY_POWER
    0x14(020): BINARY_MULTIPLY
    0x15(021): BINARY_DIVIDE
    0x16(022): BINARY_MODULO
    0x17(023): BINARY_ADD
    0x18(024): BINARY_SUBTRACT
    0x19(025): BINARY_SUBSCR
    0x1A(026): BINARY_FLOOR_DIVIDE
    0x1B(027): BINARY_TRUE_DIVIDE
    0x1C(028): INPLACE_FLOOR_DIVIDE
    0x1D(029): INPLACE_TRUE_DIVIDE
    0x1E(030): SLICE+0
    0x1F(031): SLICE+1
    0x20(032): SLICE+2
    0x21(033): SLICE+3
    0x22(034): <34>
    0x23(035): <35>
    0x24(036): <36>
    0x25(037): <37>
    0x26(038): <38>
    0x27(039): <39>
    0x28(040): STORE_SLICE+0
    0x29(041): STORE_SLICE+1
    0x2A(042): STORE_SLICE+2
    0x2B(043): STORE_SLICE+3
    0x2C(044): <44>
    0x2D(045): <45>
    0x2E(046): <46>
    0x2F(047): <47>
    0x30(048): <48>
    0x31(049): <49>
    0x32(050): DELETE_SLICE+0
    0x33(051): DELETE_SLICE+1
    0x34(052): DELETE_SLICE+2
    0x35(053): DELETE_SLICE+3
    0x36(054): STORE_MAP
    0x37(055): INPLACE_ADD
    0x38(056): INPLACE_SUBTRACT
    0x39(057): INPLACE_MULTIPLY
    0x3A(058): INPLACE_DIVIDE
    0x3B(059): INPLACE_MODULO
    0x3C(060): STORE_SUBSCR
    0x3D(061): DELETE_SUBSCR
    0x3E(062): BINARY_LSHIFT
    0x3F(063): BINARY_RSHIFT
    0x40(064): BINARY_AND
    0x41(065): BINARY_XOR
    0x42(066): BINARY_OR
    0x43(067): INPLACE_POWER
    0x44(068): GET_ITER
    0x45(069): <69>
    0x46(070): PRINT_EXPR
    0x47(071): PRINT_ITEM
    0x48(072): PRINT_NEWLINE
    0x49(073): PRINT_ITEM_TO
    0x4A(074): PRINT_NEWLINE_TO
    0x4B(075): INPLACE_LSHIFT
    0x4C(076): INPLACE_RSHIFT
    0x4D(077): INPLACE_AND
    0x4E(078): INPLACE_XOR
    0x4F(079): INPLACE_OR
    0x50(080): BREAK_LOOP
    0x51(081): WITH_CLEANUP
    0x52(082): LOAD_LOCALS
    0x53(083): RETURN_VALUE
    0x54(084): IMPORT_STAR
    0x55(085): EXEC_STMT
    0x56(086): YIELD_VALUE
    0x57(087): POP_BLOCK
    0x58(088): END_FINALLY
    0x59(089): BUILD_CLASS
    0x5A(090): STORE_NAME
    0x5B(091): DELETE_NAME
    0x5C(092): UNPACK_SEQUENCE
    0x5D(093): FOR_ITER
    0x5E(094): LIST_APPEND
    0x5F(095): STORE_ATTR
    0x60(096): DELETE_ATTR
    0x61(097): STORE_GLOBAL
    0x62(098): DELETE_GLOBAL
    0x63(099): DUP_TOPX
    0x64(100): LOAD_CONST
    0x65(101): LOAD_NAME
    0x66(102): BUILD_TUPLE
    0x67(103): BUILD_LIST
    0x68(104): BUILD_SET
    0x69(105): BUILD_MAP
    0x6A(106): LOAD_ATTR
    0x6B(107): COMPARE_OP
    0x6C(108): IMPORT_NAME
    0x6D(109): IMPORT_FROM
    0x6E(110): JUMP_FORWARD
    0x6F(111): JUMP_IF_FALSE_OR_POP
    0x70(112): JUMP_IF_TRUE_OR_POP
    0x71(113): JUMP_ABSOLUTE
    0x72(114): POP_JUMP_IF_FALSE
    0x73(115): POP_JUMP_IF_TRUE
    0x74(116): LOAD_GLOBAL
    0x75(117): <117>
    0x76(118): <118>
    0x77(119): CONTINUE_LOOP
    0x78(120): SETUP_LOOP
    0x79(121): SETUP_EXCEPT
    0x7A(122): SETUP_FINALLY
    0x7B(123): <123>
    0x7C(124): LOAD_FAST
    0x7D(125): STORE_FAST
    0x7E(126): DELETE_FAST
    0x7F(127): <127>
    0x80(128): <128>
    0x81(129): <129>
    0x82(130): RAISE_VARARGS
    0x83(131): CALL_FUNCTION
    0x84(132): MAKE_FUNCTION
    0x85(133): BUILD_SLICE
    0x86(134): MAKE_CLOSURE
    0x87(135): LOAD_CLOSURE
    0x88(136): LOAD_DEREF
    0x89(137): STORE_DEREF
    0x8A(138): <138>
    0x8B(139): <139>
    0x8C(140): CALL_FUNCTION_VAR
    0x8D(141): CALL_FUNCTION_KW
    0x8E(142): CALL_FUNCTION_VAR_KW
    0x8F(143): SETUP_WITH
    0x90(144): <144>
    0x91(145): EXTENDED_ARG
    0x92(146): SET_ADD
    0x93(147): MAP_ADD
    0x94(148): <148>
    0x95(149): <149>
    0x96(150): <150>
    0x97(151): <151>
    0x98(152): <152>
    0x99(153): <153>
    0x9A(154): <154>
    0x9B(155): <155>
    0x9C(156): <156>
    0x9D(157): <157>
    0x9E(158): <158>
    0x9F(159): <159>
    0xA0(160): <160>
    0xA1(161): <161>
    0xA2(162): <162>            
    0xA3(163): <163>
    0xA4(164): <164>
    0xA5(165): <165>
    0xA6(166): <166>
    0xA7(167): <167>
    0xA8(168): <168>
    0xA9(169): <169>
    0xAA(170): <170>
    0xAB(171): <171>
    0xAC(172): <172>
    0xAD(173): <173>
    0xAE(174): <174>
    0xAF(175): <175>
    0xB0(176): <176>
    0xB1(177): <177>
    0xB2(178): <178>
    0xB3(179): <179>
    0xB4(180): <180>
    0xB5(181): <181>
    0xB6(182): <182>
    0xB7(183): <183>
    0xB8(184): <184>
    0xB9(185): <185>
    0xBA(186): <186>
    0xBB(187): <187>
    0xBC(188): <188>
    0xBD(189): <189>
    0xBE(190): <190>
    0xBF(191): <191>
    0xC0(192): <192>
    0xC1(193): <193>
    0xC2(194): <194>
    0xC3(195): <195>
    0xC4(196): <196>
    0xC5(197): <197>
    0xC6(198): <198>
    0xC7(199): <199>
    0xC8(200): <200>
    0xC9(201): <201>
    0xCA(202): <202>
    0xCB(203): <203>
    0xCC(204): <204>
    0xCD(205): <205>
    0xCE(206): <206>
    0xCF(207): <207>
    0xD0(208): <208>
    0xD1(209): <209>
    0xD2(210): <210>
    0xD3(211): <211>
    0xD4(212): <212>
    0xD5(213): <213>
    0xD6(214): <214>
    0xD7(215): <215>
    0xD8(216): <216>
    0xD9(217): <217>
    0xDA(218): <218>
    0xDB(219): <219>
    0xDC(220): <220>
    0xDD(221): <221>
    0xDE(222): <222>
    0xDF(223): <223>
    0xE0(224): <224>
    0xE1(225): <225>
    0xE2(226): <226>
    0xE3(227): <227>
    0xE4(228): <228>
    0xE5(229): <229>
    0xE6(230): <230>
    0xE7(231): <231>
    0xE8(232): <232>
    0xE9(233): <233>
    0xEA(234): <234>
    0xEB(235): <235>
    0xEC(236): <236>
    0xED(237): <237>
    0xEE(238): <238>
    0xEF(239): <239>
    0xF0(240): <240>
    0xF1(241): <241>
    0xF2(242): <242>
    0xF3(243): <243>
    0xF4(244): <244>
    0xF5(245): <245>
    0xF6(246): <246>
    0xF7(247): <247>
    0xF8(248): <248>
    0xF9(249): <249>
    0xFA(250): <250>
    0xFB(251): <251>
    0xFC(252): <252>
    0xFD(253): <253>
    0xFE(254): <254>
    0xFF(255): <255>
    
    
    python3.6字节码:
    0x00(000): <0>
    0x01(001): POP_TOP
    0x02(002): ROT_TWO
    0x03(003): ROT_THREE
    0x04(004): DUP_TOP
    0x05(005): DUP_TOP_TWO
    0x06(006): <6>
    0x07(007): <7>
    0x08(008): <8>
    0x09(009): NOP
    0x0A(010): UNARY_POSITIVE
    0x0B(011): UNARY_NEGATIVE
    0x0C(012): UNARY_NOT
    0x0D(013): <13>
    0x0E(014): <14>
    0x0F(015): UNARY_INVERT
    0x10(016): BINARY_MATRIX_MULTIPLY
    0x11(017): INPLACE_MATRIX_MULTIPLY
    0x12(018): <18>
    0x13(019): BINARY_POWER
    0x14(020): BINARY_MULTIPLY
    0x15(021): <21>
    0x16(022): BINARY_MODULO
    0x17(023): BINARY_ADD
    0x18(024): BINARY_SUBTRACT
    0x19(025): BINARY_SUBSCR
    0x1A(026): BINARY_FLOOR_DIVIDE
    0x1B(027): BINARY_TRUE_DIVIDE
    0x1C(028): INPLACE_FLOOR_DIVIDE
    0x1D(029): INPLACE_TRUE_DIVIDE
    0x1E(030): <30>
    0x1F(031): <31>
    0x20(032): <32>
    0x21(033): <33>
    0x22(034): <34>
    0x23(035): <35>
    0x24(036): <36>
    0x25(037): <37>
    0x26(038): <38>
    0x27(039): <39>
    0x28(040): <40>
    0x29(041): <41>
    0x2A(042): <42>
    0x2B(043): <43>
    0x2C(044): <44>
    0x2D(045): <45>
    0x2E(046): <46>
    0x2F(047): <47>
    0x30(048): <48>
    0x31(049): <49>
    0x32(050): GET_AITER
    0x33(051): GET_ANEXT
    0x34(052): BEFORE_ASYNC_WITH
    0x35(053): <53>
    0x36(054): <54>
    0x37(055): INPLACE_ADD
    0x38(056): INPLACE_SUBTRACT
    0x39(057): INPLACE_MULTIPLY
    0x3A(058): <58>
    0x3B(059): INPLACE_MODULO
    0x3C(060): STORE_SUBSCR
    0x3D(061): DELETE_SUBSCR
    0x3E(062): BINARY_LSHIFT
    0x3F(063): BINARY_RSHIFT
    0x40(064): BINARY_AND
    0x41(065): BINARY_XOR
    0x42(066): BINARY_OR
    0x43(067): INPLACE_POWER
    0x44(068): GET_ITER
    0x45(069): GET_YIELD_FROM_ITER
    0x46(070): PRINT_EXPR
    0x47(071): LOAD_BUILD_CLASS
    0x48(072): YIELD_FROM
    0x49(073): GET_AWAITABLE
    0x4A(074): <74>
    0x4B(075): INPLACE_LSHIFT
    0x4C(076): INPLACE_RSHIFT
    0x4D(077): INPLACE_AND
    0x4E(078): INPLACE_XOR
    0x4F(079): INPLACE_OR
    0x50(080): BREAK_LOOP
    0x51(081): WITH_CLEANUP_START
    0x52(082): WITH_CLEANUP_FINISH
    0x53(083): RETURN_VALUE
    0x54(084): IMPORT_STAR
    0x55(085): SETUP_ANNOTATIONS
    0x56(086): YIELD_VALUE
    0x57(087): POP_BLOCK
    0x58(088): END_FINALLY
    0x59(089): POP_EXCEPT
    0x5A(090): STORE_NAME
    0x5B(091): DELETE_NAME
    0x5C(092): UNPACK_SEQUENCE
    0x5D(093): FOR_ITER
    0x5E(094): UNPACK_EX
    0x5F(095): STORE_ATTR
    0x60(096): DELETE_ATTR
    0x61(097): STORE_GLOBAL
    0x62(098): DELETE_GLOBAL
    0x63(099): <99>
    0x64(100): LOAD_CONST
    0x65(101): LOAD_NAME
    0x66(102): BUILD_TUPLE
    0x67(103): BUILD_LIST
    0x68(104): BUILD_SET
    0x69(105): BUILD_MAP
    0x6A(106): LOAD_ATTR
    0x6B(107): COMPARE_OP
    0x6C(108): IMPORT_NAME
    0x6D(109): IMPORT_FROM
    0x6E(110): JUMP_FORWARD
    0x6F(111): JUMP_IF_FALSE_OR_POP
    0x70(112): JUMP_IF_TRUE_OR_POP
    0x71(113): JUMP_ABSOLUTE
    0x72(114): POP_JUMP_IF_FALSE
    0x73(115): POP_JUMP_IF_TRUE
    0x74(116): LOAD_GLOBAL
    0x75(117): <117>
    0x76(118): <118>
    0x77(119): CONTINUE_LOOP
    0x78(120): SETUP_LOOP
    0x79(121): SETUP_EXCEPT
    0x7A(122): SETUP_FINALLY
    0x7B(123): <123>
    0x7C(124): LOAD_FAST
    0x7D(125): STORE_FAST
    0x7E(126): DELETE_FAST
    0x7F(127): STORE_ANNOTATION
    0x80(128): <128>
    0x81(129): <129>
    0x82(130): RAISE_VARARGS
    0x83(131): CALL_FUNCTION
    0x84(132): MAKE_FUNCTION
    0x85(133): BUILD_SLICE
    0x86(134): <134>
    0x87(135): LOAD_CLOSURE
    0x88(136): LOAD_DEREF
    0x89(137): STORE_DEREF
    0x8A(138): DELETE_DEREF
    0x8B(139): <139>
    0x8C(140): <140>
    0x8D(141): CALL_FUNCTION_KW
    0x8E(142): CALL_FUNCTION_EX
    0x8F(143): SETUP_WITH
    0x90(144): EXTENDED_ARG
    0x91(145): LIST_APPEND
    0x92(146): SET_ADD
    0x93(147): MAP_ADD
    0x94(148): LOAD_CLASSDEREF
    0x95(149): BUILD_LIST_UNPACK
    0x96(150): BUILD_MAP_UNPACK
    0x97(151): BUILD_MAP_UNPACK_WITH_CALL
    0x98(152): BUILD_TUPLE_UNPACK
    0x99(153): BUILD_SET_UNPACK
    0x9A(154): SETUP_ASYNC_WITH
    0x9B(155): FORMAT_VALUE
    0x9C(156): BUILD_CONST_KEY_MAP
    0x9D(157): BUILD_STRING
    0x9E(158): BUILD_TUPLE_UNPACK_WITH_CALL
    0x9F(159): <159>
    0xA0(160): <160>
    0xA1(161): <161>
    0xA2(162): <162>
    0xA3(163): <163>
    0xA4(164): <164>
    0xA5(165): <165>
    0xA6(166): <166>
    0xA7(167): <167>
    0xA8(168): <168>
    0xA9(169): <169>
    0xAA(170): <170>
    0xAB(171): <171>
    0xAC(172): <172>
    0xAD(173): <173>
    0xAE(174): <174>
    0xAF(175): <175>
    0xB0(176): <176>
    0xB1(177): <177>
    0xB2(178): <178>
    0xB3(179): <179>
    0xB4(180): <180>
    0xB5(181): <181>
    0xB6(182): <182>
    0xB7(183): <183>
    0xB8(184): <184>
    0xB9(185): <185>
    0xBA(186): <186>
    0xBB(187): <187>
    0xBC(188): <188>
    0xBD(189): <189>
    0xBE(190): <190>
    0xBF(191): <191>
    0xC0(192): <192>
    0xC1(193): <193>
    0xC2(194): <194>
    0xC3(195): <195>
    0xC4(196): <196>
    0xC5(197): <197>
    0xC6(198): <198>
    0xC7(199): <199>
    0xC8(200): <200>
    0xC9(201): <201>
    0xCA(202): <202>
    0xCB(203): <203>
    0xCC(204): <204>
    0xCD(205): <205>
    0xCE(206): <206>
    0xCF(207): <207>
    0xD0(208): <208>
    0xD1(209): <209>
    0xD2(210): <210>
    0xD3(211): <211>
    0xD4(212): <212>
    0xD5(213): <213>
    0xD6(214): <214>
    0xD7(215): <215>
    0xD8(216): <216>
    0xD9(217): <217>
    0xDA(218): <218>
    0xDB(219): <219>
    0xDC(220): <220>
    0xDD(221): <221>
    0xDE(222): <222>
    0xDF(223): <223>
    0xE0(224): <224>
    0xE1(225): <225>
    0xE2(226): <226>
    0xE3(227): <227>
    0xE4(228): <228>
    0xE5(229): <229>
    0xE6(230): <230>
    0xE7(231): <231>
    0xE8(232): <232>
    0xE9(233): <233>
    0xEA(234): <234>
    0xEB(235): <235>
    0xEC(236): <236>
    0xED(237): <237>
    0xEE(238): <238>
    0xEF(239): <239>
    0xF0(240): <240>
    0xF1(241): <241>
    0xF2(242): <242>
    0xF3(243): <243>
    0xF4(244): <244>
    0xF5(245): <245>
    0xF6(246): <246>
    0xF7(247): <247>
    0xF8(248): <248>
    0xF9(249): <249>
    0xFA(250): <250>
    0xFB(251): <251>
    0xFC(252): <252>
    0xFD(253): <253>
    0xFE(254): <254>
    0xFF(255): <255>
    -------------
    
    转自:https://blog.csdn.net/seagulhui1/article/details/90710266
    
    展开全文
  • Python pyc反编译成py

    2020-08-31 11:03:13
    # 安装 pip install uncompyle # 将test.pyc反编译成test.py 文件 uncompyle6 test.pyc > test.py # 当前目录pyc文件进行反编译 uncompyle6 -o . *.pyc

    uncompyle6可将python字节码转换回等效的python源代码
    uncompyle6源码链接

    ① 安装uncompyle6

    pip install uncompyle
    

    ② 将test.pyc反编译成test.py 文件

    uncompyle6 test.pyc > test.py 
    

    ③ 当前目录pyc文件进行反编译

    uncompyle6 -o . *.pyc 
    
    展开全文
  • 1,下载反编译工具:Easy Python Decompiler 下截地址:https://sourceforge.net/projects/easypythondecompiler/ 2,准备好字节码表,方便对照。使用python2.7和python3.6进行获取字节码: 获取方法: import ...

    工作前准备:

    1,下载反编译工具:Easy Python Decompiler

          下截地址:https://sourceforge.net/projects/easypythondecompiler/

    2,准备好字节码表,方便对照。使用python2.7和python3.6进行获取字节码:

    获取方法:

    import opcode  
    for op in range(len(opcode.opname)):  
      print('0x%.2X(%.3d): %s' % (op, op, opcode.opname[op]))  

     

    字节码表附在最后面;
     

    在使用Easy Python Decompiler反编译一个第三方pyc文件时,总是提示失败,并成生对应的文件test.pyc_dis_failed:

     

    打开test.pyc_dis_failed文件查看时,最后一行有提示报错的地方:

    根据提示,找到 1436行:

     

    用ueditor工具打开pyc文件,按照这编文章的介绍进行理解字节码:

    http://www.xumenger.com/01-python-pyc-20180521/

    重点操作:

    找到报错的 1436这一行对应的字节[71 46 03],然后将这三字节换成三个 BREAK_LOOP(对应为 50),即[50 50 50],然后继续pyc编译反编译,如果还是报错,根据报错的地方字节码,继续换成 BREAK_LOOP(一个字节换成一个BREAK_LOOP,直到没报错,反编译成功。

     

    附:字节码表:

    python2.7字节码:

    0x00(000): STOP_CODE
    0x01(001): POP_TOP
    0x02(002): ROT_TWO
    0x03(003): ROT_THREE
    0x04(004): DUP_TOP
    0x05(005): ROT_FOUR
    0x06(006): <6>
    0x07(007): <7>
    0x08(008): <8>
    0x09(009): NOP
    0x0A(010): UNARY_POSITIVE
    0x0B(011): UNARY_NEGATIVE
    0x0C(012): UNARY_NOT
    0x0D(013): UNARY_CONVERT
    0x0E(014): <14>
    0x0F(015): UNARY_INVERT
    0x10(016): <16>
    0x11(017): <17>
    0x12(018): <18>
    0x13(019): BINARY_POWER
    0x14(020): BINARY_MULTIPLY
    0x15(021): BINARY_DIVIDE
    0x16(022): BINARY_MODULO
    0x17(023): BINARY_ADD
    0x18(024): BINARY_SUBTRACT
    0x19(025): BINARY_SUBSCR
    0x1A(026): BINARY_FLOOR_DIVIDE
    0x1B(027): BINARY_TRUE_DIVIDE
    0x1C(028): INPLACE_FLOOR_DIVIDE
    0x1D(029): INPLACE_TRUE_DIVIDE
    0x1E(030): SLICE+0
    0x1F(031): SLICE+1
    0x20(032): SLICE+2
    0x21(033): SLICE+3
    0x22(034): <34>
    0x23(035): <35>
    0x24(036): <36>
    0x25(037): <37>
    0x26(038): <38>
    0x27(039): <39>
    0x28(040): STORE_SLICE+0
    0x29(041): STORE_SLICE+1
    0x2A(042): STORE_SLICE+2
    0x2B(043): STORE_SLICE+3
    0x2C(044): <44>
    0x2D(045): <45>
    0x2E(046): <46>
    0x2F(047): <47>
    0x30(048): <48>
    0x31(049): <49>
    0x32(050): DELETE_SLICE+0
    0x33(051): DELETE_SLICE+1
    0x34(052): DELETE_SLICE+2
    0x35(053): DELETE_SLICE+3
    0x36(054): STORE_MAP
    0x37(055): INPLACE_ADD
    0x38(056): INPLACE_SUBTRACT
    0x39(057): INPLACE_MULTIPLY
    0x3A(058): INPLACE_DIVIDE
    0x3B(059): INPLACE_MODULO
    0x3C(060): STORE_SUBSCR
    0x3D(061): DELETE_SUBSCR
    0x3E(062): BINARY_LSHIFT
    0x3F(063): BINARY_RSHIFT
    0x40(064): BINARY_AND
    0x41(065): BINARY_XOR
    0x42(066): BINARY_OR
    0x43(067): INPLACE_POWER
    0x44(068): GET_ITER
    0x45(069): <69>
    0x46(070): PRINT_EXPR
    0x47(071): PRINT_ITEM
    0x48(072): PRINT_NEWLINE
    0x49(073): PRINT_ITEM_TO
    0x4A(074): PRINT_NEWLINE_TO
    0x4B(075): INPLACE_LSHIFT
    0x4C(076): INPLACE_RSHIFT
    0x4D(077): INPLACE_AND
    0x4E(078): INPLACE_XOR
    0x4F(079): INPLACE_OR
    0x50(080): BREAK_LOOP
    0x51(081): WITH_CLEANUP
    0x52(082): LOAD_LOCALS
    0x53(083): RETURN_VALUE
    0x54(084): IMPORT_STAR
    0x55(085): EXEC_STMT
    0x56(086): YIELD_VALUE
    0x57(087): POP_BLOCK
    0x58(088): END_FINALLY
    0x59(089): BUILD_CLASS
    0x5A(090): STORE_NAME
    0x5B(091): DELETE_NAME
    0x5C(092): UNPACK_SEQUENCE
    0x5D(093): FOR_ITER
    0x5E(094): LIST_APPEND
    0x5F(095): STORE_ATTR
    0x60(096): DELETE_ATTR
    0x61(097): STORE_GLOBAL
    0x62(098): DELETE_GLOBAL
    0x63(099): DUP_TOPX
    0x64(100): LOAD_CONST
    0x65(101): LOAD_NAME
    0x66(102): BUILD_TUPLE
    0x67(103): BUILD_LIST
    0x68(104): BUILD_SET
    0x69(105): BUILD_MAP
    0x6A(106): LOAD_ATTR
    0x6B(107): COMPARE_OP
    0x6C(108): IMPORT_NAME
    0x6D(109): IMPORT_FROM
    0x6E(110): JUMP_FORWARD
    0x6F(111): JUMP_IF_FALSE_OR_POP
    0x70(112): JUMP_IF_TRUE_OR_POP
    0x71(113): JUMP_ABSOLUTE
    0x72(114): POP_JUMP_IF_FALSE
    0x73(115): POP_JUMP_IF_TRUE
    0x74(116): LOAD_GLOBAL
    0x75(117): <117>
    0x76(118): <118>
    0x77(119): CONTINUE_LOOP
    0x78(120): SETUP_LOOP
    0x79(121): SETUP_EXCEPT
    0x7A(122): SETUP_FINALLY
    0x7B(123): <123>
    0x7C(124): LOAD_FAST
    0x7D(125): STORE_FAST
    0x7E(126): DELETE_FAST
    0x7F(127): <127>
    0x80(128): <128>
    0x81(129): <129>
    0x82(130): RAISE_VARARGS
    0x83(131): CALL_FUNCTION
    0x84(132): MAKE_FUNCTION
    0x85(133): BUILD_SLICE
    0x86(134): MAKE_CLOSURE
    0x87(135): LOAD_CLOSURE
    0x88(136): LOAD_DEREF
    0x89(137): STORE_DEREF
    0x8A(138): <138>
    0x8B(139): <139>
    0x8C(140): CALL_FUNCTION_VAR
    0x8D(141): CALL_FUNCTION_KW
    0x8E(142): CALL_FUNCTION_VAR_KW
    0x8F(143): SETUP_WITH
    0x90(144): <144>
    0x91(145): EXTENDED_ARG
    0x92(146): SET_ADD
    0x93(147): MAP_ADD
    0x94(148): <148>
    0x95(149): <149>
    0x96(150): <150>
    0x97(151): <151>
    0x98(152): <152>
    0x99(153): <153>
    0x9A(154): <154>
    0x9B(155): <155>
    0x9C(156): <156>
    0x9D(157): <157>
    0x9E(158): <158>
    0x9F(159): <159>
    0xA0(160): <160>
    0xA1(161): <161>
    0xA2(162): <162>            
    0xA3(163): <163>
    0xA4(164): <164>
    0xA5(165): <165>
    0xA6(166): <166>
    0xA7(167): <167>
    0xA8(168): <168>
    0xA9(169): <169>
    0xAA(170): <170>
    0xAB(171): <171>
    0xAC(172): <172>
    0xAD(173): <173>
    0xAE(174): <174>
    0xAF(175): <175>
    0xB0(176): <176>
    0xB1(177): <177>
    0xB2(178): <178>
    0xB3(179): <179>
    0xB4(180): <180>
    0xB5(181): <181>
    0xB6(182): <182>
    0xB7(183): <183>
    0xB8(184): <184>
    0xB9(185): <185>
    0xBA(186): <186>
    0xBB(187): <187>
    0xBC(188): <188>
    0xBD(189): <189>
    0xBE(190): <190>
    0xBF(191): <191>
    0xC0(192): <192>
    0xC1(193): <193>
    0xC2(194): <194>
    0xC3(195): <195>
    0xC4(196): <196>
    0xC5(197): <197>
    0xC6(198): <198>
    0xC7(199): <199>
    0xC8(200): <200>
    0xC9(201): <201>
    0xCA(202): <202>
    0xCB(203): <203>
    0xCC(204): <204>
    0xCD(205): <205>
    0xCE(206): <206>
    0xCF(207): <207>
    0xD0(208): <208>
    0xD1(209): <209>
    0xD2(210): <210>
    0xD3(211): <211>
    0xD4(212): <212>
    0xD5(213): <213>
    0xD6(214): <214>
    0xD7(215): <215>
    0xD8(216): <216>
    0xD9(217): <217>
    0xDA(218): <218>
    0xDB(219): <219>
    0xDC(220): <220>
    0xDD(221): <221>
    0xDE(222): <222>
    0xDF(223): <223>
    0xE0(224): <224>
    0xE1(225): <225>
    0xE2(226): <226>
    0xE3(227): <227>
    0xE4(228): <228>
    0xE5(229): <229>
    0xE6(230): <230>
    0xE7(231): <231>
    0xE8(232): <232>
    0xE9(233): <233>
    0xEA(234): <234>
    0xEB(235): <235>
    0xEC(236): <236>
    0xED(237): <237>
    0xEE(238): <238>
    0xEF(239): <239>
    0xF0(240): <240>
    0xF1(241): <241>
    0xF2(242): <242>
    0xF3(243): <243>
    0xF4(244): <244>
    0xF5(245): <245>
    0xF6(246): <246>
    0xF7(247): <247>
    0xF8(248): <248>
    0xF9(249): <249>
    0xFA(250): <250>
    0xFB(251): <251>
    0xFC(252): <252>
    0xFD(253): <253>
    0xFE(254): <254>
    0xFF(255): <255>


    python3.6字节码:
    0x00(000): <0>
    0x01(001): POP_TOP
    0x02(002): ROT_TWO
    0x03(003): ROT_THREE
    0x04(004): DUP_TOP
    0x05(005): DUP_TOP_TWO
    0x06(006): <6>
    0x07(007): <7>
    0x08(008): <8>
    0x09(009): NOP
    0x0A(010): UNARY_POSITIVE
    0x0B(011): UNARY_NEGATIVE
    0x0C(012): UNARY_NOT
    0x0D(013): <13>
    0x0E(014): <14>
    0x0F(015): UNARY_INVERT
    0x10(016): BINARY_MATRIX_MULTIPLY
    0x11(017): INPLACE_MATRIX_MULTIPLY
    0x12(018): <18>
    0x13(019): BINARY_POWER
    0x14(020): BINARY_MULTIPLY
    0x15(021): <21>
    0x16(022): BINARY_MODULO
    0x17(023): BINARY_ADD
    0x18(024): BINARY_SUBTRACT
    0x19(025): BINARY_SUBSCR
    0x1A(026): BINARY_FLOOR_DIVIDE
    0x1B(027): BINARY_TRUE_DIVIDE
    0x1C(028): INPLACE_FLOOR_DIVIDE
    0x1D(029): INPLACE_TRUE_DIVIDE
    0x1E(030): <30>
    0x1F(031): <31>
    0x20(032): <32>
    0x21(033): <33>
    0x22(034): <34>
    0x23(035): <35>
    0x24(036): <36>
    0x25(037): <37>
    0x26(038): <38>
    0x27(039): <39>
    0x28(040): <40>
    0x29(041): <41>
    0x2A(042): <42>
    0x2B(043): <43>
    0x2C(044): <44>
    0x2D(045): <45>
    0x2E(046): <46>
    0x2F(047): <47>
    0x30(048): <48>
    0x31(049): <49>
    0x32(050): GET_AITER
    0x33(051): GET_ANEXT
    0x34(052): BEFORE_ASYNC_WITH
    0x35(053): <53>
    0x36(054): <54>
    0x37(055): INPLACE_ADD
    0x38(056): INPLACE_SUBTRACT
    0x39(057): INPLACE_MULTIPLY
    0x3A(058): <58>
    0x3B(059): INPLACE_MODULO
    0x3C(060): STORE_SUBSCR
    0x3D(061): DELETE_SUBSCR
    0x3E(062): BINARY_LSHIFT
    0x3F(063): BINARY_RSHIFT
    0x40(064): BINARY_AND
    0x41(065): BINARY_XOR
    0x42(066): BINARY_OR
    0x43(067): INPLACE_POWER
    0x44(068): GET_ITER
    0x45(069): GET_YIELD_FROM_ITER
    0x46(070): PRINT_EXPR
    0x47(071): LOAD_BUILD_CLASS
    0x48(072): YIELD_FROM
    0x49(073): GET_AWAITABLE
    0x4A(074): <74>
    0x4B(075): INPLACE_LSHIFT
    0x4C(076): INPLACE_RSHIFT
    0x4D(077): INPLACE_AND
    0x4E(078): INPLACE_XOR
    0x4F(079): INPLACE_OR
    0x50(080): BREAK_LOOP
    0x51(081): WITH_CLEANUP_START
    0x52(082): WITH_CLEANUP_FINISH
    0x53(083): RETURN_VALUE
    0x54(084): IMPORT_STAR
    0x55(085): SETUP_ANNOTATIONS
    0x56(086): YIELD_VALUE
    0x57(087): POP_BLOCK
    0x58(088): END_FINALLY
    0x59(089): POP_EXCEPT
    0x5A(090): STORE_NAME
    0x5B(091): DELETE_NAME
    0x5C(092): UNPACK_SEQUENCE
    0x5D(093): FOR_ITER
    0x5E(094): UNPACK_EX
    0x5F(095): STORE_ATTR
    0x60(096): DELETE_ATTR
    0x61(097): STORE_GLOBAL
    0x62(098): DELETE_GLOBAL
    0x63(099): <99>
    0x64(100): LOAD_CONST
    0x65(101): LOAD_NAME
    0x66(102): BUILD_TUPLE
    0x67(103): BUILD_LIST
    0x68(104): BUILD_SET
    0x69(105): BUILD_MAP
    0x6A(106): LOAD_ATTR
    0x6B(107): COMPARE_OP
    0x6C(108): IMPORT_NAME
    0x6D(109): IMPORT_FROM
    0x6E(110): JUMP_FORWARD
    0x6F(111): JUMP_IF_FALSE_OR_POP
    0x70(112): JUMP_IF_TRUE_OR_POP
    0x71(113): JUMP_ABSOLUTE
    0x72(114): POP_JUMP_IF_FALSE
    0x73(115): POP_JUMP_IF_TRUE
    0x74(116): LOAD_GLOBAL
    0x75(117): <117>
    0x76(118): <118>
    0x77(119): CONTINUE_LOOP
    0x78(120): SETUP_LOOP
    0x79(121): SETUP_EXCEPT
    0x7A(122): SETUP_FINALLY
    0x7B(123): <123>
    0x7C(124): LOAD_FAST
    0x7D(125): STORE_FAST
    0x7E(126): DELETE_FAST
    0x7F(127): STORE_ANNOTATION
    0x80(128): <128>
    0x81(129): <129>
    0x82(130): RAISE_VARARGS
    0x83(131): CALL_FUNCTION
    0x84(132): MAKE_FUNCTION
    0x85(133): BUILD_SLICE
    0x86(134): <134>
    0x87(135): LOAD_CLOSURE
    0x88(136): LOAD_DEREF
    0x89(137): STORE_DEREF
    0x8A(138): DELETE_DEREF
    0x8B(139): <139>
    0x8C(140): <140>
    0x8D(141): CALL_FUNCTION_KW
    0x8E(142): CALL_FUNCTION_EX
    0x8F(143): SETUP_WITH
    0x90(144): EXTENDED_ARG
    0x91(145): LIST_APPEND
    0x92(146): SET_ADD
    0x93(147): MAP_ADD
    0x94(148): LOAD_CLASSDEREF
    0x95(149): BUILD_LIST_UNPACK
    0x96(150): BUILD_MAP_UNPACK
    0x97(151): BUILD_MAP_UNPACK_WITH_CALL
    0x98(152): BUILD_TUPLE_UNPACK
    0x99(153): BUILD_SET_UNPACK
    0x9A(154): SETUP_ASYNC_WITH
    0x9B(155): FORMAT_VALUE
    0x9C(156): BUILD_CONST_KEY_MAP
    0x9D(157): BUILD_STRING
    0x9E(158): BUILD_TUPLE_UNPACK_WITH_CALL
    0x9F(159): <159>
    0xA0(160): <160>
    0xA1(161): <161>
    0xA2(162): <162>
    0xA3(163): <163>
    0xA4(164): <164>
    0xA5(165): <165>
    0xA6(166): <166>
    0xA7(167): <167>
    0xA8(168): <168>
    0xA9(169): <169>
    0xAA(170): <170>
    0xAB(171): <171>
    0xAC(172): <172>
    0xAD(173): <173>
    0xAE(174): <174>
    0xAF(175): <175>
    0xB0(176): <176>
    0xB1(177): <177>
    0xB2(178): <178>
    0xB3(179): <179>
    0xB4(180): <180>
    0xB5(181): <181>
    0xB6(182): <182>
    0xB7(183): <183>
    0xB8(184): <184>
    0xB9(185): <185>
    0xBA(186): <186>
    0xBB(187): <187>
    0xBC(188): <188>
    0xBD(189): <189>
    0xBE(190): <190>
    0xBF(191): <191>
    0xC0(192): <192>
    0xC1(193): <193>
    0xC2(194): <194>
    0xC3(195): <195>
    0xC4(196): <196>
    0xC5(197): <197>
    0xC6(198): <198>
    0xC7(199): <199>
    0xC8(200): <200>
    0xC9(201): <201>
    0xCA(202): <202>
    0xCB(203): <203>
    0xCC(204): <204>
    0xCD(205): <205>
    0xCE(206): <206>
    0xCF(207): <207>
    0xD0(208): <208>
    0xD1(209): <209>
    0xD2(210): <210>
    0xD3(211): <211>
    0xD4(212): <212>
    0xD5(213): <213>
    0xD6(214): <214>
    0xD7(215): <215>
    0xD8(216): <216>
    0xD9(217): <217>
    0xDA(218): <218>
    0xDB(219): <219>
    0xDC(220): <220>
    0xDD(221): <221>
    0xDE(222): <222>
    0xDF(223): <223>
    0xE0(224): <224>
    0xE1(225): <225>
    0xE2(226): <226>
    0xE3(227): <227>
    0xE4(228): <228>
    0xE5(229): <229>
    0xE6(230): <230>
    0xE7(231): <231>
    0xE8(232): <232>
    0xE9(233): <233>
    0xEA(234): <234>
    0xEB(235): <235>
    0xEC(236): <236>
    0xED(237): <237>
    0xEE(238): <238>
    0xEF(239): <239>
    0xF0(240): <240>
    0xF1(241): <241>
    0xF2(242): <242>
    0xF3(243): <243>
    0xF4(244): <244>
    0xF5(245): <245>
    0xF6(246): <246>
    0xF7(247): <247>
    0xF8(248): <248>
    0xF9(249): <249>
    0xFA(250): <250>
    0xFB(251): <251>
    0xFC(252): <252>
    0xFD(253): <253>
    0xFE(254): <254>
    0xFF(255): <255>

     

    展开全文
  • 批量反编译pyc工具

    2017-06-29 11:26:35
    很好用的批量反编译pyc工具,美中不足是转义后的文件后缀是pyc_dis,需要自己修改一下
  • pyc文件,先反编译成py文件: 方法见简单逆向27 # uncompyle6 version 3.7.4 # Python bytecode 2.7 (62211) # Decompiled from: Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit ...
  • .pyc反编译在线工具

    万次阅读 2017-07-01 13:45:01
    http://tool.lu/pyc 效果还是不错的。 只是把一些汉字变成了十六进制
  • pyc反编译

    千次阅读 2017-04-01 12:34:42
    Ubuntu系统可以采用uncompyle2反编译,下载链接:https://github.com/wibiti/uncompyle2推荐一个在线反编译网站:http://tool.lu/pyc/
  • pyc文件反编译

    千次阅读 2020-10-09 21:03:40
    找一个pyc文件(不是源代码文件),然后搜索相关反编译工具把pyc反编译成Python源代码,最好能多找几种工具或者途径达到反编译的目的。 我找的是另一位同学的pyc文件 1、在线反编译 2、Easy Python Decompiler反...
  • python2.6 pyc反编译

    万次阅读 2014-01-25 00:24:24
    同学请我帮他反编译下几个pyc文件,生成pyc文件的python版本是2.6.6 尝试了以下几个工具: 【1】uncompyle2 github:https://github.com/wibiti/uncompyle2 之前用过,但是有个限制是必须是python2.7以上生成的...
  • python反编译成.py获得源码所需要的文件
  • pyc文件反编译为py文件

    千次阅读 2020-02-28 15:39:51
    近期时不时需要把工程里的 pyc 文件反编译出来,查看接口函数的逻辑。此前有师兄安利了uncompyle6工具,我使用了几次,发现反编译出来的代码逻辑很清晰,此处我也不能打包票 uncompyle6 反编译出的源码一定无误,...
  • pyc文件反编译成py文件

    千次阅读 2020-12-13 16:15:31
    前言 从git上拉下来的程序,运行的时候发现import少一个py文件,相应文件夹下只有对应的pyc文件,且程序运行报import不了...pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,3.7编译pyc文件,3
  • 为了了解TCAX的文件结构,这几天开始尝试反编译pyc文件,折腾了一番终于搞定了。 注:本文主要是写给TCAX开发者看的,新人暂时先用TCAX论坛内的TCAX Studio或者TCAX Creator做特效字幕就行。 具体操作步骤如下 ...
  • 反编译pyc教程!简简单单还原源码!值得推荐!
  • pyc文件反编译为python代码

    千次阅读 2019-06-25 15:50:15
    pyc文件反编译为python代码在线工具新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...
  • py,反编译三、使用方法 前言 pyc时py编译后的二进制文件 一、py->pyc,编译 1、正常运行py文件即会在__pycache__文件夹下得到xxx…cpython-3x.pyc,即以python3.x版本编译得到的二进制pyc文件 2、使用py_...
  • python 将pyc 文件反编译成py源文件

    千次阅读 2017-11-13 11:07:03
    1.下载反编译工具Easy Python ...2.反编译pyc文件 3.将下列代码保存为bat文件,放到使用Easy Python Decompiler转换成功后的文件夹下,双击运行,即可自动删除当前目录及子目录下的pyc源文件,并将反编译pyc_dis
  • 超好用的python批量反编译软件

    热门讨论 2014-02-10 09:39:44
    很好用的python反编译软件,亲测python2.7反编译成功。 支持批量反编译,美中不足的是不支持嵌套文件夹中的反编译
  • Python .pyc的编译和反编译

    万次阅读 2017-07-28 14:32:22
    1. 由Python文件编译为.pyc文件 ...2. .pyc反编译,使用uncompyle 最方便的就是使用pip安装 uncompyle:pip install uncompyle uncompyle6 --help 查看帮助  uncompyle6 models.pyc > models
  • .pyc文件的编译与反编译

    千次阅读 2018-08-15 13:50:04
    编译 python 为 .pyc 文件: import py_compile pycompile.compile(filename) 反编译 .pyc 文件: pip install uncompyle2 命令行执行:uncompyle6 filename.pyc
  • pyc文件的生成、反编译pyc文件

    千次阅读 2018-08-24 22:48:25
    为了加密 .py 文件,以前一般使用打包成 exe ,但是最近发现可以将其编译成二进制文件 pyc ,虽然反编译难度不大,但是也需要一些水平 编译生成 pyc: 单个文件 代码: import py_compile py_compile....
  • python 反编译 pyc 一些心得

    万次阅读 2017-03-05 12:10:57
    0x01 , 现在用python的人也多了起来,...0x02,今天讨论的就是怎么反编译pyc到源代码的技术,从道理上来讲,这个是完全没问题的,而且反编译出来的代码质量应该相当高才对(参考java class的原理),在百度里面搜索
  • 1、pyc文件:是由Python文件经过编译后所生成的文件,它是一种字节码 byte code,因此我们直接查看就是乱码的,也对源码起到一定的保护作用,但是这种字节码byte code是可以反编译的,后面会介绍! 我们都知道计算机...
  • 如何反编译pyc文件查看源代码

    千次阅读 2020-09-05 21:03:44
    安装 pip install uncompyle 使用方法 uncompyle6 --help 查看帮助 ... models.py 将models.pyc反编译成py文件 uncompile -o . *.pyc 将当前文件夹中所有的pyc文件反编译成后缀名为.pyc_dis的源文件 使用示例 ...
  • pyc文件反编译到Python源码

    万次阅读 2018-01-17 10:22:31
     将models.pyc反编译成py文件  uncompile -o . *.pyc  将当前文件夹中所有的pyc文件反编译成后缀名为.pyc_dis的源文件 总结 反编译后的效果可以说很理想,如果你的代码格式符合PEP8规范的要求,那...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,321
精华内容 1,328
关键字:

pyc反编译