mirror of
https://github.com/zeek/zeek.git
synced 2025-10-06 08:38:20 +00:00
Initial import of svn+ssh:://svn.icir.org/bro/trunk/bro as of r7088
This commit is contained in:
commit
61757ac78b
1383 changed files with 380824 additions and 0 deletions
134
src/BitTorrentTracker.h
Normal file
134
src/BitTorrentTracker.h
Normal file
|
@ -0,0 +1,134 @@
|
|||
// $Id:$
|
||||
//
|
||||
// This code contributed by Nadi Sarrar.
|
||||
|
||||
#ifndef bittorrenttracker_h
|
||||
#define bittorrenttracker_h
|
||||
|
||||
#include "TCP.h"
|
||||
|
||||
#define BTTRACKER_BUF 2048
|
||||
|
||||
// If the following is defined, then the analyzer will store all of
|
||||
// the headers seen in tracker messages.
|
||||
//#define BTTRACKER_STORE_HEADERS 1
|
||||
|
||||
enum btt_states {
|
||||
BTT_REQ_GET,
|
||||
BTT_REQ_HEADER,
|
||||
BTT_REQ_DONE,
|
||||
|
||||
BTT_RES_STATUS,
|
||||
BTT_RES_HEADER,
|
||||
BTT_RES_BODY,
|
||||
BTT_RES_DONE,
|
||||
};
|
||||
|
||||
// "benc" = Bencode ("Bee-Encode"), per http://en.wikipedia.org/wiki/Bencode
|
||||
enum btt_benc_types {
|
||||
BENC_TYPE_INT = 0,
|
||||
BENC_TYPE_STR = 1,
|
||||
BENC_TYPE_DIR = 2,
|
||||
BENC_TYPE_LIST = 3,
|
||||
BENC_TYPE_NONE = 10,
|
||||
};
|
||||
|
||||
enum btt_benc_states {
|
||||
BENC_STATE_EMPTY,
|
||||
BENC_STATE_INT1,
|
||||
BENC_STATE_INT2,
|
||||
BENC_STATE_INT3,
|
||||
BENC_STATE_STR1,
|
||||
BENC_STATE_STR2,
|
||||
};
|
||||
|
||||
class BitTorrentTracker_Analyzer : public TCP_ApplicationAnalyzer {
|
||||
public:
|
||||
BitTorrentTracker_Analyzer(Connection* conn);
|
||||
virtual ~BitTorrentTracker_Analyzer();
|
||||
|
||||
virtual void Done();
|
||||
virtual void DeliverStream(int len, const u_char* data, bool orig);
|
||||
virtual void Undelivered(int seq, int len, bool orig);
|
||||
virtual void EndpointEOF(TCP_Reassembler* endp);
|
||||
|
||||
static Analyzer* InstantiateAnalyzer(Connection* conn)
|
||||
{ return new BitTorrentTracker_Analyzer(conn); }
|
||||
|
||||
static bool Available()
|
||||
{ return bt_tracker_request || bt_tracker_response; }
|
||||
|
||||
protected:
|
||||
void ClientRequest(int len, const u_char* data);
|
||||
void ServerReply(int len, const u_char* data);
|
||||
|
||||
void InitBencParser(void);
|
||||
|
||||
void DeliverWeird(const char* msg, bool orig);
|
||||
|
||||
bool ParseRequest(char* line);
|
||||
void RequestGet(char* uri);
|
||||
void RequestHeader(char* name, char* value)
|
||||
{ ParseHeader(name, value, true); }
|
||||
void EmitRequest(void);
|
||||
|
||||
bool ParseResponse(char* line);
|
||||
void ResponseStatus(char* status);
|
||||
void ResponseHeader(char* name, char* value)
|
||||
{ ParseHeader(name, value, false); }
|
||||
void ResponseBody(void);
|
||||
void ResponseBenc(int name_len, char* name, enum btt_benc_types type,
|
||||
int value_len, char* value);
|
||||
void ResponseBenc(int name_len, char* name, enum btt_benc_types type,
|
||||
bro_int_t value);
|
||||
int ResponseParseBenc(void);
|
||||
void EmitResponse(void);
|
||||
|
||||
void ParseHeader(char* name, char* value, bool is_request);
|
||||
|
||||
// HTTP state.
|
||||
bool keep_alive;
|
||||
|
||||
// Request.
|
||||
enum btt_states req_state;
|
||||
char req_buf[BTTRACKER_BUF];
|
||||
char* req_buf_pos;
|
||||
unsigned int req_buf_len;
|
||||
StringVal* req_val_uri;
|
||||
TableVal* req_val_headers;
|
||||
|
||||
// Response.
|
||||
enum btt_states res_state;
|
||||
bool res_allow_blank_line;
|
||||
char res_buf[BTTRACKER_BUF];
|
||||
char* res_buf_pos;
|
||||
unsigned int res_buf_len;
|
||||
bro_uint_t res_status;
|
||||
TableVal* res_val_headers;
|
||||
TableVal* res_val_peers;
|
||||
TableVal* res_val_benc;
|
||||
|
||||
vector<char> benc_stack;
|
||||
vector<unsigned int> benc_count;
|
||||
enum btt_benc_states benc_state;
|
||||
|
||||
char* benc_raw;
|
||||
enum btt_benc_types benc_raw_type;
|
||||
unsigned int benc_raw_len;
|
||||
|
||||
char* benc_key;
|
||||
unsigned int benc_key_len;
|
||||
|
||||
char* benc_strlen;
|
||||
char* benc_str;
|
||||
unsigned int benc_str_len;
|
||||
unsigned int benc_str_have;
|
||||
|
||||
char* benc_int;
|
||||
bro_int_t benc_int_val;
|
||||
|
||||
// True on protocol violation.
|
||||
bool stop_orig, stop_resp;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue