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我们自己也可以实现自己的抓包程序,在网络上实时抓包分析,或者利用处理的 ...
随机推荐
- C语言学习的记忆
优于他人的技能 会玩双截棍: 我的经验就是Practice make perfect,熟能生巧:还有就是坚持不懈. 关于C语言的学习的回忆 1.我通过老师的教导和课外C语言书籍中学习,和我的技能相比, ...
- iOS开发UI篇—popoverController简单介绍(ipad)
一.简单介绍 1.什么是UIPopoverController 是iPad开发中常见的一种控制器(在iPhone上不允许使用) 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIVi ...
- Vs2012 中使用itoa
自己在写程序的时候经常用到保存大量的图片,从而对其编号,所以要把整型转换成字符型. 通常自己定义string,而字符使用char[],把整形转换成char类型,然后和string类型相加,但是在VS2 ...
- php模式设计之 工厂模式
承接上篇php模式设计之 单例模式,(虽然好像关系不大).今天讲述第二种基础的模式设计——工厂模式. 那么何为工厂模式? 从名字来看,似乎看不出什么端倪.工厂模式,和生产有关?还是和生产流程有关?难道 ...
- 我为什么期待M#?
前段时间的报导"微软将推新编程语言M#:系统编程级别的C#",第一眼看到并没有当初看到F#的那一种不安,反而感到欣喜,业界一直存在"语言论"讨论c#.java. ...
- windows 7 + vs2010 sp1编译 x64位版qt4
由于qt官方没有发布预编译的64位版qt4,要使用64位版qt4,只能自己编译,编译过程如下: 1,下载源码并解压到D:\qt-src\qt-everywhere-opensource-src-4.8 ...
- 在C#中使用官方驱动操作MongoDB ---转载
http://blog.csdn.net/dannywj1371/article/details/7440916
- 第四次个人作业——关于微软必应词典android客户端的案例分析
[前言] 第一次搞测评这种东西,如果有什么疏漏,请多多谅解.测评内容如题. 第一部分 调研,评测 评测:(设备:Lenovo A806) 软件的bug,功能评测,黑箱测试 bug等级划分方式 5级分类 ...
- XMLHttpRequest的POST中文表单问题解决方案
XMLHttpRequest的POST中文表单问题解决方案 由于XMLHttpRequest POST的内容是用UTF-8编码,所以在服务端要先把request的编码改为UTF-8. 而且客户端pos ...
- nginx 的启动脚本
下载路径为: wget -q http://www.dwhd.org/script/Nginx-init-CentOS 根据自己的实际环境修改相应的参数 把该脚本放到/etc/rc.d/init.d/ ...