GitHack 源码分析
Posted bxscope
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GitHack 源码分析相关的知识,希望对你有一定的参考价值。
sys.argv[-1]获取控制台输入的url赋值给base_url
通过urlparse.urlparse(sys.argv[-1]).netloc.replace(‘:‘, ‘_‘)获取给定url中的服务器地址赋值给domain
创建名为domain的文件夹
输出:[+] Download and parse index file ...
通过_request_data()函数获取目标路径下的index文件赋值给data
创建index文件,在其中写入上一步获取到的data
定义一个FIFO队列
>>> from urlparse import urlparse >>> o = urlparse(‘http://www.cwi.nl:80/%7Eguido/Python.html‘) >>> o # doctest: +NORMALIZE_WHITESPACE ParseResult(scheme=‘http‘, netloc=‘www.cwi.nl:80‘, path=‘/%7Eguido/Python.html‘, params=‘‘, query=‘‘, fragment=‘‘) >>> o.scheme ‘http‘ >>> o.port 80 >>> o.geturl() ‘http://www.cwi.nl:80/%7Eguido/Python.html‘
urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
该类是URL请求的抽象。
url应该是包含有效URL的字符串。
data可以是指定要发送到服务器的其他数据的字符串,如果不需要这样的数据,则为None。 目前,HTTP请求是唯一使用数据的请求; 提供数据参数时,HTTP请求将是POST而不是GET。 数据应该是标准application / x-www-form-urlencoded格式的缓冲区。 urllib.urlencode()函数采用2元组的映射或序列,并以此格式返回一个字符串。
headers应该是一个字典,并且将被视为调用add_header()时每个键和值作为参数。 这通常用于“欺骗”User-Agent标头值,浏览器使用该标头值来识别自身 - 某些HTTP服务器仅允许来自常见浏览器而非脚本的请求。 例如,Mozilla Firefox可能将自己标识为“Mozilla / 5.0(X11; U; Linux i686)Gecko / 20071127 Firefox / 2.0.0.11”,而urllib2的默认用户代理字符串为“Python-urllib / 2.6”(在Python 2.6上) 。
最后两个参数仅对正确处理第三方HTTP cookie感兴趣:
origin_req_host应该是RFC 2965定义的origin事务的请求主机。它默认为cookielib.request_host(self)。 这是用户启动的原始请求的主机名或IP地址。 例如,如果请求是针对HTML文档中的图像,则该请求应该是包含图像的页面请求的请求主机。
unverifiable应该表明请求是否无法验证,如RFC 2965所定义。它默认为False。 无法验证的请求是用户无法选择批准的URL。 例如,如果请求是针对HTML文档中的图像,并且用户没有选择批准自动获取图像,则应该这样。
import urllib2 url = ‘http://www.baidu.com‘ request = urllib2.Request(url) print request
运行结果:
C:\Python27\python.exe E:/python/GitHack-master/lib/test.py <urllib2.Request instance at 0x00000000034F0088>
返回一个Request实例
官方文档:https://docs.python.org/zh-cn/2.7/library/urllib2.html#module-urllib2
urllib2.urlOpen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]]
打开URL ,url可以是字符串或Request对象。
data可以是指定要发送到服务器的其他数据的字符串,如果不需要这样的数据,则为None。 目前,HTTP请求是唯一使用数据的请求; 提供数据参数时,HTTP请求将是POST而不是GET。 数据应该是标准application / x-www-form-urlencoded格式的缓冲区。 urllib.urlencode()函数采用2元组的映射或序列,并以此格式返回一个字符串。 urllib2模块使用Connection发送HTTP / 1.1请求:包括close头。
可选的timeout参数指定阻塞操作(如连接尝试)的超时(以秒为单位)(如果未指定,将使用全局默认超时设置)。 这实际上仅适用于HTTP,HTTPS和FTP连接。
如果指定了context,则它必须是描述各种SSL选项的ssl.SSLContext实例。 有关更多详细信息,请参阅HTTPSConnection。
可选的cafile和capath参数为HTTPS请求指定一组可信CA证书。 cafile应指向包含一组CA证书的单个文件,而capath应指向散列证书文件的目录。 可以在ssl.SSLContext.load_verify_locations()中找到更多信息。
cadefault参数被忽略。
此函数返回一个类似文件的对象,其中包含三个附加方法:
geturl() - 返回检索到的资源的URL,通常用于确定是否遵循重定向
info() - 以mimetools.Message实例的形式返回页面的元信息,例如headers(请参阅HTTP标题的快速参考)
getcode() - 返回响应的HTTP状态代码。
import urllib2 url = ‘http://www.baidu.com‘ request = urllib2.Request(url) print urllib2.urlopen(request)
运行结果:
C:\Python27\python.exe E:/python/GitHack-master/lib/test.py <addinfourl at 58013064L whose fp = <socket._fileobject object at 0x00000000034F67C8>>
返回一个socket._fileobject 对象,也就是个文件对象
官方文档:https://docs.python.org/zh-cn/2.7/library/urllib2.html#module-urllib2
class mmap.mmap(*fileno*, *length*[, *tagname*[, *access*[, *offset*]]])
(Windows版)映射文件句柄fileno指定的文件的length字节,并创建mmap对象。 如果length大于文件的当前大小,则文件将扩展为包含length字节。 如果length为0,则映射的最大长度是文件的当前大小,但如果文件为空,则Windows引发异常(您无法在Windows上创建空映射)。
tagname,如果指定而不是None,是一个字符串,给出映射的标记名称。 Windows允许您针对同一文件具有许多不同的映射。 如果指定现有标记的名称,则会打开该标记,否则将创建此名称的新标记。 如果省略此参数或None,则创建没有名称的映射。 避免使用tag参数将有助于保持代码在Unix和Windows之间可移植。
offset可以指定为非负整数偏移量。 mmap引用将相对于文件开头的偏移量。 offset默认为0. offset必须是ALLOCATIONGRANULARITY的倍数。
关于mmap对象
Memory-mapped file objects的行为类似于字符串和文件对象。 然而,与普通的字符串对象不同,这些是可变的。 您可以在大多数需要字符串的地方使用mmap对象; 例如,您可以使用re模块搜索内存映射文件。 由于它们是可变的,您可以通过执行obj [index] =‘a‘来更改单个字符,或者通过分配给切片来更改子字符串:obj [i1:i2] =‘...‘。 您还可以从当前文件位置开始读取和写入数据,并通过seek()搜索文件到不同的位置。
官方文档:https://docs.python.org/zh-cn/2.7/library/mmap.html#module-mmap
class collections.OrderedDict([items])
返回dict子类的实例,支持常用的dict方法。OrderedDict是一个dict,它记住键第一次插入的顺序。如果一个新条目覆盖了一个现有条目,原始插入位置将保持不变。删除条目并重新插入将把它移动到末尾。
关于OrderedDict对象
有序字典就像普通字典一样,但是它们记住条目插入的顺序。当遍历一个有序的字典时,条目将按照它们的键首先被添加的顺序返回。
官方文档:https://docs.python.org/zh-cn/2.7/library/collections.html#collections.OrderedDict
sorted(iterable[, cmp[, key[, reverse]]])
cmp指定一个由两个参数(迭代元素)组成的自定义比较函数,根据第一个参数是小于、等于还是大于第二个参数,该函数应该返回一个负数、零还是正数:cmp=lambda x,y: cmp(x.lower(), y.lower())。默认值是None
key指定一个参数的函数,该函数用于从每个列表元素中提取比较键:key = str.lower。 默认值为None(直接比较元素)。
reverse 为一个布尔值。 如果设为 True,则每个列表元素将按反向顺序比较进行排序。
通常,键和反向转换过程比指定等效的cmp函数要快得多。这是因为cmp对每个列表元素调用多次,而键和反向触摸每个元素仅一次。使用functools。cmp to key()将旧式cmp函数转换为键函数。
官方文档:https://docs.python.org/zh-cn/2.7/library/functions.html#sorted
以上是关于GitHack 源码分析的主要内容,如果未能解决你的问题,请参考以下文章
Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段
Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段
Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段