/* * XssScan.cs,雲舒,070704下午 */ using System; using System.Threading; using System.Collections; using System.Collections.Generic; using System.Text; using Winista.Text.HtmlParser; using Winista.Text.HtmlParser.Data; namespace Ph4nt0m.XssScan { public class XssScan { public static string domain; public static Hashtable url_hash; public static string[] excempt_file; public static Int32 max_thread = 10; public static Int32 current_thread = 0; public static Int32 time_out; public static Queue pre_url; public static int Main(string[] args) { string base_url; // 檢查參數個數 if ( args.Length != 2 ) { Console.WriteLine( "Usage: XssScan.exe <url> <sleep>" ); return -1; } base_url = args[0]; time_out = Int32.Parse(args[1]); url_hash = new Hashtable(); pre_url = new Queue(100); // 不進行分析的檔案 excempt_file = new string[] { ".exe", ".rar", ".zip", ".tar", ".gz", ".pdf", ".swf", ".jpg", ".png", ".gif", ".bmp", ".mp3", ".mp4", ".rm", ".rmvb", ".smil", ".wma", ".pl", ".c", ".cpp" }; // 處理url,方便下面截取基地址 if (base_url.StartsWith("http://"))/ { base_url = base_url.Substring(7); } if (base_url.EndsWith("/") ) { base_url = base_url.TrimEnd('/'); } else if (base_url.EndsWith("\")) { base_url = base_url.TrimEnd('\'); } // 按照/字元分割url,擷取網域名稱. // 網域名稱取得較長,若包含目錄,則可以防止抓取到上層目錄,此處包含了純網域名稱後面的目錄 if (base_url.IndexOf('/') == -1) { domain = base_url; } else { string[] domains = base_url.Split('/'); // 是檔案還是目錄 if (domains[domains.Length - 1].IndexOf('.') != -1) { Int32 pos = base_url.LastIndexOf('/'); domain = base_url.Substring(0, pos); } else { domain = base_url; } } base_url = "http://"/ + base_url; domain = "http://"/ + domain; //Console.WriteLine("base_url: ", base_url); //Console.WriteLine( "domain: ", domain); // 將基URL加入到隊列並開始抓取 //pre_url.Enqueue(base_url); Ph4nt0m.XssScan.Parser parser_base = new Ph4nt0m.XssScan.Parser(base_url); parser_base.GetLinksFromUrl(); while ( true ) { // 沒有活動線程且隊列為空白,則說明抓取完成 if ( current_thread == 0 && pre_url.Count == 0 ) { break; } // 隊列為空白但是有活動線程則主線程休眠,然後再次判斷條件 if (pre_url.Count == 0) { Thread.Sleep(100); continue; } // 隊列線程均不為空白,或隊列不空線程為空白,判斷線程數量並決定是否開啟新線程抓取 if (current_thread < max_thread) { string current_url = (string)pre_url.Dequeue(); Ph4nt0m.XssScan.Parser parser = new Ph4nt0m.XssScan.Parser(current_url); Thread work_thread = new Thread(new ThreadStart(parser.GetLinksFromUrl)); work_thread.Start(); } else { Console.WriteLine("休眠主線程,當前線程數量為: ", current_thread); } Thread.Sleep(time_out); } Console.WriteLine("All done.\nThere are links:", url_hash.Count); foreach (string key in url_hash.Keys) { //Console.WriteLine(key); } return 0; } } } |