发一个自己写的抓包软件,支持插件化脚本分析

市场上的抓包工具已经足够多,轻量级的,重量级的都有,典型的wireshark,smartsniff等,

各有优缺点,PowerSniff是为程序员准备的一款抓包工具,目标是使协议解析插件编写更简单。文件格式完全兼容wiareshark和tcpdump。

原理:捕获到数据就调用预设置的脚本,将数据的指针和长度传递给脚本分析,在脚本中也支持调用注册函数。

无需编译,支持即写即用,目前支持c语言和lua两种编程语言作为脚本,安装文件自带一些例子,欢迎测试并提供意见。

链接: http://weiqiba.com/powersniff/PowerSniff-Setup-v0.9.exe

 

一、典型场景

抓包软件运行时(或事后分析),希望对每个数据包使用插件分析,smartsniff直接不支持,而wireshark编写插件成本太大,

需要安装visual studio和相关sdk,不论是插件本身的开发还是调试,都不是一件简单的事。

一些厂商对常见的协议(如rtsp),做了wireshark的插件,但是如果是自己的协议,只能手工分析。

 

PowerSniff是为快速解决数据分析而来,(即便不考虑数据分析,界面和可操作性也比wireshark, smartsniff更友好),

对捕获的网络数据包,即时脚本编写(语法高亮,即时编译,即时运行,也可以直接用编写好的脚本),

目前脚本支持lua和c语言,实测在i7上单核处理简单脚本插件调用,lua每秒1万次,c语言更快。

 

示例:QQ使用UDP协议,服务器端口8000,登录包的第49字节到53字节是qq号,解析并显示这个qq号

int handle_data(const char *protocol, unsigned char *data, int total_len, int data_len)
{unsigned int qq_number = data[49] * 256 * 256 * 256 + data[50] * 256 * 256 + data[51] * 256 + data[52];plugin_summary("debug-%d, qq_number is: %d", __LINE__, qq_number);return 0;
}

将上面代码保存为test1.c,然后再菜单的插件列表里面启用它即可。代码不需要编译,程序内置的TCC引擎会自动compile,然后relocate到当前进程。

等价于将c语言作为脚本,由于代码只在load时编译,所以插件执行速度非常快。(除了c语言支持,另外还支持lua脚本)

 

二、相关界面截图

(1)菜单

 

(2)设置

 

(3)lua编辑器

 

(4)c语言编辑器

 

(5)hex显示界面

 

(6)安装文件列表

 

 

(7)第三方插件xtrace

 

这个软件预计下周单独发布,目前PowerSniff已经集成c++的sdk。

xtrace程序提供了sdk函数xtrace(),可以看成一个printf函数(支持本机和网络),只是它的输出不是stdout,而是xtrace软件。

c++的版本只需要包含一个20k自己的头文件即可,不需要包含lib。另外也支持lua,python,javascript,c#,delphi等语言。

除了printf ,还支持xcounter功能,方便程序性能分析或计数用。(支持本机和网络)

c++最简用法:

#include "xtrace.h"

xtrace(_T("hello, %s, %d\n"), _T("world"), 99999999);

不需要其它任何改动,直接替换vc里面的TRACE宏,或者printf函数。开启xtrace主程序,即可看到相关输出。

 

三、插件编写说明(文件编码必须使用utf8)

程序需要调用的lua接口,参考plugin/demo_lua.lua
(1)init: 插件初始化
(2)handle_data: 当收到一个数据包时调用这个函数,函数return "delete"也可以起到过滤作用
(3)handle_click:当单击列表数据时调用这个函数
(4)handle_double: 当双击列表数据时调用这个函数

lua中增加的可以回调的程序接口:
plugin_output_clear: 清空plugin output窗口
plugin_output: 输出到plugin output窗口
plugin_summary: 输出到listview最右边的Plugin Summary项
trace: 输出到三方工具xtrace
trace_raw: 输出到三方工具xtrace

dbgview:输出到三方工具dbgview.exe

------------------------------------------------------------

c语言自定义函数参考:bin\3rd\libtcc\include\powersniff.h

#ifndef __POWERSNIFF_DEFINE_H_
#define __POWERSNIFF_DEFINE_H_int trace(const char *format, ...);
int TRACE(const char *format, ...);
int xtrace(const char *format, ...);
int XTRACE(const char *format, ...);int trace_raw(int color, const char *format, ...);
int TRACE_RAW(int color, const char *format, ...);
int xtrace_raw(int color, const char *format, ...);
int XTRACE_RAW(int color, const char *format, ...);int dbgview(const char *format, ...);
int DBGView(const char *format, ...);int plugin_output(const char *format, ...);
int PLUGIN_OUTPUT(const char *format, ...);int plugin_output_clear();
int PLUGIN_OUTPUT_CLEAR();int plugin_summary(const char *format, ...);
int PLUGIN_SUMMARY(const char *format, ...);
#endif

 

 

