反向工程.pyo python文件

时间:2010-05-11 09:20:06

标签: python disassembly

我有2个.pyo python文件,我可以将其转换为.py源文件,但它们不能完全编译,如convertyle的验证暗示。

因此,查看源代码,我可以看出config.pyo只是在数组中有变量:

ADMIN_USERIDS = [116901,  141,  349244,  39,  1159488]

我想采取原始的.pyo和反汇编或我需要做的任何事情,以便更改其中一个ID。

或者....

在model.pyo中,源代表

if(productsDeveloperId!= self.getUserId()):

所有我想做的是十六进制编辑!=是一个== .....简单的Windows exe程序,但我找不到一个好的python反汇编程序。

欢迎任何建议......我不熟悉读取字节码和新的python。

5 个答案:

答案 0 :(得分:0)

将.pyo文件转换为.py,然后编辑.py,然后在.py文件上运行python。 Python将重新生成.pyo文件不要编辑pyo

我不知道python字节码,但我怀疑字符串==或1 =会出现在.pyo文件中

虽然更好的方法是获取原始的.py文件并使用它们。如果他们给出错误的程序,如果想要改变!= to ==那么你可以要求供应商修复错误。

答案 1 :(得分:0)

这是提问者布莱恩。

我已经通过试错和十六进制编辑,十六进制编辑完成了我需要做的事情......然后转换源...看看我改变了什么..直到我最终缩小了我想要的东西。常量(管理员ID)在十六进制文件中作为转换的十六进制(显然)但向后。

我仍然不知道我怎么或在哪里找到!=

我听说IDA Pro最新版本支持python,但我还没有学会如何让python工作。

答案 2 :(得分:0)

IDA高达6.0没有.pyc反编译模块。

答案 3 :(得分:0)

我不知道这是否会直接帮助你,但Python already has a bytecode disassembler

对于相反的操作,即生成字节码,有几种选择。一方面你有the standard compiler package,然后还有BytecodeAssembler library,这可能更适合你的需要。

答案 4 :(得分:0)

最近我开发了可以帮助解决这类问题的工具。有些东西仍然非常多,但有些工作你可以在这里使用它。

周围有几个反汇编程序,它们通常出现在反编译器中。我当然偏爱的那个是我写的xdis,因为它提供了有关字节码文件中的内容的最多信息。还有一个用C ++编写的pycdas,它位于具有pycdc反编译器的项目中。所以那部分不是新的。

另外,正如您所指出的那样,您使用的是反编译器,但它并不完美。希望在后来的版本uncompyle6中,这些错误已得到解决。但如果没有,请提交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的指令。

查看这个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].

但是对于秘密的解码器响铃信息,你必须去 你可能在你的磁盘上的opcode.py的Python源代码,但是这里有一个链接: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一节中你基本上改变那里的数字,然后运行汇编程序。