golang社工库数据扫描程序
https://github.com/xiaojiong/scanfile
演示站点: http://www.weigongkai.com/ 7G数据 2s完成扫描
package scanfile /* #include <stdio.h> #include <stdlib.h> #include <string.h> int IndexStr(char *haystack, char *needle,unsigned int begin) { char *p = strstr(haystack+begin, needle); if (p) return p - haystack; return -1; } int IndexChar(char *haystack, char c,unsigned int begin) { char *p = haystack = haystack + begin; while(*p != '') { if(*p == c) { return p - haystack; } ++p; } return -1; } int LastIndexChar(char *haystack, char c,unsigned int begin) { int len = strlen(haystack); if(begin > 0) { if (begin > len) { return -1; } } else { begin = len - 1; } haystack +=begin; while(1) { if(*haystack == c) { return begin; } if(begin == 0) { return -1; } --haystack; --begin; } return -1; } */ import"C" import"unsafe" func strScan(str *string, key *string, counter *Counter) []string { begin := 0 CStr := C.CString(*str) Ckey := C.CString(*key) defer func() { C.free(unsafe.Pointer(CStr)) C.free(unsafe.Pointer(Ckey)) }() var res []string for { var index int = 0 if index = int(C.IndexStr(CStr, Ckey, C.uint(begin))); index == -1 { break } var startIndex int = 0 if index > 0 { if pos := int(C.LastIndexChar(CStr, 'n', C.uint(index))); pos != -1 { startIndex = pos + 1 } } var endIndex int = len(*str) if pos := int(C.IndexChar(CStr, 'n', C.uint(index))); pos != -1 { endIndex = pos + index } begin = endIndex if counter.IsMax() { break } res = append(res, (*str)[startIndex:endIndex]) counter.Add() if begin == len(*str) { break } } return res }
package scanfile import ( "io" "os" "sync" ) var LineFeed = byte('n') //文本换行符标识 var BufSize = 1024 * 1024 // buf大小 func Scan(files []string, searchStr *string) string { var result ScanResult //计数器 counter := InitCounter(10) //扫描结果输出通道 out := make(chan *FileRes, 10) fileCount := len(files) for i := 0; i < fileCount; i++ { go ScanFile(files[i], searchStr, counter, out) } for i := 0; i < fileCount; i++ { result.AddFileRes(<-out) } result.AddCounter(counter) return result.ToJson() } func ScanFile(fileName string, searchStr *string, counter *Counter, out chan *FileRes) { //文件 IO fileContentChan := fileRead(fileName, counter) fileRes := InitFileRes(fileName) //使用多路复用 wg防止线程泄漏 wg := sync.WaitGroup{} for i := 0; i < 3; i++ { wg.Add(1) go func() { for { if text, ok := <-fileContentChan; ok { if counter.IsMax() { //清空未读取channel clearFileContentChan(fileContentChan) break } else { if counter.IsMax() { break } rs := strScan(text, searchStr, counter) for i := 0; i < len(rs); i++ { fileRes.Add(rs[i]) } } } else { break } } wg.Done() }() } wg.Wait() out <- fileRes } func clearFileContentChan(c chan *string) { for { if _, ok := <-c; ok == false { break } } } func fileRead(fileName string, counter *Counter) chan *string { fileContentChan := make(chan *string, 5) go func() { fh, err := os.Open(fileName) if err != nil { panic(err) } //异常处理 defer fh.Close() buf := make([]byte, BufSize) var start int64 fh.Seek(start, 0) for { //超过计数器最大返回值 跳出程序 if counter.IsMax() { break } n, err := fh.Read(buf) if err != nil && err != io.EOF { panic(err) } if n == 0 { break } l := lastByteIndex(buf, LineFeed) content := string(buf[0 : l+1]) start += int64(l + 1) fh.Seek(start, 0) fileContentChan <- &content } close(fileContentChan) }() return fileContentChan } func lastByteIndex(s []byte, sep byte) int { for i := len(s) - 1; i >= 0; i-- { if s[i] == sep { return i } } return -1 }
golang社工库数据扫描程序的更多相关文章
- python 模拟ajax查询社工库...
在windows中使用,输入有关信息查询社工库,本来是网页版的,我把ajax请求提取出来.粗略的封装下,挺好玩. #coding:utf8 import urllib2,urllib from Bea ...
- 应用安全 - 社工 - 大数据 - Fofa - 汇总
搜索语法 title=”abc” header=”abc” body=”abc” domain=”xx.com” host=”.xx.cn” port=”443” ip=”1.1. ...
- 社工数据搜索引擎搭建 - Build Social Engineer Evildata Search Engine
如何设计搭建一个社工库 从初起设计一个社工库,到现在的Beta,前前后后零零整整花了不下一个月的时间,林林总总记录下来,留给需要之人 泄露数据库格式不一,长相奇葩,因需将用户名.密码.邮箱.哈希等信息 ...
- Bugku-CTF社工篇之简单的个人信息收集
- bugku社工writeup
最近bugku的web和杂项刷了多半,突然心血来潮想试试社工题,bugku的社工题比较基础,而且题量不多,和大家分享一下writeup. 1.密码 根据提示,多猜几次密码就对了,然后得到flag. 2 ...
- 12种开源Web安全扫描程序
转自:https://blog.csdn.net/wh211212/article/details/78620963 赛门铁克的一个有趣的报告显示,76%的被扫描网站有恶意软件 如果您使用的是Word ...
- 我是如何社工TDbank获取朋友隐私的
原创 ziwen@beebeeto 转载请保留本行 个人感觉 国外的安全方面对社工的了解和防范并不是很好 即使他们使用社工的时间比我们要长很多 比如 他们的visa在pos机上使用是不需要密码的 而且 ...
- 基本完成了一个SEGY扫描程序
利用Seismic.NET编写了一个SEG-Y文件的扫描程序,可以自动判断道头字中主测线号.横测线号.X坐标和Y坐标的位置,自动快速扫描地震数据体中的拐点坐标.10GB多的数据体几十秒全部扫描完成! ...
- 基于 libpcap库的sniffer程序
基于 libpcap库的sniffer程序 Libpcap库是WireSharek和Tcpdump抓包程序的基础,利用libcap我们自己也可以实现自己的抓包程序,在网络上实时抓包分析,或者利用处理的 ...
随机推荐
- windows 80端口被占用
首先关了iis服务,或者把端口换了. 然后关了SQLServer Reporting Service. http://www.2cto.com/os/201505/399603.html
- C# 利用QRCode生成二维码图片
网上生成二维码的组件是真多,可是真正好用的,并且生成速度很快的没几个,QRCode就是我在众多中找到的,它的生成速度快.但是网上关于它的使用说明,真的太少了,大都是千篇一律的复制粘贴.这是本要用它做了 ...
- 使用WITH AS提高性能简化嵌套SQL(转)
http://www.cnblogs.com/fygh/archive/2011/08/31/2160266.html 一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery ...
- 安装Ubuntu 16.04后要做的事
Ubuntu 16.04发布了,带来了很多新特性,同样也依然带着很多不习惯的东西,所以装完系统后还要进行一系列的优化. 1.删除libreoffice libreoffice虽然是开源的,但是Java ...
- [CareerCup] 4.6 Find Next Node in a BST 寻找二叉搜索树中下一个节点
4.6 Write an algorithm to find the'next'node (i.e., in-order successor) of a given node in a binary ...
- 区间dp的典例
区间dp, 属于dp的一种,顾名思义,便是对区间处理的dp,其中石子归并,括号匹配,整数划分最为典型. (1)石子归并 dp三要素:阶段,状态,决策. 首先我们从第i堆石子到第j堆石子合并所花费的最小 ...
- 20145222黄亚奇《Java程序设计》实验五实验报告
20145222 <Java程序设计>实验五实验报告 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 本次实验我的结对编程对象是20 ...
- C# 无法识别的转义序列
解决这个问题头两种方法:1.加个"\"进行转义:2.在前面加个@ 示例:我要进入D盘下video文件夹中的ysxs文件夹,写法分别为: D:\\video\\ysxs @" ...
- Scala 中的函数式编程基础(二)
主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ...
- GridView的常规用法
GridView控件在Asp.net中相当常用,以下是控件的解释,有些是常用的,有些是偶尔用到的,查找.使用.记录,仅此而已.(最后附带DropDownList控件) ASP.NET中GridView ...