解析qq号的lua脚本:

-- file encode must be UTF8
-- qq号码登录监视脚本(不支持手机号码登录,不支持webqq,只在pc上用qq2015测试通过)
-- 2015.9.14
require "base64"
require "tcp_ip"function init()trace("plugin init:  ".._VERSION.."\n")trace("package path: "..package.path.."\n")trace("package path: "..package.cpath.."\n")--for k,v in pairs(_G) do--    trace(string.format("%s,%s\n", k, v))--end
end-- protocol:    字符串如tcp,udp,icmp
-- data:    二进制数据
-- len_total:    总共数据长度
-- len_data:    有效数据长度(去除各种头之后的数据)
function handle_data(protocol,data,len_total,len_data)if 54 == len_total thenreturn "delete"        -- remove handshakeendsrc_port = tcp_ip_get_src_port(data)dst_port = tcp_ip_get_dst_port(data)-- if 8000 != src_port && 8000 != dst_port thenif (8000 ~= dst_port) or (len_data < 100) thenreturn "delete"endif 2 ~= data:byte(43) then    -- 0x2是qq udp协议magic numberreturn "delete"endif 8 ~= data:byte(46) then    -- 8和37是 0x8和0x25是协议类型,表示登录return "delete"endif 37 ~= data:byte(47) thenreturn "delete"end-- 50, 51, 52, 53字节是qq号(lua index从1开始而不是0)qq_number = data:byte(50) * 256 * 256 * 256 + data:byte(51) * 256 * 256 + data:byte(52) * 256 + data:byte(53)plugin_summary("qq_number is: " .. qq_number)
endfunction handle_click(protocol,data,len_total,len_data)if 54 == len_total thenreturnendsrc_port = tcp_ip_get_src_port(data)dst_port = tcp_ip_get_dst_port(data)-- if 8000 != src_port && 8000 != dst_port thenif (8000 ~= dst_port) or (len_data < 100) thenreturnendif 2 ~= data:byte(43) then    -- 0x2是qq udp协议magic numberreturn endif 8 ~= data:byte(46) then    -- 8和37是 0x8和0x25是协议类型,表示登录returnendif 37 ~= data:byte(47) thenreturnend-- 50, 51, 52, 53字节是qq号(lua index从1开始而不是0)qq_number = data:byte(50) * 256 * 256 * 256 + data:byte(51) * 256 * 256 + data:byte(52) * 256 + data:byte(53)plugin_output_clear()plugin_output("qq_number is: " .. qq_number.."\n")
endfunction handle_double(protocol,data,len_total,len_data)handle_data(protocol,data,len_total,len_data)
end

解析qq号的c脚本:

