WhatWeb是一款非常著名的指纹扫描器,在平时渗透测试用的也比较多。从这一篇开始,陆陆续续来分析它的源码,领会其中精髓。写这篇博客的当下,我对ruby并不熟悉,所以开篇就一边看着源码一遍熟悉ruby语法吧。
开始看whatweb这个文件的源码熟悉语法:
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless$:.include?(File.dirname(__FILE__)) || $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))$LOAD_PATH << "/usr/share/whatweb/"
$LOAD_PATH是Ruby读取外部文件的一个环境变量,返回值是一个路径的数组。Ruby会在这个环境变量的路径中读取需要的require文件,如果在环境变量中找不到自己想要的文件,就会报LoadError错误。$LOAD_PATH和$:指的都是同一个环境变量。$LOAD_PATH.unshift是把括号里面得到的路径加到现在已经存在所有环境变量之前。<<会把后续给定对象附加到数组的末尾。里面涉及的文件操作就不在这里描述了。
if RUBY_VERSION =~ /^1\.9/
require 'digest/md5'
require 'lib/extend-http_ruby1.9.rb'
看一下这个=~符号是将字符串与正则表达式进行匹配。如果匹配成功,返回匹配子串在字符串中的偏移,如果不成功返回nil。
gems = %w|json mongo rchardet |gems.each do |thisgem|
begin
require 'rubygems' # rubygems is optionalif gem_available?(thisgem) #require thisgem
else
end
rescue LoadError# that failed.. no big deal