市場上的抓包工具已經足夠多,輕量級的,重量級的都有,典型的wireshark,smartsniff等,javascript
各有優缺點,PowerSniff是爲程序員準備的一款抓包工具,目標是使協議解析插件編寫更簡單。文件格式徹底兼容wiareshark和tcpdump。html
原理:捕獲到數據就調用預設置的腳本,將數據的指針和長度傳遞給腳本分析,在腳本中也支持調用註冊函數。java
無需編譯,支持即寫即用,目前支持c語言和lua兩種編程語言做爲腳本,安裝文件自帶一些例子,歡迎測試並提供意見。python
連接: http://weiqiba.com/powersniff/PowerSniff-Setup-v0.9.exe
c++
1、典型場景程序員
抓包軟件運行時(或過後分析),但願對每一個數據包使用插件分析,smartsniff直接不支持,而wireshark編寫插件成本太大,web
須要安裝visual studio和相關sdk,不管是插件自己的開發仍是調試,都不是一件簡單的事。編程
一些廠商對常見的協議(如rtsp),作了wireshark的插件,可是若是是本身的協議,只能手工分析。c#
PowerSniff是爲快速解決數據分析而來,(即使不考慮數據分析,界面和可操做性也比wireshark, smartsniff更友好),windows
對捕獲的網絡數據包,即時腳本編寫(語法高亮,即時編譯,即時運行,也能夠直接用編寫好的腳本),
目前腳本支持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腳本)
2、相關界面截圖
(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主程序,便可看到相關輸出。
3、插件編寫說明(文件編碼必須使用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 then return "delete" -- remove handshake end src_port = tcp_ip_get_src_port(data) dst_port = tcp_ip_get_dst_port(data) -- if 8000 != src_port && 8000 != dst_port then if (8000 ~= dst_port) or (len_data < 100) then return "delete" end if 2 ~= data:byte(43) then -- 0x2是qq udp協議magic number return "delete" end if 8 ~= data:byte(46) then -- 8和37是 0x8和0x25是協議類型,表示登陸 return "delete" end if 37 ~= data:byte(47) then return "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) end function handle_click(protocol,data,len_total,len_data) if 54 == len_total then return end src_port = tcp_ip_get_src_port(data) dst_port = tcp_ip_get_dst_port(data) -- if 8000 != src_port && 8000 != dst_port then if (8000 ~= dst_port) or (len_data < 100) then return end if 2 ~= data:byte(43) then -- 0x2是qq udp協議magic number return end if 8 ~= data:byte(46) then -- 8和37是 0x8和0x25是協議類型,表示登陸 return end if 37 ~= data:byte(47) then return 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_output_clear() plugin_output("qq_number is: " .. qq_number.."\n") end function 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 number return -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); }
4、其它抓包工具
重量級抓包工具:
wireshark(推薦);科來網絡分析軟件;ominipeek;etherpeek;Charles;(通過各類測試,仍是wireshark最好用)
輕量級抓包工具:
smartsniff:只有230KB(推薦);minisniff:只有45KB(2006年中止維護);powersniff:2.3M(包含若干個第三方插件)
5、閉源。非商業使用無限制。收到BUG會解決(反饋qq羣466507719)。無其它技術支持。
付費封閉協議分析及定製腳本。目前只支持ipv4(tcp,udp,icmp),已對pcap數十個樣本測試,如須要其它協議能夠定製。
6、借地找個工做,地點武漢光谷~~~
目標嵌入式,c++,服務器端開發,移動端或web開發等軟件工做;也能夠偏管理;
簡歷以下:resume
對web開發較有興趣,熟練的同窗能夠技能交換
(只收3year+的同窗,不閒聊,武漢光谷有按期線下交流,最好能提供一份帶詳細項目經驗的簡歷,qq:80101277)
擁劍,中南民族大學附近2018.10.12