// file encode must be UTF8
// sdk function:
// init()        
// handle_data()    
// handle_click()    
// handle_double()
// all data lock at background, you can use pointer any case,  but need ATTENTION also.
// out of memory or invalid pointer may crash the full virutal machine, or cause application fetal error.
// the follow thread .h file should include!
#include <winapi\windows.h>
#include <winapi\wingdi.h>
#include <powersniff.h>void init()
{trace_raw(RGB(255, 0, 0), "do init here\n");
}// if return -1, the packet will be deleted!
int handle_data(const char *protocol, unsigned char *data, int total_len, int data_len)
{if(0 != strcmp("udp", protocol)) {return -1;        // filter
    }if(data_len < 100) {return -1;        // filter
    }short src_port = data[34] * 256 + data[35];short dst_port = data[36] * 256 + data[37];if(8000 != dst_port)return -1;if(2 != data[42])        // 0x2是qq udp协议magic numberreturn -1;if(8 != data[45])        // 8和37是 0x8和0x25是协议类型,表示登录return -1;if(37 != data[46])return -1;unsigned int qq_number = data[49] * 256 * 256 * 256 + data[50] * 256 * 256 + data[51] * 256 + data[52];plugin_summary("debug-%d, qq_number is: %d", __LINE__, qq_number);plugin_output_clear();plugin_output("debug-%d, qq_number is: %d\n", __LINE__, qq_number);trace("debug-%d, qq_number is: %d\n", __LINE__, qq_number);return 0;
}// fixed return 0
int handle_click(const char *protocol, unsigned char *data, int total_len, int data_len)
{trace_raw(RGB(0, 0, 255), "blue output\n");return 0;
}// fixed return 0
int handle_double(const char *protocol, unsigned char *data, int total_len, int data_len)
{trace("default color output\n");trace_raw(RGB(0, 0, 255), "blue output\n");dbgview("output to debugview.exe\n");plugin_summary("hello1: %d", 123);plugin_output_clear();plugin_output("hello2: %d", 123);plugin_output_clear();plugin_output("hello3: %d\n", 456);plugin_output("hello4: %d\n", 789);return 0;
}void *my_memcpy(void * to, const void * from, int n)
{
int d0, d1, d2;
__asm__ __volatile__("rep ; movsl\n\t""testb $2,%b4\n\t""je 1f\n\t""movsw\n""1:\ttestb $1,%b4\n\t""je 2f\n\t""movsb\n""2:": "=&c" (d0), "=&D" (d1), "=&S" (d2):"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from): "memory");
return (to);
}

 

 

四、其它抓包工具

重量级抓包工具:
wireshark(推荐);科来网络分析软件;ominipeek;etherpeek;Charles;(经过各种测试,还是wireshark最好用)

轻量级抓包工具:
smartsniff:只有230KB(推荐);minisniff:只有45KB(2006年停止维护);powersniff:2.3M(包含若干个第三方插件)

 

五、闭源。非商业使用无限制。收到BUG会解决(反馈qq群466507719)。无其它技术支持。

付费封闭协议分析及定制脚本。目前只支持ipv4(tcp,udp,icmp),已对pcap数十个样本测试,如需要其它协议可以定制。

 

六、借地找个工作,地点武汉光谷~~~

目标嵌入式,c++,服务器端开发,移动端或web开发等软件工作;也可以偏管理;

简历如下:resume

对web开发较有兴趣,熟练的同学可以技能交换

(只收3year+的同学,不闲聊,武汉光谷有定期线下交流,最好能提供一份带详细项目经验的简历,qq:80101277)

 

拥剑,中南民族大学附近2018.10.12

 

转载于:https://www.cnblogs.com/wjx0912/p/9772931.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dropload.js无限刷新解决方案

1、检查Ajax是否设置了同步&#xff0c;将async设置为false&#xff0c;默认为true&#xff08;异步&#xff09; 2.检查是否进入了ajax的error方法&#xff0c;如果进入了error方法&#xff0c;按照官方给的demo&#xff0c;肯定会无限循环,所以在error方法加一句debugger进行…

javaWeb项目部署至tomcat下classes文件夹没有内容

解决方法&#xff1a;项目右键------Java Build Path----------Source 将Default output folder改成/src/main/webapp/WEB-INF/classes就可以了&#xff01;

第二次考核

https://gitee.com/sfr123/the_second_assessment/tree/master/SFR 7-1 学生类-构造函数 定义一个有关学生的Student类&#xff0c;内含类成员变量&#xff1a; String name、String sex、int age&#xff0c;所有的变量必须为私有(private)。 1.编写有参构造函数&#xff1a;…

马昕璐201771010118《面向对象程序设计(java)》第七周学习总结

第一部分&#xff1a;理论知识学习部分 Java用于控制可见性的4个访问权限修饰符&#xff1a; 1.private&#xff08;只有该类可以访问&#xff09; 2.protected&#xff08;该类及其子类的成员可以访问&#xff0c;同一个包中的类也可访问&#xff09; 3.public&#xff08;该类…

青蛙跳台阶算法

一、问题描述&#xff1a;一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳上一个n级的台阶总共需要多少种跳法。 思路&#xff1a;首先考虑n等于0、1、2时的特殊情况&#xff0c;f(0) 0 f(1) 1 f(2) 2 其次&#xff0c;当n3时&#xff0c;青蛙的第一跳…

router+x

vue-router官方的路由管理器 包含的功能&#xff1a; ——绑定方法进行跳转 路由嵌套 写的不一样搜索的路由路径也不一样 二级路由 设置默认路由 导航守卫&#xff1a; 用于强制跳转或者取消的方式守卫导航。 例如&#xff1a;未登录页面的时候&#xff0c;不允许用户跳转到其他…

mybatis查询返回空,SQL数据库执行有数据!

我的数据库为Oracle&#xff0c;可以插入&#xff0c;更新&#xff0c;但在在Mybatis中执行SQL查询返回的数据发现返回NULL&#xff0c;但是生成SQL放在数据库中查询是有数据的&#xff0c;并且SQL是正确的&#xff01; 这是没有改动的XML: <select id"findAllByParen…

java EE : tomacat 基础

tomacat 目录结构 conf 配置文件 server.xml 转载于:https://www.cnblogs.com/Lumia1020/p/9802850.html

接口测试实例(jmeter)

Jmeter 安装说明 https://jingyan.baidu.com/article/acf728fd68e7bef8e510a3cb.html 1.从Apache Jmeter官网下载的版本&#xff08;需要Java版本是Java 8或以上&#xff09; 2.添加环境变量&#xff1a;jmeter的文件路径3.打开\bin\jmeter.bat&#xff0c;即可使用接口测试的一…

[HAOI2009]毛毛虫

题意描述 思路 [HAOI2009]毛毛虫树形DP最大毛毛虫可以看做以一个节点为根求它子树中节点及直接相邻节点个数最多的两条链用con[now]数组表示i的子树中跟i直接相连的点的个数(代码中的con[now]包括now自身)假设 树根now6,如图黄色部分 用num[now]表示以now为根的子树的链上及直接…

mysql触发器不起作用 navicat的bug?

如果想插入数据,先设置主键,再依次设置其他属性值的时候&#xff0c;在你输入完主键&#xff0c;navicat执行insert操作 当你输入其他的时候&#xff0c;语句就变成了update&#xff0c;当然这期间没有点保存。所以写的触发器就一直失效。这是一个插入后生效的触发器。(因为一…

windows环境下nginx的入门配置跳转tomcat

大家好&#xff0c;我是烤鸭&#xff1a;windows下配置nginx的目的就是要本地跟线上环境尽量保持一致。1. 下载官网下载地址 http://nginx.org/en/download.html我这里用的是nginx-1.13.0&#xff0c;看一下目录结构2. nginx关闭脚本 这里的nginx-killer就…

2018java基础面试题(我自己用的,面试好多家公司基本会问到的问题和技术)

1&#xff0c;webservice是什么&#xff1f; webservice是一种跨编程语言和跨操作系统的远程调用技术,遵循SOPA/WSDL规范。 2&#xff0c;springCloud是什么&#xff1f; springcloud是一个微服务框架&#xff0c;并提供全套分布式系统解决方案。支持配置管理&#xff0c;熔断机…

[css] 如果给一个元素设置background-color,它的颜色会填充哪些区域呢?

[css] 如果给一个元素设置background-color,它的颜色会填充哪些区域呢&#xff1f; 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

linux安装elasticsearch5.5

大家好&#xff0c;我是烤鸭: 我是采用官网下载tar包的方式安装的。 安装环境&#xff1a;centos 7.2,jdk1.8 下载地址: https://www.elastic.co/downloads/elasticsearch 1.解压缩&#xff1a; 解压 elasticsearch.5.5.2.tar.gz tar -zxvf elasticsearch-5.2.2.tar.gz2.创…

linux部署jenkins,tomcat9

大家好&#xff0c;我是烤鸭&#xff1a;今天分享的是 linux部署jenkins,tomcat9 安装环境&#xff1a;linux centos7.2tomcat 9.1Jenkins 2.73JDK 1.8maven 3.5git 2.91. 下载jenkins&#xff1a;https://jenkins.io/download/ 我选择的war下载。2. 安装…

jeesite的junit,数据没有插入?

jeesite框架自带的test方法 在common/test/SpringTransactionalContextTests.class 说一下遇到的问题。 sql执行成功了,但是数据库没有数据。what&#xff1f;&#xff1f;&#xff1f; 第一时间就想到了是事务的问题&#xff0c;事务没有提交。 RunWith(SpringJUnit4Class…

JAVA实现美团电影价格抓取(附代码)

各位老大好&#xff0c;我是烤鸭&#xff1a; 最近在研究爬虫,看到有意思的是美团的电影票价&#xff0c;普通的抓取是抓不到的。例如网址&#xff1a;http://bj.meituan.com/shop/105355906?mtt1.movie/cinemalist.0.0.j8oaf2un&#xff08;当你打开403或者404的话&#xff0…

使用jieba和wordcloud进行中文分词并生成《悲伤逆流成河》词云

因为词云有利于体现文本信息&#xff0c;所以我就将那天无聊时爬取的《悲伤逆流成河》的评论处理了一下&#xff0c;生成了词云。 关于爬取影评的爬虫大概长这个样子(实际上是没有爬完的): #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2018/10/15 16:34 # Auth…