了解 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++。享受吧!
我最近试图了解 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++。享受吧!