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. IT客学院《构建高转化率的着陆页-PS+HTML+网络营销》共25节【价值199元】无水印版

    课程简介本课程是全网独家专业的着陆页课程,课程完整的再现了整个着陆页实战案例的开发过程,包括:策划.设计和实现.上线后的推广.优化及提高转化率的技巧等,本套课程能帮助您迅速掌握着陆页的能力,迅速洞察完 ...

  2. [Android] 【视频】黑马安卓62、66期等教程+源码

     下载地址:http://fu83.cn/thread-58-1-1.html

  3. python数字图像处理(11):图像自动阈值分割

    图像阈值分割是一种广泛应用的分割技术,利用图像中要提取的目标区域与其背景在灰度特性上的差异,把图像看作具有不同灰度级的两类区域(目标区域和背景区域)的组合,选取一个比较合理的阈值,以确定图像中每个像素 ...

  4. Eclipse系列: Eclipse设置Tomcat启动超时时间

    在eclipse的workspace目录下,找到如下文件: .metadata\.plugins\org.eclipse.wst.server.core\servers.xml 如下图所示,然后将它修 ...

  5. 实践GDB

    调试工具简介:GDB  Unix程序员最常用的调试工具是GDB,这是由Richard Stallman(开源软件运动的领路人) 开发的GNU项目调试器,该工具在Linux开发中扮演了关键的角色. CG ...

  6. 测试技能积木-AWK的简要用法

    做测试工作,经常要分析日志,有的时候活儿还很脏很累,比如抽取符合某些pattern的行,重新格式化等等.有的时候,我们需要也创造一些测试用数据文件.基于上述两种原因,在Unix Like 系统上,一些 ...

  7. canvas粒子demo

    之前在codepen上看到了类似的效果,于是自己也使用coffee-script写了个相似的demo 效果:http://whxaxes.github.io/canvas-test/src/Parti ...

  8. windows API 开发飞机订票系统 图形化界面 (三)

    来吧,接下来是各个功能的函数的实现代码. 首先,程序运行时加载读入账户信息和航班信息.接下来就该读取文件了. 我把账户资料和航班信息储存在了.txt文件里 那么问题就来了,挖掘机...额,不对,应该怎 ...

  9. Bootstrap3.0学习第二十三轮(JavaScript插件——警告框)

    详情请查看http://aehyok.com/Blog/Detail/29.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  10. 第三十九课:requestAnimationFrame详解

    大家应该都知道,如果一个页面运行的定时器很多,无论你怎么优化,最后肯定会超过指定时间才能完成动画.定时器越多,延时越严重. 为此,YUI,kissy等采用中央队列的方式,将定时器减少至一个.浏览器厂商 ...