最近在读sqlmap的源码,懵懵懂懂中页大约学到了一些知识(说给自己听的话:由此可见,所谓的能够解决所有遇到问题的python水平,只能说明你遇见的都是简单的需求。。。。),老规矩,在这里写一下,一则备忘,二则巩固
首先,sqlmap第一步
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。哦?是这样吗?写个脚本验证下:
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。
确实没错,原来打包成exe的文件,那么sys.executable将显示为被执行exe路劲,sys会多出frozen属性。我们接着看modulePath,后面一旦出现NameError,那么在except语句
中,_赋值为inspect.getsourcefile(modulePath),getsourcefile的作用点进去看注释就很明显 ,也是返回这段代码所在路劲。
modulePath的最后,return语句中调用了自己写的getUnicode函数,将获取的路劲转换为想要的编码encoding=sys.getfilesystemencoding() or UNICODE_ENCODING
如果该文件指定了编码格式,那么编码格式为指定格式,如果没有,就转换为unicode,有一本书叫做什么改善python程序的59个方法,里面写到,我们要自己实现编码转换函数,已解决自己项目中的编码问题,这个getUnicode可以作为范例。防止中文,日文等路劲的影响。
sqlmap不愧是神级工具,源码里面这一小段,让我收获颇多,坚持读下去。有感悟的时候再和大家分享