最近在读sqlmap的源码,懵懵懂懂中页大约学到了一些知识(说给自己听的话:由此可见,所谓的能够解决所有遇到问题的python水平,只能说明你遇见的都是简单的需求。。。。),老规矩,在这里写一下,一则备忘,二则巩固

首先,sqlmap第一步

 def main():
"""
Main function of sqlmap when running from command line.
""" try:
checkEnvironment()
setPaths(modulePath())
banner()

第一步就是检查环境,进入checkEnvironment查看,发现

 def checkEnvironment():
try:
os.path.isdir(modulePath())
except UnicodeEncodeError:
errMsg = "your system does not properly handle non-ASCII paths. "
errMsg += "Please move the sqlmap's directory to the other location"
logger.critical(errMsg)
raise SystemExit

这个地方有一个modulePath()引起了我的兴趣,因为点进去查看了一下他是个啥,竟然没看明白。。。

 def modulePath():
"""
This will get us the program's directory, even if we are frozen
using py2exe
""" try:
_ = sys.executable if weAreFrozen() else __file__
except NameError:
_ = inspect.getsourcefile(modulePath) return getUnicode(os.path.dirname(os.path.realpath(_)),
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到底是什么
 def weAreFrozen():
"""
Returns whether we are frozen via py2exe.
This will affect how we find out where we are located.
Reference: http://www.py2exe.org/index.cgi/WhereAmI
""" return hasattr(sys, "frozen")

学识有限,没看出这是啥意思。。。那就去注释里面那个网址瞅瞅。。就是http://www.py2exe.org/index.cgi/WhereAmI这个。英文水平有限,只能看懂个大概意思,大约是说

如果sys含有frozen属性,证明你运行的是被打包成exe的文件,如果没有的话,你执行的就是script。哦?是这样吗?写个脚本验证下:

 # -*- coding: utf-8 -*-
# ====================================================
# @ Creator:Hainan.Zhang
# @ Date:2017-7-21
# 测试
# ====================================================
import sys
print sys.executable
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不愧是神级工具,源码里面这一小段,让我收获颇多,坚持读下去。有感悟的时候再和大家分享

在阅读sqlmap源码时学到的知识--检查运行环境的更多相关文章

  1. Apache Spark源码走读之12 -- Hive on Spark运行环境搭建

    欢迎转载,转载请注明出处,徽沪一郎. 楔子 Hive是基于Hadoop的开源数据仓库工具,提供了类似于SQL的HiveQL语言,使得上层的数据分析人员不用知道太多MapReduce的知识就能对存储于H ...

  2. 如何阅读Java源码 阅读java的真实体会

    刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心.   说到技术基础,我打个比 ...

  3. 如何阅读Java源码

    刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动.源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧, ...

  4. [strongswan][autoconf][automake][cento] 在CentOS上编译strongswan git源码时遇到的autoconf问题

    编译strongswan的git源码问题 1. 概述 首先,我们想要通过源码编译strongswan.当满足以下条件时,通常你会遇见此问题: 源码时通过git clone的得来的,而不是官网下载的源码 ...

  5. 如何阅读Java源码?

    阅读本文大概需要 3.6 分钟. 阅读Java源码的前提条件: 1.技术基础 在阅读源码之前,我们要有一定程度的技术基础的支持. 假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃< ...

  6. SQLmap源码分析之框架初始化(一)

    SQLmap是现在搞web人手一个的注入神器,不仅包含了主流数据库的SQL注入检测,而且包含提权以及后渗透模块.基于python2.x开发而成,使用方便.所以研究web安全少不了分析源码,学习代码的同 ...

  7. SQLMAP源码分析(一)

    说起来,学习Python很大一部分原因是由于对WEB安全的兴趣以及对SQLMAP这款工具的好奇,曾经设想学完Python基础就读一读SQLMAP源码,然而懒病一犯,随之就大江东去.近来,又重新燃起了读 ...

  8. 如何有效的阅读JDK源码

    阅读Java源码的前提条件: 1.技术基础 在阅读源码之前,我们要有一定程度的技术基础的支持. 假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃<Core Java>,那样 ...

  9. CRUD搬砖两三年了,怎么阅读Spring源码?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! ‍连读同事写的代码都费劲,还读Spring? 咋的,Spring 很难读! 这个与我们码农朝夕 ...

随机推荐

  1. python设计模式之迭代器与生成器详解(五)

    前言 迭代器是设计模式中的一种行为模式,它提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示.python提倡使用生成器,生成器也是迭代器的一种. 系列文章 python设计模 ...

  2. Skip List(跳跃表)原理详解与实现【转】

    转自:http://dsqiu.iteye.com/blog/1705530 Skip List(跳跃表)原理详解与实现 本文内容框架: §1 Skip List 介绍 §2 Skip List 定义 ...

  3. Linux下用到数据库sqlite3

    最近在Linux下用到数据库sqlite3,于是开始了该方面的学习. 0. 引言 我们这篇文章主要讲述了如何在C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理, 包括创建数据库.创建 ...

  4. Ural Sport Programming Championship 2015

    Ural Sport Programming Championship 2015 A - The First Day at School 题目描述:给出课程安排,打印一个课程表. solution 暴 ...

  5. 程序调试命令gdb

    锁定线程 set scheduler-locking 1.要使用此命令,先用gcc -g编译程序,如:  $gcc -g test.c -o test  编译test.c源程序,输入此程序的调试版本t ...

  6. 9.Python3标准库--数据压缩与归档

    ''' 尽管现代计算机系统的存储能力日益增长,但生成数据的增长是永无休止的. 无损(lossless)压缩算法以压缩或解压缩数据花费的时间来换取存储数据所需要的空间,以弥补存储能力的不足. Pytho ...

  7. 大型网站的 HTTPS 实践(二)——HTTPS 对性能的影响(转)

    原文链接:http://op.baidu.com/2015/04/https-s01a02/ 1 前言 HTTPS 在保护用户隐私,防止流量劫持方面发挥着非常关键的作用,但与此同时,HTTPS 也会降 ...

  8. C语言花括号

    由于C语言本身就是函数式语言,说白了,C程序就是由函数构成的! 所以花括号肯定是用在函数之中,包括函数中的各种流程控制语句中. 实际上,C程序中花括号{}的作用:就是把多个单条语句用花括号{}括起来组 ...

  9. POJ 2230 Watchcow(欧拉回路:输出点路径)

    题目链接:http://poj.org/problem?id=2230 题目大意:给你n个点m条边,Bessie希望能走过每条边两次,且两次的方向相反,让你输出以点的形式输出路径. 解题思路:其实就是 ...

  10. HDU 1024 Max Sum Plus Plus(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题目大意:有多组输入,每组一行整数,开头两个数字m,n,接着有n个数字.要求在这n个数字上,m块 ...