尝试去读SQLMAP源码(一)

本人python 小菜比 一枚。拜读业界典范~~

阅读sqlmap 的版本是1.1.6,目前应该是最新版。

sqlmap.py 脚本中 72~83

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)

modulePath 按照名字来看,应该是和路径相关的。

sys.executable 获取当前python 解释器路径。

__file__ 相对路径下执行获得相对路径,绝对路径下执行获得绝对路径。

weAreFrozen() 这个函数在这里,hasattr 获取sys 中是否存在这个frozen属性,返回一个布尔值。

文件在这里:lib/core/common.py  代码如下:

尝试去读SQLMAP源码(一)

小技巧:Python获得自己的绝对路径
Python中有个魔术变量可以得到脚本自身的名称,但转换成exe后该变量失效,这时得改用sys.executable获得可执行程序的名称,可用hasattr(sys, "frozen")判断自己是否已被打包,下面是一个方便取绝对路径的。

为了搞明白,然后做了测试。

尝试去读SQLMAP源码(一)

尝试去读SQLMAP源码(一)

尝试去读SQLMAP源码(一)

继续更新了,周末更新好,结果手一抖关了。真糗。

翻页看的太累了。代码如下:

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)

inspect.getsourcefile(modulePath)  查找modulePath的导入路径。

return getUnicode(os.path.dirname(os.path.realpath(_)), encoding=sys.getfilesystemencoding() or UNICODE_ENCODING)

os.path.dirname(os.path.realpath(_))  返回绝对路径

sys.getfilesystemencoding() 本地编码

UNICODE_ENCODING 这个需要找到 lib/core/settings.py 中的

尝试去读SQLMAP源码(一)

getUnicode:

文件在这里:lib/core/common.py  代码如下:

def getUnicode(value, encoding=None, noneToNull=False):
"""
Return the unicode representation of the supplied value: >>> getUnicode(u'test')
u'test'
>>> getUnicode('test')
u'test'
>>> getUnicode(1)
u'1'
""" if noneToNull and value is None:
return NULL if isinstance(value, unicode):
return value
elif isinstance(value, basestring):
while True:
try:
return unicode(value, encoding or (kb.get("pageEncoding") if kb.get("originalPage") else None) or UNICODE_ENCODING)
except UnicodeDecodeError, ex:
try:
return unicode(value, UNICODE_ENCODING)
except:
value = value[:ex.start] + "".join(INVALID_UNICODE_CHAR_FORMAT % ord(_) for _ in value[ex.start:ex.end]) + value[ex.end:]
elif isListLike(value):
value = list(getUnicode(_, encoding, noneToNull) for _ in value)
return value
else:
try:
return unicode(value)
except UnicodeDecodeError:
return unicode(str(value), errors="ignore") # encoding ignored for non-basestring instances

看到亲切的注释,返回以unicode转换后的结果。

if noneToNull and value is None:
return NULL

开始判断noneToNull和value 是否为空。

if isinstance(value, unicode):
return value

然后isinstance python中内置方法,判断unicode类型。

elif isinstance(value, basestring):
while True:
try:
return unicode(value, encoding or (kb.get("pageEncoding") if kb.get("originalPage") else None) or UNICODE_ENCODING)
except UnicodeDecodeError, ex:
try:
return unicode(value, UNICODE_ENCODING)
except:
value = value[:ex.start] + "".join(INVALID_UNICODE_CHAR_FORMAT % ord(_) for _ in value[ex.start:ex.end]) + value[ex.end:]

其次basestring检查unicode对象。

红色标记是没看懂的。

encoding or (kb.get("pageEncoding") if kb.get("originalPage") else None) or UNICODE_ENCODIN

value = value[:ex.start] + "".join(INVALID_UNICODE_CHAR_FORMAT % ord(_) for _ in value[ex.start:ex.end]) + value[ex.end:]

elif isListLike(value):
value = list(getUnicode(_, encoding, noneToNull) for _ in value)
return value

再次遍历列表,通过递归getUnicode批量转换编码。

else:
try:
return unicode(value)
except UnicodeDecodeError:
return unicode(str(value), errors="ignore") # encoding ignored for non-basestring instances

最后unicode转码返回,并且忽略错误。

将不懂部分搞明白,再继续。

上一篇:SqlServer将表中数据复制到另一张表


下一篇:Oracle Dataguard 基本原理