协议Jiurl255 技术参考

这是一种很特殊的方法,使用它通讯没有端口,而且由于它的特殊性,也许会带来一些其他的优点。但这种方法也有一个比较大的缺点。它,也许该起个名字,比如叫Jiurl255。它不使用tcp协议,也不使用udp协议,也不使用icmp协议。它使用什么协议,就像乱起的那个名字一样,它使用255协议。

上面这幅图,是一个没有IP选项的IP头。其中有个字段为8位协议,一个字节长,系统就是通过这个字节中的值来区别上层协议是什么,通过这个字节的值来决定应该把数据交给谁来处理。TCP是十进制6,UDP是十进制17。就是说这个值是6的话就交给tcp处理,是17的话就交给udp处理。那么如果这个值是一个没有人处理的值会怎么样呢?比如222,255(8bit,最大255)。我觉得255漂亮些,就拿255说吧,其他没人用的值都是一样的。那么会怎么样呢?我猜测可以收到的,后来做了些小试验,说明我是对的。(我曾夜观天象,发现你有学计算机的命)。这个东西和tcp,udp没什么关系,自然也就不会有tcp,udp的端口号了。

好了,有兴趣的先试一试吧,使用Jiurl255做一次简单通讯的客户端程序下载,服务器端程序下载。
服务器端叫rserver,客户端叫rclient

rserver 首先 theSocket = socket(AF_INET, SOCK_RAW, 255);建立一个使用Jiurl255的原始套接字,然后绑定本地地址,最后阻塞在recvfrom,等待着发往255协议的数据。收到之后,会将收到数据打印出来。
rclient 首先 获得服务器的IP地址,然后 theSocket = socket(AF_INET, SOCK_RAW, 255);建立一个使用Jiurl255的原始套接字,然后让你从键盘输入些数据 就 sendto 用协议255向服务器端发送输入的数据。

第一个试验,进行一次收发,就可以发现,确实是可以利用没人用的协议号发送和接收数据。大概是这样的,系统收到ip包以后看该协议号有没有进程要接受,如果有的话,就发给那个进程。

第二个试验,运行一个rclient,运行两个rserver,发一次数据。可以发现,两个rserver都收到了rclient发的数据。说明系统会把收到的数据发给每个要接受这个协议号上数据的进程。

另一个试验,server端创建套接字时,指定协议号为200,client端创建套接字,填充ip头时,都指定协议号为255,结果server端就收不到client端发送的数据了。

当时试验后的笔记:
server端收数据
client端发数据
server端创建套接字时,指定协议号为255,
client端创建套接字,填充ip头时,都指定协议号为255,
结果server端收到了client端发送的数据。

server端创建套接字时,指定协议号为200,
client端创建套接字,填充ip头时,都指定协议号为255,
结果server端就收不到client端发送的数据了。

多个server端,都使用协议号255,
client端也向255协议发数据,
多个server端,都收到了数据。

还有就是,如果程序既发又收的,并且是发往本机的,那么程序会收到自己发出的内容。没说清楚好像,比如吧,一个程序,发255的数据之后,就接收255上的数据,他把数据发往本机,那么它就会收到数据。

rclient:

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <ws2tcpip.h>
#include <conio.h>

#pragma comment(lib,ws2_32.lib)

typedef struct ip_hdr //定义IP首部
{
    unsigned char h_verlen; //4位首部长度,4位IP版本号
    unsigned char tos; //8位服务类型TOS
    unsigned short total_len; //16位总长度(字节)
    unsigned short ident; //16位标识
    unsigned short frag_and_flags; //3位标志位
    unsigned char ttl; //8位生存时间 TTL
    unsigned char proto; //8位协议 (TCP, UDP 或其他)
    unsigned short checksum; //16位IP首部校验和
    unsigned int sourceIP; //32位源IP地址
    unsigned int destIP; //32位目的IP地址
}IP_HEADER, *PIP_HEADER;

USHORT CheckSum(USHORT *buffer, int size);
void RawClient( char *szServer );

