【问题标题】:understanding encoding of exe/dll files了解 exe/dll 文件的编码
【发布时间】:2021-06-16 08:54:04
【问题描述】:

我最近试图了解 sockets 模块在 python 中是如何工作的,我打开了源代码并通过跟踪 socket 类我发现它使用了类似_socket.socket 的东西。当我向上滚动并找到import _socket 时,我跟踪它并发现该模块位于另一个名为 DLLs 的文件夹中(我不知道如何,但我知道无论你的文件在哪里,你都可以从 python 安装位置导入文件位于,但是如何?如果你也能回答这个疑问,那就太酷了)所以用记事本打开文件(它没有默认的扩展名关联)告诉我它有一个尴尬的编码。这是_socket.pyd 中的前几行:

MZ       ÿÿ  ¸       @                                     º ´  Í!¸LÍ!This program cannot be run in DOS mode.

    $       jâò.ƒã¡.ƒã¡.ƒã¡'ûp¡(ƒã¡B÷â ,ƒã¡B÷æ "ƒã¡B÷ç &ƒã¡B÷à -ƒã¡÷÷â ,ƒã¡uëâ )ƒã¡.ƒâ¡”ƒã¡÷÷î /ƒã¡÷÷ã /ƒã¡÷÷¡/ƒã¡÷÷á /ƒã¡Rich.ƒã¡                PE  d† ;3`        ð "  z   ¤      ¨(        €                        `    ð=  `                                   põ  P   Àõ  ´    @       0 €
        °   P ¸  ô¡  T                           P¢  8                                       .text   ny      z                    `.rdata  ¬y      z   ~              @  @.data   (        ø              @  À.pdata  €
       0                  @  @.rsrc       @  
                    @  @.reloc  ¸   P                  @  B                                                                                                                                                                                                                                                                H‰\$H‰t$UWATAVAWH¬$ÿÿÿHìð  H‹àÿ  H3ÄH‰…è   ¹  HT$ ÿf  …À…>,  H
      ÿ9„  3ÿƒ=è ÿDg…„   3ÒÇD$   A¸   H‰|$,HL$4è5(  3Àf‰}6A°‰E8W3Éÿ0€  A°A‹ÔH‹Èÿ!€  A°W H‹Èÿ€  W#ÇD$$   L‹ÀD‰d$(HL$ fD‰e4ÿß  ‹Ï…À•Á‰
    Z H‹£ƒ  H

任何人都知道如何将其解码为简单的 python 代码(我只知道.pyd 文件是 DLL 文件,但是是 python 格式)?我还从谷歌搜索数小时发现 DLL 和 EXE 文件具有相同的编码,所以如果有人能给我一个解码工具的链接或者至少给我一个这个编码字符的表以便我可以解码它会很酷我自己的。

【问题讨论】:

  • 这是一个二进制文件,是编译C代码的结果。您无法将其转换为 Python 代码。
  • 如果你想了解socket模块是如何工作的,你可以阅读原始的C源代码,因为Python是开源软件。
  • 那么一个C编译是如何导入python的呢?
  • 使用Python的导入机制。
  • @mkrieger1 我找不到原始源代码,如果你知道它在哪里可以给一个链接

标签: python file-encodings


【解决方案1】:

DLL 和 EXE 文件都是“二进制”格式。在 Windows 上,这是 PE 格式。它是已编译的机器代码,不能恢复为(也不是从)python 代码。 Python 支持调用用 C 编写但通过 Python 调用的 Python 扩展。 Python 中的套接字库都是用 C 编写的,Python 知道如何调用它。

还要查看套接字的代码,您需要在 CPython 存储库中找到相应的 C 源文件。或者,您可以使用 IDA Pro 或 Ghidra 之类的反汇编程序为您提供汇编表示,但如果您还不了解二进制格式,这可能没有多大用处。 Ghidra(和 IDA Pro 的 HexRays)也将尝试反编译程序集,为您提供原始源的近似值,但没有变量名和推断类型等。

但如果您正在寻找位于 _socket 后面的 python 代码,则不存在。

程序差异

  • 编译语言

    • 这些语言采用源代码(C、C++ 等)并将其转换为机器代码,最直接地由汇编语言表示。该程序在主机上本地运行,这意味着它不需要任何类型的解释器。它采用操作系统可以理解的格式。原始源代码丢失,因为没有直接映射回原始代码。可以使用高级反编译器进行推断,但它们通常是不完美的,并且会对原始源代码的外观做出一些一般性的猜测。但是没有编码这样你就可以从二进制格式中解析出源代码。
  • 解释性语言

    • 这些语言运行一个解释器(它是一个本机程序,采用操作系统可以理解的格式,即 PE),它将解释源代码并将其动态转换为机器代码处理器明白。这就是 Python 的工作原理,也是源代码位于您运行的程序中的原因。但您只能通过 Python 解释器运行 Python 代码。
  • 托管语言

    • 这些有点混合。他们有一个编译步骤,获取源代码并将其转换为字节码。然后,这个字节码通过一个解释器运行,将它转换成机器码。所以你仍然需要一个可以运行字节码的解释器(或者VM是更常见的术语),但源代码本身不必存在。其中许多也可以反编译,并且可能比编译语言提供更好的输出,但它只是从底层代码推断出来的,而不是用于构建二进制文件的实际源代码。

Python 也可以像 托管语言 一样,因为它会将源代码解释为 编译 字节码表示形式。然后它就像一个虚拟机一样执行那个字节码。这就是 .pyc 文件。它们对应的 .py 文件的字节码表示。

【讨论】:

  • 好的,所以我只想确保这一点,所以这是用 C(不是 C# 或 C++)编码的,并且恢复它会给我 C 代码而不是任何二进制的东西,对吗?跨度>
  • C 代码编译为“二进制内容”(机器语言操作码)。 DLL 或 PYD 文件不包含您所理解的任何编程语言的代码。一些非常聪明的反汇编程序可能能够将其映射回等效的 C 代码,但它不会是程序员编写的。
【解决方案2】:

Python 本身是一个程序,它在您的计算机上运行。 Python 代码被读取和解释,并最终通过在计算机的本机指令集中执行代码来执行。好吧,Python 的设置使它可以导入和运行已经采用“本机”指令形式的代码(在这种情况下,用 C 编写并编译为机器代码)。

要了解其工作原理,请查看官方 python.org 文档:Extending Python with C or C++。享受吧!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多