發一個本身寫的抓包軟件,支持插件化腳本分析

市場上的抓包工具已經足夠多,輕量級的,重量級的都有,典型的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

相關文章
相關標籤/搜索