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

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

原文地址:https://www.cnblogs.com/hainan-zhang/p/7216956.html