python - 理解 exe/dll 文件的编码
问题描述
我最近试图了解 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 文件具有相同的编码,所以如果有人能给我一个解码工具的链接或者至少给我一个这个编码字符的表以便我可以解码它会很酷我自己的。
解决方案
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 文件的字节码表示。
推荐阅读
- javascript - 与 ES6 模块的混淆
- delphi - Error when trying to debug a 64-bit console application
- c# - (400) Bad Request : Get AccessToken of Salesforce error:"invalid_grant"
- wordpress - 如何使用不同的编号系统更改 Gutenberg (Wordpress) 中的嵌套列表?
- nativescript - Nativescript-vue 字体图标 - 图片标签
- java - 同一个socket的输入流和输出流怎么看?
- javascript - ArrayBuffer 转换为零输出 Uint8Array
- angular - Jasmine Test Explorer 在 VS Code 中显示 typescript jasmine 测试
- c# - 在 Binance.Net 中将特定加密货币对的余额拆分为 50/50
- sql - 是否可以保留标题但使用 sqlcmd 删除 sql 输出的连字符