📄 packet.cpp
字号:
/**
* 包构造模块
*/
#include "stdafx.h"
#include <stdio.h>
#include "crypt.h"
#include "md5.h"
#include <stdlib.h>
#include <string.h>
#include "options.h"
/**
* 在数据流当前位置(p)开始增加一个 (type,len,data) 三元组
*
* 返回指向下一个位置的指针
*/
static inline unsigned char *add_item(unsigned char *p,unsigned char type,void *buf,int len)
{
*p++ = type;
*p++ = 2 + len;
memcpy(p,buf,len);
p+=len;
return p;
}
/**
* 构造一个 ping 协议报文
*
* @param size packet 缓冲区长度
* @return 返回构造出的报文长度
* @note 未检查是否构造越过 packet 边界
*/
int packet_ping(unsigned char *packet,int size)
{
unsigned char *p;
p = packet;
*p++ = 3;
p += 16 + 1;
p = add_item(p,7,g_options.my_mac,sizeof(g_options.my_mac));
p = add_item(p,8,g_options.session,g_options.sesslen);
p = add_item(p,9,(void*)g_options.my_ip,strlen(g_options.my_ip));
size = p - packet;
p = packet + 1;
*p++ = size;
memset(p,0,16);
MD5(p,packet,size);
encrypt(packet,size);
return size;
}
/**
* 构造一个 login 协议报文
*
* @param size packet 缓冲区长度
* @return 返回构造出的报文长度
* @note 未检查是否构造越过 packet 边界
*/
int packet_login(unsigned char *packet,int size)
{
unsigned char c = 1;
unsigned char *p;
p = packet;
*p++ = 1;
p += 16 + 1;
p = add_item(p,1,(void*)g_options.username,strlen(g_options.username));
p = add_item(p,2,(void*)g_options.password,strlen(g_options.password));
p = add_item(p,7,(void*)g_options.my_mac,sizeof(g_options.my_mac));
p = add_item(p,9,(void*)g_options.my_ip,strlen(g_options.my_ip));
p = add_item(p,0x0A,(void*)g_options.services,strlen(g_options.services));
p = add_item(p,0x1F,(void*)g_options.version,strlen(g_options.version));
p = add_item(p,0x20,(void*)&c,1);
size = p - packet;
p = packet + 1;
*p++ = size;
memset(p,0,16);
MD5(p,packet,size);
encrypt(packet,size);
return size;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -