最近在读sqlmap的源码,懵懵懂懂中页大约学到了一些知识(说给本身听的话:因而可知,所谓的可以解决全部遇到问题的python水平,只能说明你碰见的都是简单的需求。。。。),老规矩,在这里写一下,一则备忘,二则巩固python
首先,sqlmap第一步sql
1 def main(): 2 """ 3 Main function of sqlmap when running from command line. 4 """ 5 6 try: 7 checkEnvironment() 8 setPaths(modulePath()) 9 banner()
第一步就是检查环境,进入checkEnvironment查看,发现函数
1 def checkEnvironment(): 2 try: 3 os.path.isdir(modulePath()) 4 except UnicodeEncodeError: 5 errMsg = "your system does not properly handle non-ASCII paths. " 6 errMsg += "Please move the sqlmap's directory to the other location" 7 logger.critical(errMsg) 8 raise SystemExit
这个地方有一个modulePath()引发了个人兴趣,由于点进去查看了一下他是个啥,居然没看明白。。。工具
1 def modulePath(): 2 """ 3 This will get us the program's directory, even if we are frozen 4 using py2exe 5 """ 6 7 try: 11 _ = sys.executable if weAreFrozen() else __file__ 12 except NameError: 13 _ = inspect.getsourcefile(modulePath) 14 15 return getUnicode(os.path.dirname(os.path.realpath(_)), 16 encoding=sys.getfilesystemencoding() or UNICODE_ENCODING)
_ = sys.executable if weAreFrozen() else __file__
这一句从逻辑上分析,‘_ ’这个变量,若是weAreFrozen()==True,那么它等于sys.executable,sys.executable点进去查看,原来是python.exe所处位置,可是从代码上来看,这段
应该是获取的sqlmap目录,而不该该是解释器目录啊,而后else获取的是__file__,这个都知道,获取执行目录,相对路劲执行获取相对目录,绝对路劲执行获取绝对目录,想一想看,难道说
weAreFrozen永远不可能为True吗?
咱们点进去看一下这个weAreFrozen究竟是什么
1 def weAreFrozen(): 2 """ 3 Returns whether we are frozen via py2exe. 4 This will affect how we find out where we are located. 5 Reference: http://www.py2exe.org/index.cgi/WhereAmI 6 """ 7 8 return hasattr(sys, "frozen")
学识有限,没看出这是啥意思。。。那就去注释里面那个网址瞅瞅。。就是http://www.py2exe.org/index.cgi/WhereAmI这个。英文水平有限,只能看懂个大概意思,大约是说测试
若是sys含有frozen属性,证实你运行的是被打包成exe的文件,若是没有的话,你执行的就是script。哦?是这样吗?写个脚本验证下:ui
1 # -*- coding: utf-8 -*- 2 # ==================================================== 3 # @ Creator:Hainan.Zhang 4 # @ Date:2017-7-21 5 # 测试 6 # ==================================================== 7 import sys 8 print sys.executable 9 print hasattr(sys, "frozen")
咱们使用pyinstaller将这个.py文件打包成exe编码
而后这行一下,pyinstaller在命令行运行,将在命令行路劲新增build和dist文件夹,要去dist里面找这个test.exe。spa
确实没错,原来打包成exe的文件,那么sys.executable将显示为被执行exe路劲,sys会多出frozen属性。咱们接着看modulePath,后面一旦出现NameError,那么在except语句命令行
中,_赋值为inspect.getsourcefile(modulePath),getsourcefile的做用点进去看注释就很明显 ,也是返回这段代码所在路劲。3d
modulePath的最后,return语句中调用了本身写的getUnicode函数,将获取的路劲转换为想要的编码encoding=sys.getfilesystemencoding() or UNICODE_ENCODING
若是该文件指定了编码格式,那么编码格式为指定格式,若是没有,就转换为unicode,有一本书叫作什么改善python程序的59个方法,里面写到,咱们要本身实现编码转换函数,已解决本身项目中的编码问题,这个getUnicode能够做为范例。防止中文,日文等路劲的影响。
sqlmap不愧是神级工具,源码里面这一小段,让我收获颇多,坚持读下去。有感悟的时候再和你们分享