对.pyo python文件进行反向工程

qltillow  于 2023-03-06  发布在  Python
关注(0)|答案(4)|浏览(143)

我有2个. pyo python文件可以转换成. py源文件,但是它们不能像decompyle的verify所暗示的那样完美地编译。
因此,查看源代码,我可以看出config. pyo只是在数组中包含变量:
管理员用户ID =[116901、141、349244、39、1159488]
我想采取原来的。pyo和拆卸或任何我需要做的,以改变这些ID之一。
或者...
在model.pyo中,源代码表示
如果(产品开发者ID!=自身.获取用户ID()):
所有我想做的是十六进制编辑!=成为一个==.....简单的windows exe程序,但我找不到一个好的python反汇编程序的任何地方。
欢迎任何建议...我是字节码的新手,也是Python的新手。

dgtucam1

dgtucam11#

将.pyo文件转换为.py,然后编辑.py,然后在.py文件上运行python。Python将重新生成.pyo文件。不要编辑pyo
我不知道python的字节码,但我怀疑字符串==或1=是否会出现在.pyo文件中
虽然一个更好的方法是获得原始的.py文件并使用它们。如果他们给予了错误的程序,因为他们想要改变!=到==,那么你可以要求供应商修复这个bug。

iovurdzv

iovurdzv2#

IDA 6.0之前的版本没有.pyc反编译模块。

2j4z5cfb

2j4z5cfb3#

我不知道这是否能直接帮助你,但是Python already has a bytecode disassembler
对于相反的操作,即生成字节码,有两种选择:一方面是the standard compiler package,另一方面是BytecodeAssembler library,它们可能更适合您的需要。

roqulrg3

roqulrg34#

最近,我开发了一些工具,应该可以帮助解决这类问题,有些东西仍然是非常初级的,但是经过一些工作,你可以在这里使用它。
有几个反汇编器,它们通常出现在反编译器中。当然,我偏爱的是我写的一个叫做xdis的,因为它提供了关于字节码文件中内容的最多信息。还有一个叫做pycdas的,用C++写的,在包含pycdc反编译器的项目中。所以这部分并不新鲜。
另外,正如你所说,你使用了一个反编译器,但它并不完美。希望在以后的版本uncompyle6中这些bug已经得到解决。但如果没有,请提交一个github问题。
好了,现在说说新的东西吧,最近我修改了反汇编器,使其易于修改,并编写了一个Python汇编器,将其存储回pyc字节码格式。在http://github.com/rocky/python-xasm处找到它。
这样你就可以对常量和条件测试进行简单的修改。
现在让我们进入条件测试,因为您特别问到了这一点,这里还没有完全回答。
考虑下面这个简单的Python代码:

___file__ == '__main'

让我们用pydisasm分解它:

...
# Constants:
#    0: '__main'
#    1: None
# Names:
#    0: ___file__
  1:           0 LOAD_NAME                 0 (___file__)
               3 LOAD_CONST                0 ('__main')
               6 COMPARE_OP                2 (==)
               9 POP_TOP
              10 LOAD_CONST                1 (None)
              13 RETURN_VALUE

好的,我们看到==COMPARE_OP指令的操作数,编码为2。
查看www.example.com的文档https://docs.python.org/3.6/library/dis.html#opcode-COMPARE_OP(这是Python 3.6的文档,但几乎所有Python版本都是一样的),有一个稍微有帮助的解释:

The operation name can be found in cmp_op[opname].

但要获得秘密解码器环的信息,你必须访问Python源代码,网址是opcode.py,你可能在磁盘上的某个地方找到了它,这里有一个链接:https://github.com/python/cpython/blob/master/Lib/opcode.py#L24,我们在这里有

cmp_op = ('<', '<=', '==', '!=', '>', '>=', 'in', 'not in', 'is', ...

你会看到==是2,而!=是3。
至于修改常量[116901, 141, 349244, 39, 1159488],它会出现在我的反汇编程序中,叫做Constants的部分,你基本上会修改那里的数字,然后运行汇编程序。

相关问题