Python自己认为已经学习的差不多了,是时候尝试其他语言了,首选就是golang,跨平台和原生的并发支持吸引到了我。当然,最开始学习golang的时候,一些语法什么和python大相径庭,让我吃屎一样难受,最开始学习python的时候也是吃屎一样难受。就这样学习了几天,直至写出了我的第一个golang程序,才感受到了golang的美好~
goWhatweb
初步想法是用go重写cms识别来替换在线cms识别网站的内核。在线cms识别其实已经很稳定了,但是一些指纹的版本比较老,一些算法的优化还是不到位,所以就期待用go重写一下来解决这些问题。
第一个Golang程序
这个程序只是解决了指纹在导入过程中,转换为golang识别的数据结构,然后通过算法得出最佳的排列方式。流程类似这样:
// 原始cms样式: //{ // "gowinsoft_jw": [{ // "path": "/web/web/web/images/4bt1.jpg", // "option": "md5", // "content": "ef1ee9c8708cde1bd25a90054de85690" //}, { // "path": "/web/web/web/images/4_13.jpg", // "option": "md5", // "content": "577c2578f9df10fefe7aa62df1e125ae" //}, { // "path": "/images/wtop.gif", // "option": "md5", // "content": "8f054dfdc67125dc96b209d928de0b9d" //}], //"万博网站管理系统": [{ //"path": "/system/Images/Login_Bottom.jpg", //"option": "md5", //"content": "9e88927b8895f2798c2de99e028f6b98" //}], //"maticsoftsns": [{ //"path": "/msgbox/images/gb_tip_layer.png", //"option": "md5", //"content": "c8cb16e8b61bc549ebd339858e66fa5c" //}, { //"path": "/admin/images/txt_bg2.gif", //"option": "md5", //"content": "ef572c58513148310268e492fb0276ed" //}, { //"path": "/admin/js/msgbox/images/loading.gif", //"option": "md5", //"content": "20ac34e039a3224281a38e9222137815" //}], //"klemanndesign": [{ //"path": "/script/lightbox2.4/scriptaculous.js", //"option": "md5", //"content": "THE SOFTWARE IS PROVIDED \"AS IS\"" //}, { //"path": "/themes/lightbox/closelabel.gif", //"option": "md5", //"content": "0e5462b0b4f00432eac4b33d5fa31c5a" //}], // 将指纹按照访问路径排序,并且用访问路径来识别 //{ // "/":{singcms{},singcms{},}, // "/robots.txt":{singcms{},singcms{},}, //} // 在生成一个数组,用于排序 //{ // "/":100, // "/robots.txt":99 //} // 筛选出排序优先级,根据优先级的路径来访问地址
源代码如下:
package main import ( "encoding/json" "fmt" "io/ioutil" "sort" ) type singcms struct { Path string Option string Content string Name string } type Pair struct { Path string length int } // A slice of Pairs that implements sort.Interface to sort by Value. type PairList []Pair func (p PairList) Swap(i, j int) { p[i], p[j] = p[j], p[i] } func (p PairList) Len() int { return len(p) } func (p PairList) Less(i, j int) bool { return p[i].length > p[j].length } func sortMapByValue(m map[string]int) PairList { p := make(PairList, len(m)) i := 0 for k, v := range m { p[i] = Pair{k, v} i++ } sort.Sort(p) return p } func main() { s, err :=ioutil.ReadFile("cms.json") if(err != nil){ panic(err) } var f map[string][]singcms err = json.Unmarshal(s, &f) webdata:=make(map[string][]singcms) for k,v := range f{ //_,ok := webdata[k] // //if(!ok){ // webdata[k] = make([]singcms,len(v)) //} // for _,data := range v{ path:=data.Path _,ok := webdata[path] if(!ok){ webdata[path] = make([]singcms,0) } data.Name = k webdata[path] = append(webdata[path],data) } } sortdata := make(map[string]int) for k,v := range webdata{ sortdata[k] = len(v) } fmt.Println(sortMapByValue(sortdata)) }
End
当然这并不是我认为的最好的cms识别方式,之前有篇文章我构想通过“决策树”来识别,我觉得这才是快速识别的关键,但是场景可能不同吧,现在收集到的指纹数量才1800+,实际访问路径大约1600(好像也挺高了。。),总之基于决策树查询的话每个指纹的制作会比较复杂和繁琐…
发表评论