在阅读sqlmap源码时学到的知识--检查运行环境

    最近在读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不愧是神级工具,源码里面这一小段,让我收获颇多,坚持读下去。有感悟的时候再和你们分享

相关文章
相关标签/搜索