mirror of
https://github.com/CHN-beta/xmurp-ua.git
synced 2026-01-11 17:29:28 +08:00
虚拟机测试通过
This commit is contained in:
2
Makefile
2
Makefile
@@ -9,7 +9,7 @@ include $(INCLUDE_DIR)/package.mk
|
|||||||
EXTRA_CFLAGS:= \
|
EXTRA_CFLAGS:= \
|
||||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \
|
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \
|
||||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \
|
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \
|
||||||
-DVERSION="\"\\\"$(PKG_RELEASE)\\\"\"" --verbose -DRKP_DEBUG
|
-DVERSION="\"\\\"$(PKG_RELEASE)\\\"\"" --verbose
|
||||||
|
|
||||||
MAKE_OPTS:=$(KERNEL_MAKE_FLAGS) \
|
MAKE_OPTS:=$(KERNEL_MAKE_FLAGS) \
|
||||||
SUBDIRS="$(PKG_BUILD_DIR)" \
|
SUBDIRS="$(PKG_BUILD_DIR)" \
|
||||||
|
|||||||
@@ -68,14 +68,13 @@ static int __init hook_init(void)
|
|||||||
|
|
||||||
static void __exit hook_exit(void)
|
static void __exit hook_exit(void)
|
||||||
{
|
{
|
||||||
if(rkpm != 0)
|
|
||||||
rkpManager_delete(rkpm);
|
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0)
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0)
|
||||||
nf_unregister_net_hook(&init_net, &nfho);
|
nf_unregister_net_hook(&init_net, &nfho);
|
||||||
#else
|
#else
|
||||||
nf_unregister_hook(&nfho);
|
nf_unregister_hook(&nfho);
|
||||||
#endif
|
#endif
|
||||||
|
if(rkpm != 0)
|
||||||
|
rkpManager_delete(rkpm);
|
||||||
printk("rkp-ua: Stopped.\n");
|
printk("rkp-ua: Stopped.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
struct rkpManager
|
struct rkpManager
|
||||||
{
|
{
|
||||||
struct rkpStream* data[256]; // 按照首包的两端口之和的低 8 位放置
|
struct rkpStream* data[256]; // 按照首包的两端口之和的低 8 位放置
|
||||||
time_t last_active;
|
spinlock_t lock; // 线程锁
|
||||||
spinlock_t lock; // 线程锁
|
struct timer_list timer; // 定时器,用来定时清理不需要的流
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rkpManager* rkpManager_new(void);
|
struct rkpManager* rkpManager_new(void);
|
||||||
@@ -13,7 +13,7 @@ void rkpManager_delete(struct rkpManager*);
|
|||||||
|
|
||||||
int rkpManager_execute(struct rkpManager*, struct sk_buff*); // 处理一个数据包。返回值为 rkpStream_execute 的返回值。
|
int rkpManager_execute(struct rkpManager*, struct sk_buff*); // 处理一个数据包。返回值为 rkpStream_execute 的返回值。
|
||||||
int __rkpManager_execute(struct rkpManager*, struct sk_buff*);
|
int __rkpManager_execute(struct rkpManager*, struct sk_buff*);
|
||||||
void rkpManager_refresh(struct rkpManager*); // 清理过时的流
|
void __rkpManager_refresh(unsigned long); // 清理过时的流
|
||||||
|
|
||||||
void __rkpManager_lock(struct rkpManager*, unsigned long*);
|
void __rkpManager_lock(struct rkpManager*, unsigned long*);
|
||||||
void __rkpManager_unlock(struct rkpManager*, unsigned long);
|
void __rkpManager_unlock(struct rkpManager*, unsigned long);
|
||||||
@@ -24,7 +24,14 @@ struct rkpManager* rkpManager_new(void)
|
|||||||
if(rkpm == 0)
|
if(rkpm == 0)
|
||||||
return 0;
|
return 0;
|
||||||
memset(rkpm -> data, 0, sizeof(struct rkpStream*) * 256);
|
memset(rkpm -> data, 0, sizeof(struct rkpStream*) * 256);
|
||||||
|
// 初始化线程锁
|
||||||
spin_lock_init(&rkpm -> lock);
|
spin_lock_init(&rkpm -> lock);
|
||||||
|
// 注册定时器
|
||||||
|
init_timer(&rkpm -> timer);
|
||||||
|
rkpm -> timer.function = __rkpManager_refresh;
|
||||||
|
rkpm -> timer.data = (unsigned long)rkpm;
|
||||||
|
rkpm -> timer.expires = jiffies + 600 * HZ;
|
||||||
|
add_timer(&rkpm -> timer);
|
||||||
return rkpm;
|
return rkpm;
|
||||||
}
|
}
|
||||||
void rkpManager_delete(struct rkpManager* rkpm)
|
void rkpManager_delete(struct rkpManager* rkpm)
|
||||||
@@ -42,6 +49,7 @@ void rkpManager_delete(struct rkpManager* rkpm)
|
|||||||
rkps = rkps2;
|
rkps = rkps2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
del_timer(&rkpm -> timer);
|
||||||
__rkpManager_unlock(rkpm, flag);
|
__rkpManager_unlock(rkpm, flag);
|
||||||
rkpFree(rkpm);
|
rkpFree(rkpm);
|
||||||
}
|
}
|
||||||
@@ -63,7 +71,6 @@ int __rkpManager_execute(struct rkpManager* rkpm, struct sk_buff* skb)
|
|||||||
printk("\tsport %d dport %d\n", ntohs(tcp_hdr(skb) -> source), ntohs(tcp_hdr(skb) -> dest));
|
printk("\tsport %d dport %d\n", ntohs(tcp_hdr(skb) -> source), ntohs(tcp_hdr(skb) -> dest));
|
||||||
printk("\tid %d\n", (ntohs(tcp_hdr(skb) -> source) + ntohs(tcp_hdr(skb) -> dest)) & 0xFF);
|
printk("\tid %d\n", (ntohs(tcp_hdr(skb) -> source) + ntohs(tcp_hdr(skb) -> dest)) & 0xFF);
|
||||||
#endif
|
#endif
|
||||||
rkpm -> last_active = now();
|
|
||||||
if(rkpSettings_first(skb))
|
if(rkpSettings_first(skb))
|
||||||
// 新增加一个流或覆盖已经有的流
|
// 新增加一个流或覆盖已经有的流
|
||||||
{
|
{
|
||||||
@@ -119,9 +126,11 @@ int __rkpManager_execute(struct rkpManager* rkpm, struct sk_buff* skb)
|
|||||||
{
|
{
|
||||||
u_int8_t id = (ntohs(tcp_hdr(skb) -> source) + ntohs(tcp_hdr(skb) -> dest)) & 0xFF;
|
u_int8_t id = (ntohs(tcp_hdr(skb) -> source) + ntohs(tcp_hdr(skb) -> dest)) & 0xFF;
|
||||||
struct rkpStream* rkps = rkpm -> data[id];
|
struct rkpStream* rkps = rkpm -> data[id];
|
||||||
|
struct rkpStream* rkps_new;
|
||||||
#ifdef RKP_DEBUG
|
#ifdef RKP_DEBUG
|
||||||
printk("rkpStream_execute id %d\n", id);
|
printk("rkpStream_execute id %d\n", id);
|
||||||
#endif
|
#endif
|
||||||
|
// 寻找流并插入
|
||||||
while(rkps != 0)
|
while(rkps != 0)
|
||||||
if(rkpStream_belongTo(rkps, skb))
|
if(rkpStream_belongTo(rkps, skb))
|
||||||
{
|
{
|
||||||
@@ -132,22 +141,45 @@ int __rkpManager_execute(struct rkpManager* rkpm, struct sk_buff* skb)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
rkps = rkps -> next;
|
rkps = rkps -> next;
|
||||||
printk("rkp-ua::rkpStream::rkpStream_execute: Target stream %u not found.\n", id);
|
// 如果没找到的话
|
||||||
return NF_DROP;
|
printk("rkp-ua::rkpStream::rkpStream_execute: Target stream %u not found. Creat a new one.\n", id);
|
||||||
|
rkps_new = rkpStream_new(skb);
|
||||||
|
if(rkps_new == 0)
|
||||||
|
return NF_ACCEPT;
|
||||||
|
if(rkpm -> data[id] == 0)
|
||||||
|
{
|
||||||
|
rkpm -> data[id] = rkps_new;
|
||||||
|
#ifdef RKP_DEBUG
|
||||||
|
printk("rkpManager_execute: add a new stream %d to an empty list.\n", id);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rkpm -> data[id] -> prev = rkps_new;
|
||||||
|
rkps_new -> next = rkpm -> data[id];
|
||||||
|
rkpm -> data[id] = rkps_new;
|
||||||
|
#ifdef RKP_DEBUG
|
||||||
|
printk("rkpManager_execute: add a new stream %d to an unempty list.\n", id);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
return rkpStream_execute(rkps_new, skb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void rkpManager_refresh(struct rkpManager* rkpm)
|
void __rkpManager_refresh(unsigned long param)
|
||||||
{
|
{
|
||||||
time_t n = now();
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
unsigned long flag;
|
unsigned long flag;
|
||||||
|
struct rkpManager* rkpm = (struct rkpManager*)param;
|
||||||
|
#ifdef RKP_DEBUG
|
||||||
|
printk("__rkpManager_refresh start.\n");
|
||||||
|
#endif
|
||||||
__rkpManager_lock(rkpm, &flag);
|
__rkpManager_lock(rkpm, &flag);
|
||||||
for(i = 0; i < 256; i++)
|
for(i = 0; i < 256; i++)
|
||||||
{
|
{
|
||||||
struct rkpStream* rkps = rkpm -> data[i];
|
struct rkpStream* rkps = rkpm -> data[i];
|
||||||
while(rkps != 0)
|
while(rkps != 0)
|
||||||
if(rkps -> last_active + time_keepalive < n)
|
if(!rkps -> active)
|
||||||
{
|
{
|
||||||
struct rkpStream *rkps2 = rkps -> next;
|
struct rkpStream *rkps2 = rkps -> next;
|
||||||
if(rkps -> prev != 0)
|
if(rkps -> prev != 0)
|
||||||
@@ -160,9 +192,15 @@ void rkpManager_refresh(struct rkpManager* rkpm)
|
|||||||
rkps = rkps2;
|
rkps = rkps2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
rkps -> active = false;
|
||||||
rkps = rkps -> next;
|
rkps = rkps -> next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
__rkpManager_unlock(rkpm, flag);
|
__rkpManager_unlock(rkpm, flag);
|
||||||
|
#ifdef RKP_DEBUG
|
||||||
|
printk("__rkpManager_refresh end.\n");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void __rkpManager_lock(struct rkpManager* rkpm, unsigned long* flagp)
|
void __rkpManager_lock(struct rkpManager* rkpm, unsigned long* flagp)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ struct rkpStream
|
|||||||
u_int32_t id[3]; // 按顺序存储客户地址、服务地址、客户端口、服务端口,已经转换字节序
|
u_int32_t id[3]; // 按顺序存储客户地址、服务地址、客户端口、服务端口,已经转换字节序
|
||||||
struct rkpPacket *buff_scan, *buff_disordered; // 分别存储准备扫描的、因乱序而提前收到的数据包,都按照字节序排好了
|
struct rkpPacket *buff_scan, *buff_disordered; // 分别存储准备扫描的、因乱序而提前收到的数据包,都按照字节序排好了
|
||||||
u_int32_t seq_offset; // 序列号的偏移。使得 buff_scan 中第一个字节的编号为零。
|
u_int32_t seq_offset; // 序列号的偏移。使得 buff_scan 中第一个字节的编号为零。
|
||||||
time_t last_active; // 最后活动时间,用来剔除长时间不活动的流。
|
bool active; // 是否仍然活动,超过一定时间不活动的流会被销毁
|
||||||
unsigned scan_matched; // 记录现在已经匹配了多少个字节
|
unsigned scan_matched; // 记录现在已经匹配了多少个字节
|
||||||
struct rkpStream *prev, *next;
|
struct rkpStream *prev, *next;
|
||||||
};
|
};
|
||||||
@@ -52,7 +52,7 @@ struct rkpStream* rkpStream_new(const struct sk_buff* skb)
|
|||||||
rkps -> id[2] = (((u_int32_t)ntohs(tcph -> source)) << 16) + ntohs(tcph -> dest);
|
rkps -> id[2] = (((u_int32_t)ntohs(tcph -> source)) << 16) + ntohs(tcph -> dest);
|
||||||
rkps -> buff_scan = rkps -> buff_disordered = 0;
|
rkps -> buff_scan = rkps -> buff_disordered = 0;
|
||||||
rkps -> seq_offset = ntohl(tcp_hdr(skb) -> seq) + 1;
|
rkps -> seq_offset = ntohl(tcp_hdr(skb) -> seq) + 1;
|
||||||
rkps -> last_active = now();
|
rkps -> active = true;
|
||||||
rkps -> scan_matched = 0;
|
rkps -> scan_matched = 0;
|
||||||
rkps -> prev = rkps -> next = 0;
|
rkps -> prev = rkps -> next = 0;
|
||||||
#ifdef RKP_DEBUG
|
#ifdef RKP_DEBUG
|
||||||
@@ -110,7 +110,7 @@ unsigned rkpStream_execute(struct rkpStream* rkps, struct sk_buff* skb)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 肯定需要更新时间
|
// 肯定需要更新时间
|
||||||
rkps -> last_active = now();
|
rkps -> active = true;
|
||||||
|
|
||||||
// 不携带应用层数据的情况。直接接受即可。以后的情况,都是含有应用层数据的包了。
|
// 不携带应用层数据的情况。直接接受即可。以后的情况,都是含有应用层数据的包了。
|
||||||
if(rkpPacket_appLen(p) == 0)
|
if(rkpPacket_appLen(p) == 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user