void main()
{
    WSADATA wsaData;

    char ServerAddr[256];

    printf(Server Addr : );
    scanf(%s,ServerAddr);
    printf(/n);

    WSAStartup(0x0202, &wsaData);

    RawClient(ServerAddr);

    WSACleanup();
}

/////////////////////////////////////////////////
USHORT CheckSum(USHORT *buffer, int size)
{
    unsigned long cksum=0;

    while (size > 1)
    {
    cksum += *buffer++;
    size -= sizeof(USHORT);
    }
    if (size)
    {
    cksum += *(UCHAR*)buffer;
    }
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >>16);

    return (USHORT)(~cksum);
}

//////////////////////////////////////////////////////////
void RawClient( char *szServer )
{
    LPHOSTENT lpHostEntry;

    lpHostEntry = gethostbyname(szServer);
    if (lpHostEntry == NULL)
    {
        printf(gethostbyname() error/n);
        return;
    }

    SOCKET theSocket;

    theSocket = socket(AF_INET, SOCK_RAW, 255);
    if (theSocket == INVALID_SOCKET)
    {
        printf(socket() error/n);
        return;
    }

    int nRet;
    BOOL optval;

    optval=TRUE;
    nRet = setsockopt(theSocket, IPPROTO_IP, IP_HDRINCL, (char*)&optval, sizeof(optval));
    if (SOCKET_ERROR == nRet)
    {
        printf(SetSockOpt Error!%d/n, WSAGetLastError());
        return;
    }

    SOCKADDR_IN saServer;

    saServer.sin_family = AF_INET;
    // Let WinSock assign address
    saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
    saServer.sin_port = 0; // Use port passed from user

    char szBuf[1024];

    //////////////////////////////////////////////////////////////////
    memset(szBuf, 0, sizeof(szBuf));

    int IpHdrLen=0;
    int DataLen=0;

    IP_HEADER *pIpHdr=NULL;
    char* pData=NULL;

    IpHdrLen=sizeof(IP_HEADER);

    pIpHdr=(IP_HEADER*)szBuf;

    pIpHdr->h_verlen=(4<<4)| (sizeof(IP_HEADER) / sizeof(unsigned long));
    pIpHdr->tos=0;
    pIpHdr->proto=255;
    pIpHdr->ttl=128;
    pIpHdr->ident=0;
    pIpHdr->checksum=0;
    pIpHdr->frag_and_flags=0;
    pIpHdr->sourceIP=inet_addr(1.1.1.1);
    pIpHdr->destIP=(unsigned int)saServer.sin_addr.s_addr;

    pData=(szBuf+IpHdrLen);
    printf(Type a String :);
    scanf(%s,pData);
    DataLen=strlen(pData);

    pIpHdr->total_len=IpHdrLen+DataLen;

    //////////////////////////////////////////////////////////////////
    nRet = sendto(theSocket, // Socket
        szBuf, // Data buffer
        IpHdrLen+DataLen, // Length of data
        0, // Flags
        (LPSOCKADDR)&saServer, // Server address
        sizeof(struct sockaddr)); // Length of address
    if(nRet!=SOCKET_ERROR)
    {
        printf(Client send: %s/n,pData);
    }

    getch();
    closesocket(theSocket);
    return;
}

rserver:

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <ws2tcpip.h>
#include <conio.h>

#pragma comment(lib,ws2_32.lib)

void RawServer();

void main()
{
    WSADATA wsaData;

    WSAStartup(0x0202, &wsaData);

    RawServer();

    WSACleanup();
}

