了解 exe/dll 个文件的编码

understanding encoding of exe/dll files

我最近试图了解 sockets 模块在 python 中是如何工作的,我打开了源代码并通过跟踪 socket class 我发现它使用了类似 _socket.socket 的东西。当我向上滚动并找到 import _socket 时,我向下追踪并发现该模块位于另一个名为 DLLs 的文件夹中(我不知道如何但我知道您可以从 python 安装导入文件location 无论您的文件位于何处,但是如何?如果您也能回答这个问题,那就太好了)所以用记事本打开文件(它没有默认的扩展名关联)告诉我它有一个笨拙的编码。这是 _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è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 文件具有相同的编码,所以如果有人能给我解码工具的 link 或者至少给我一个 table 就太好了编码的字符,所以我可以自己解码它。

DLL 和 EXE 文件都是“二进制”格式。在 Windows 上,这是 PE 格式。它是编译后的机器代码,不能恢复为(也不是从)python 代码。 Python 支持调用用 C 编写但通过 Python 调用的 Python 扩展。 Python里面的socket库都是用C写的,Python知道怎么调用进去

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

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

程序差异

  • 编译语言

    • 这些语言获取源代码(C、C++ 等)并将其转换为机器代码,最直接地由汇编语言表示。程序 运行s natively 在主机上,这意味着它不需要任何类型的解释器。它采用 OS 可以理解的格式。原始源代码 lost 因为没有直接映射回原始代码。可以使用高级反编译器进行推断,但它们通常是不完美的,并且会给出一些关于原始源代码看起来像什么的一般猜测。但是没有encoding这样你就可以从二进制格式中解析出源代码。
  • 解释性语言

    • 这些语言运行解释器(本地程序,OS理解格式,即PE)将解释 源代码并将其动态转换为处理器可以理解的机器代码。这就是 Python 的工作原理,也是源代码在您 运行 的程序中的原因。但是您只能通过 Python 解释器 运行 Python 代码。
  • 托管语言

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

Python 也可以表现得像 托管语言 ,因为它的解释 将源代码编译 为字节代码表示。然后它就像一个 VM,因为它执行该字节代码。这就是 .pyc 文件。它们对应的.py文件的字节码表示。

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

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