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

  • 相关阅读:
    软件工程学习报告
    WC项目
    ListView设置某一项item的文本居中
    rpm安装mysql
    批处理备份mysql数据
    SELinux下更改mysql端口
    PHP处理Android的POST数据
    Linux下设置开机启动
    设置ListView的item不能点击
    Android下设置ListView数据加载完成后执行layoutanimation
  • 原文地址:https://www.cnblogs.com/hainan-zhang/p/7216956.html
Copyright © 2011-2022 走看看