//////////////////////////////////////////////////////////
void RawServer()
{
    int nRet;
    SOCKET theSocket;

    theSocket = socket(AF_INET, SOCK_RAW, 255);
    if (theSocket == INVALID_SOCKET)
    {
        printf(socket() error/n);
        return;
    }

    SOCKADDR_IN saServer;

    saServer.sin_family = AF_INET;
    saServer.sin_addr.s_addr = INADDR_ANY; // Let WinSock assign address
    saServer.sin_port = 0; // Use port passed from user

    nRet = bind(theSocket, // Socket descriptor
        (LPSOCKADDR)&saServer, // Address to bind to
        sizeof(struct sockaddr) // Size of address
        );
    if (nRet == SOCKET_ERROR)
    {
        printf(bind() error/n);
        closesocket(theSocket);
        return;
    }

    ///////////////////////////////////////////////////
    int nLen;
    nLen = sizeof(SOCKADDR);
    char szBuf[1024];

    nRet = gethostname(szBuf, sizeof(szBuf));
    if (nRet == SOCKET_ERROR)
    {
        printf(gethostname() error/n);
        closesocket(theSocket);
        return;
    }

    LPHOSTENT lpHostEntry;
    lpHostEntry = gethostbyname(szBuf);

    printf(Server named %s addr %s /n/n,
    szBuf, inet_ntoa(*(LPIN_ADDR)lpHostEntry->h_addr));
    ///////////////////////////////////////////////////

    SOCKADDR_IN saClient;

    memset(szBuf, 0, sizeof(szBuf));

    nRet = recvfrom(theSocket, // Bound socket
        szBuf, // Receive buffer
        sizeof(szBuf), // Size of buffer in bytes
        0, // Flags
        (struct sockaddr*)&saClient, // Buffer to receive client address
        &nLen); // Length of client address buffer
    if(nRet!=SOCKET_ERROR)
    {
        printf(Server recv: %s/n,szBuf+20);
    }
    else
    {
        printf(recv error: %d/n,WSAGetLastError());
        closesocket(theSocket);
        return;
    }

    getch();
    closesocket(theSocket);
    return;
}

使用Jiurl255进行数据传输明显是没有tcp和udp的端口的,这样也就不会被 netstat -an 之类的命令看到。这和利用icmp传输数据很象,但是我觉得Jiurl255比用icmp传数据要来的好一些。它还有个比较大的缺点就是,由于直接使用的是ip,所以传输的数据是有可能丢失的。这是我观察后写的笔记:

使用ip,ip头字段中的上层协议填255,这是一个还没有人用的协议号。然后在网络中两个主机上分别运行c,s程序,c发送ip255报文,内容hello n,共发50个,每秒发一个。s收ip255报文,确实收到,一次测试中,50个报文,收到了49个,也确实存在ip报丢失的情况。两个方向上都试了,是可行的。

因此用此方法隐藏端口是要多费不少力气的,我自己写的一个程序中,传送文件使用了一些简单的等待ack,超时重发的机制保证数据不会丢失和发生错误,传送命令,没有保证不会丢失。有时间的话,准备写个保证不丢失,不错误的收发函数。传送文件用的那些机制,参考了使用udp协议进行文件可靠传输的tftp协议。

0

搭建github.io+hexo博客

一. 首先下载nodejs,配置hexo相关

  1. 建立文件夹hexo,然后输入以下命令
    npm install hexo --save
    hexo init
    npm install                       #这个感觉可选
    npm install --save hexo-deployer-git

阅读剩余部分 –

0

梦境之姐姐

        最近家里突然来了一位姐姐,长的很是漂亮,然而我却没有任何印象。妈妈牵着姐姐的手,来到我面前,对我说:“我和你爸爸要出差,就由你姐姐来照顾你。” 我很是好奇,因为之前我从未见过,想着是哪个亲戚家的,于是私下问妈妈,这是哪家的大姐姐,妈妈却一脸责怪的说:“什么哪家的,这就是你的亲姐姐啊!” 说完便和爸爸一起离开了

        我望着这位姐姐,满脸疑惑,心里想着:“亲姐姐?可我不是独生子吗?”,一个个疑问涌上心头,最终我甩了甩头,把这些想法抛到了一边。这位姐姐看起来很空灵,美的有点不真实,她明明就是我的面前,我却觉得离她好远。我轻轻的喊了一声姐姐,然后无所事事的走进了屋子,姐姐微微一笑,端庄大方
阅读剩余部分 –

1+

思考死:有意义的徒劳-周国平

死亡和太阳一样不可直视。然而,即使掉头不去看它,我们仍然知道它存在着,感觉到它正步步逼近,把它的可怕阴影投罩在我们每一寸美好的光阴上面。

很早的时候,当我突然明白自己终有一死时,死亡问题就困扰着我了。我怕想,又禁不住要想。周围的人似乎并不挂虑,心安理得地生活着。性和死,世人最讳言的两件事,成了我的青春期的痛苦的秘密。读了一些书,我才发现,同样的问题早已困扰过世世代代的贤哲了。

“要是一个人学会了思想,不管他的思想对象是什么,他总是在想着自己的死。”读到托尔斯泰这句话,我庆幸觅得了一个知音。

死之迫人思考,因为它是一个最确凿无疑的事实,同时又是一件最不可思议的事情。既然人人迟早要轮到登上这个千古长存的受难的高岗,从那里被投入万劫不复的虚无之深渊,一个人怎么可能对之无动于衷呢?然而,自古以来思考过、抗议过、拒绝过死的人,最后都不得不死了,我们也终将追随而去,想又有何用?世上别的苦难,我们可小心躲避,躲避不了,可咬牙忍受,忍受不了,还可以死解脱。惟独死是既躲避不掉,又无解脱之路的,除了接受,别无选择。也许,正是这种无奈,使得大多数人宁愿对死保持沉默。 阅读剩余部分 –

0

成年人

一个人可以保持天真多久
茫然无知 伸出索要的手
我态度谦卑
我会报答一切人的好
我一定会报答你啊
即使我有翅膀
我还会飞回来的啊
想做个好孩子
但不再是孩子
没有人再原谅
一个不是孩子的人
孩子早就被狼吃掉了
剩下的是一个表情严肃,内心慌张的成年人
一生就这样耗尽了

0

永恒的长度

关于永恒的长度有这么
一个传说:
离这不远
有一座大学图书馆
图书馆的书架上
摆着这样一本诗集
每隔一百年
走来一个图书管理员
取下书架上的这本书
吹去上面堆积的尘土
然后打开阅读
当这本诗集
被如此翻烂
永恒
刚刚过去了一秒

0

U盘使用KaliLinux指南(Persistence模式)

