Scapy模块阻止PyCharm调试器

Ida*_*fek 3 python import ubuntu scapy pycharm

我正在PyCharm的一个项目,我需要调试代码的某些部分.

当我尝试调试时,调试器只是"跳过"断点而不停止它们.在网上进行了很多无用的尝试之后,我发现当我导入Scapy模块时,调试器不起作用,并且当没有导入Scapy时,一切都运行起来很精细.

顺便说一句 - 我在Ubuntu OS上工作.

有任何想法吗??

小智 5

我自己遇到了这个问题.这很烦人.经过多次调试,得到了答案.

问题的原因似乎是scapy将所有内容导入全局命名空间的方式,这似乎打破了PyCharm(名字冲突,也许?).

顺便说一句,这一切都适用于2016年10月18日的scapy v2.3.3.

随着scapy的加载,它最终会遇到一条线scapy/all.py:

from scapy.layers.all import *
Run Code Online (Sandbox Code Playgroud)

这会加载scapy/layers/all.py哪些负载scapy/config.py.最后一个文件初始化Conf.load_layers[]为模块列表(in scapy/layers).

scapy/layers/all.py然后遍历此列表,调用_import_star()每个模块.

加载后scapy/layers/x509.py,PyCharm中的所有断点都会停止工作.

我有四个解决方案,选择你最喜欢的解决方案......

(1)如果你不使用任何与X509做,你可以简单地从分配给列表中删除此模块Conf.load_layers[]scapy/config.py(在我的副本线383 config.py).警告:这是一个真正的黑客 - 请避免这样做,除非你没有其他方法.

如果需要暂时调试,还可以使用此代码示例:

from scapy import config
config.Conf.load_layers.remove("x509")
from scapy.all import *
Run Code Online (Sandbox Code Playgroud)

(2)问题是将符号导入全局命名空间.这对于类很好,对常量不好.有代码_import_star()检查符号的名称,如果以符号_(即"私有"名称)开头,则不会将其加载到全局名称空间中.您可以修改此函数以x509通过忽略不开始的名称来特别处理模块X509_.希望这将导入定义的类x509而不是常量.这是一个示例补丁:

*** layers/all.py   2017-03-31 12:44:00.673248054 +0100
--- layers/all.py   2017-03-31 12:44:00.673248054 +0100
***************
*** 21,26 ****
--- 21,32 ----
          for name in mod.__dict__['__all__']:
              __all__.append(name)
              globals()[name] = mod.__dict__[name]
+     elif m == "x509":
+         # import but rename as we go ...
+         for name, sym in mod.__dict__.iteritems():
+             if name[0] != '_' and name[:5] != "X509_":
+                 __all__.append("_x509_" + name)
+                 globals()["_x509_" + name] = sym
      else:
          # import all the non-private symbols
          for name, sym in mod.__dict__.iteritems():
Run Code Online (Sandbox Code Playgroud)

警告:这是一个真正的黑客 - 请避免这样做,除非你没有其他方法.

(3)这是解决方案(2)的变体,也是A REAL HACK(等等)的变形.您可以编辑scapy/layers/x509.py并添加_到所有常量.例如,default_directoryName应将所有实例更改为_default_directoryName.我发现需要改变以下常量:default_directoryName,reasons_mapping,cRL_reasons,ext_mapping,default_issuer,default_subject,attrName_mappingattrName_specials.这很好,因为它匹配应用于x509.py我在scapy git repo中找到的修复...

(4)您可以更新到下一版本的scapy.我不知道这是不是v2.3.4或v2.4,因为(在撰写本文时)尚未发布下一个版本.因此,虽然这个(缺少新版本)仍在继续,但您可以更新到最新的开发版本(他们已经在2017年2月8日解决了这个问题).我使用安装在我的主目录下的scapy(而不是在系统python包的位置),所以我做了以下内容:

pip uninstall scapy
git clone https://github.com/secdev/scapy /tmp/scapy
cd /tmp/scapy
python setup.py install --user
cd -
rm -rf /tmp/scapy
Run Code Online (Sandbox Code Playgroud)

祝好运 !