我需要确定python程序在执行过程中是否进行了某种加密。
我尝试了一些方法(我将按难度级别排序):
python中程序的源代码可以具有同义词,这些同义词可以标识正在使用的某些潜在加密(https://github.com/Wind-River/crypto-detector)。这种方法的问题在于,代码中的少许混淆可能会损害标识。
在下面定义的代码中,我们有一个可变字符串,其中包含负责某种加密的所有代码,但是通过这种分析,我们无法确定正在发生的加密:
def handle (arg):
from base64 import b64decode as printf
string = 'ZnJvbSBDcnlwdG8uQ2lwaGVyIGltcG9ydCBBRVM7IGZyb20gQ3J5cHRvIGltcG9ydCBSYW5kb207IGtleSA9IGIn
U2l4dGVlbiBieXRlIGtleSc7IGl2ID0gUmFuZG9tLm5ldygpLnJlYWQoQUVTLmJsb2NrX3NpemUpOyBjaXBoZXIgPSBBRVMubmV3KG
tleSwgQUVTLk1PREVfQ0ZCLCBpdik7IG1zZyA9IGl2ICsgY2lwaGVyLmVuY3J5cHQoYidBdHRhY2sgYXQgZGF3bicpOyBwcmludCBt
c2c = '
eval (compile (printf (string), '<string>', 'exec'))
return None
另一个代码示例:https://gist.github.com/robertonscjr/e3f658cce0c0253e2e076e0457635d86
此代码不包含可与加密使用相关的词,因此此方法几乎没有效果。该工具的无效性显而易见,因为在显然不进行加密的代码中可能会产生误报:
def handle (arg):
crypto = 2
return crypto
在汇编级别,任何程序的指令都可能指示可能使用加密算法,因为这些算法通常具有某种指令模式。 grap工具文章-是一种低级指令模式识别工具(https://eprint.iacr.org/2017/1119.pdf)-显示了AES执行步骤的低级模式。
在这种情况下,这种方法存在一个问题:grap进行的模式匹配是通过任何程序的反汇编x86-x64完成的,而对python执行x86-x64反汇编的过程意味着生成一个二进制的python程序(本机解释)。
我使用了名为 pyinstaller (https://www.pyinstaller.org)的工具,从稍微模糊的python程序(https://gist.github.com/robertonscjr/e3f658cce0c0253e2e076e0457635d86)生成二进制文件:
pyinstaller --onefile ~ / fake_aes.py
对于grap的执行,我使用了位于grap目录中的现有AES模式,结果并不乐观,因为下面描述的命令不会导致任何模式匹配:
grap -q ~ /grap/patterns/crypto/ ~/fake_aes.bin
怀疑之一是grap工具没有成功,因为二进制转换改变了指令的行为。问题:问题应该与pyinstaller如何生成Python二进制文件以及是否在生成的二进制文件中保持Python代码的行为有关?
如果pyinstaller生成正确的二进制文件并且不起作用,则存在第二个问题:我们需要找到grep的其他模式吗?这种方法的问题在于,发现另一种模式可能很耗时,而且严重混淆(https://youtu.be/3hSpmcoQ578?t=1999)也不是很有效。