如果你看过《Mr.Robot》或者对入侵渗透有了解,就会认识这个kaliLinux了,KaliLinux集成了各类安全工具
1.首先下载iso镜像,然后下载 LinuxLive USB Creator (http://www.linuxliveusb.com/)
2.接着用Creator把iso写入u盘(u盘需要是fat32格式)
3.然后用diskgenius把u盘分成两个区(一个启动盘fat32,另一个分区删除状态)
4.到linux下面用gparted把删除分区格式成ext3(u盘对ext4支持不是很好)
5.然后在ext3分区中写入persistence.conf文件,如下
mkdir /mnt/usb
mount /dev/sdb3 /mnt/usb
echo “/ union” >> /mnt/usb/persistence.conf
umount /mnt/usb
6.一切ok了,在我的文档写点东西,重启后看看还在不在 就可以验证Persistence模式是否生效

注:2,3两个步骤可以换个顺序,这样也许更好

0

如何开始玩老滚

少女卷轴是个很复杂的游戏,画质那是相当不错,自由度也高
1.首先通过下列网址来明白一些基础知识,主要是几个工具的使用
http://bbs.3dmgame.com/forum.php?mod=viewthread&tid=3613377&extra=page%3D1&ordertype=1
这里面主要讲了mod的使用,首先是改My Document里面的游戏ini文件,让游戏launcher界面显示“载入mod”按钮,悲剧的是
我发现3dmgame里面最新的那个,无论怎么玩儿都没有“载入mod”,还好有skse_loader这玩意儿。所以这里推荐下猪猪乐园的

2.然后就是人物美化了,自带的人物都很戳的
http://bbs.3dmgame.com/forum.php?mod=viewthread&tid=3204213&extra=page%3D1%26filter%3Dtypeid%26typeid%3D5940%26typeid%3D5940
这个帖子提供了CBBE的人物美化包
人物的体型有下面几种mod:
女性+男性:
CBBE:偏向于正常,提臀
UNP:这是完全按照真人比例来塑造的
CHSBHC:这个是丰乳肥臀类型的
7B:7B貌似和CHSBHC比较类似,只是肌肉多了点,更加像是女战士
男性:
天际男宴http://bbs.3dmgame.com/forum.php?mod=viewthread&tid=3267208&page=5#pid61680771
这个帖子里面有个整合包,安装上去,安装上去后,可能要替换上面可选的“nude effect”包来实现勃起
除了上面说的美化之外,还有湿汗皮肤可选:
sportysexysweetCBBE
然后还有一个脸部美化,增加红晕什么的
AdorableFace,安装这个mod需要先安装皮肤支持:Fair Skin Complexion for CBBE
然后就完美了
注意:安装这些美化包的时候要注意优先级(主要是mo),来决定谁覆盖谁
阅读剩余部分 –

0

磁盘驱动结构

应用程序(CreateFile,ReadFile)

I/O子系统(向FS发送I/O请求)

文件系统设备栈

  • 文件过滤 驱动管理器 FltMgr.sys
  • 文件系统(在原始卷上强加上文件结构)NTFS

卷管理设备栈

  • 卷快照 (管理软件快照) vbp volsnap.sys
  • 卷管理器 (FtDisk.sys 总线型驱动程序,负责列举基本的磁盘,以便检测基本卷的存在情况,并且将他们报告给PnP管理器,当它确定了分区和卷的对应关系并且该卷的所有分区都存在时,就会创建一个卷设备对象)向用户提供卷的语义(c: d:),支持基本的和动态的磁盘(RAID) 在win7下是volmgr.sys

阅读剩余部分 –

0

梦境之自由

小时候每天晚上都会做梦,梦里的故事五彩缤纷,有时候我在想,如果我文笔够好,能够把它们记述下来,那一定很有趣…..

        大漠上,荒无一人,黄沙不断地在空中咆哮,一个个海市蜃楼在空中扭曲并慢慢消散。在那里,我看到了一张张狰狞的面孔,他们看着我,疯狂地喊着“快跑啊,不然你就会死,哈哈!” 我无奈地背上沉重的沙袋,在一条没有尽头的沙道上奔跑着,我在为生命而奔跑着,恐惧成为了我的动力,突然我的身后出现一张魔鬼的巨大面孔,它是如此的恐怖,我开始感到一丝绝望。“快点,时间不多了,到不了终点,我会让你坠入无穷的深渊…” 它缓缓的说,巨大的来自地狱的声音穿透狂沙,穿透一切幻影,穿透了我的身体。我第一次感觉我是如此渺小,无助。只能奋力的跑着。前面的路随着它声音的不断冲击开始不断的弯曲、下陷,像是一条饥饿的巨蟒在摇动着它那巨大的身躯,是的,它已经迫不及待了,黄沙下陷越来越快,那是它的巨口在吞噬一切,包括我。后面的呼喊的声音,魔鬼的声音,还在耳边回荡,我渐渐感觉到疲乏无力,求生的意志依旧那么强烈,但身体已经不由我的控制。眼前的幻影飘渺而杂乱,不断生成众多的幻象然后破碎开来,让我进入了眩晕状态。
        最终,我放弃了,扔下了包袱,抬头仰望着苍天,那里隐隐约约可以看到一丝阳光。轻轻的说了一句“我要自由,没有任何人可以奴役我的灵魂”然后我笑了笑,笑的那么舒畅和开心。接着我被卷入了巨大的漩涡之中,无尽的黑暗把我包围,但我在没有一丝恐惧,因为我已经全然不在乎了,这里没有了魔鬼们命令的声音。“好安静啊!”我这么想着,然后进入了无尽的睡眠…..

0

分类

标签云

Anything in here will be replaced on browsers that support the canvas element

统计

  • 0
  • 13
  • 162,433
  • 58