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社工库数据扫描程序的更多相关文章

  1. python 模拟ajax查询社工库...

    在windows中使用,输入有关信息查询社工库,本来是网页版的,我把ajax请求提取出来.粗略的封装下,挺好玩. #coding:utf8 import urllib2,urllib from Bea ...

  2. 应用安全 - 社工 - 大数据 - Fofa - 汇总

    搜索语法 title=”abc”   header=”abc”  body=”abc”  domain=”xx.com”  host=”.xx.cn”  port=”443”     ip=”1.1. ...

  3. 社工数据搜索引擎搭建 - Build Social Engineer Evildata Search Engine

    如何设计搭建一个社工库 从初起设计一个社工库,到现在的Beta,前前后后零零整整花了不下一个月的时间,林林总总记录下来,留给需要之人 泄露数据库格式不一,长相奇葩,因需将用户名.密码.邮箱.哈希等信息 ...

  4. Bugku-CTF社工篇之简单的个人信息收集

  5. bugku社工writeup

    最近bugku的web和杂项刷了多半,突然心血来潮想试试社工题,bugku的社工题比较基础,而且题量不多,和大家分享一下writeup. 1.密码 根据提示,多猜几次密码就对了,然后得到flag. 2 ...

  6. 12种开源Web安全扫描程序

    转自:https://blog.csdn.net/wh211212/article/details/78620963 赛门铁克的一个有趣的报告显示,76%的被扫描网站有恶意软件 如果您使用的是Word ...

  7. 我是如何社工TDbank获取朋友隐私的

    原创 ziwen@beebeeto 转载请保留本行 个人感觉 国外的安全方面对社工的了解和防范并不是很好 即使他们使用社工的时间比我们要长很多 比如 他们的visa在pos机上使用是不需要密码的 而且 ...

  8. 基本完成了一个SEGY扫描程序

    利用Seismic.NET编写了一个SEG-Y文件的扫描程序,可以自动判断道头字中主测线号.横测线号.X坐标和Y坐标的位置,自动快速扫描地震数据体中的拐点坐标.10GB多的数据体几十秒全部扫描完成! ...

  9. 基于 libpcap库的sniffer程序

    基于 libpcap库的sniffer程序 Libpcap库是WireSharek和Tcpdump抓包程序的基础,利用libcap我们自己也可以实现自己的抓包程序,在网络上实时抓包分析,或者利用处理的 ...

随机推荐

  1. connect函数详解

    不得不说,客户端的connect函数和服务端的accept函数是一对好基友,如果客户端没有去connect, 那么服务端的accept会一直在那里傻傻地痴痴地等待,我们先来看看connect函数的原型 ...

  2. Visual C#编写3D游戏框架示例

    你可能对实际地编写游戏代码期待已久了.由于DirectX SDK 2004年夏季更新包含了一个牢固的示例框架组件,并且它被设计成能在你自己的代码中直接使用,同时还为你处理了很多事务,所以你只要简单的使 ...

  3. 一个因为粗心的Bug

    /** * 数据绑定,分页显示 */ private void updataMenu(final EditText search) { if(listwz==null) { return; } pag ...

  4. python socket编程详细介绍

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

  5. VS2010下配置使用OpenGL的glut库

    我已在我机上测试成功,机装VS2010! 在win7(windows7 ultimate SP1)下成功安装VS2010(Visual Studio 2010 ultimate x86). 下载glu ...

  6. iOS 自定义控件开发(中)

    <iOS 自定义控件开发(上)> <iOS 自定义控件开发(中)> 接上篇iOS自定义控件开发之后,我们尝试另外一种. 在Xcode的右边,会看到如下的图 其中,上面有一个:C ...

  7. AngularJs-指令和控制器交互

    前言: 前段时间我们学习了angular的指令,他通过ECMA的方式创建元素,可以让我们共用这些元素,我们也知道可以通过 link的方法给这个指令添加一些动作事件,本节,我们将写入和让angular的 ...

  8. C#的默认访问修饰符

    Classes and structs that are not nested within other classes or structs can be either public or inte ...

  9. 每天一个linux命令(8):cat 命令

    cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件] ...

  10. Codeforces Round #379 (Div. 2) D. Anton and Chess 模拟

    题目链接: http://codeforces.com/contest/734/problem/D D. Anton and Chess time limit per test4 secondsmem ...