协议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协议。

搭建github.io+hexo博客

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

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

阅读剩余部分 –

梦境之姐姐

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

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

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

阅读剩余部分 –

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

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

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

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

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

成年人

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

永恒的长度

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

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两个步骤可以换个顺序,这样也许更好

如何开始玩老滚

少女卷轴是个很复杂的游戏,画质那是相当不错,自由度也高
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),来决定谁覆盖谁
阅读剩余部分 –

磁盘驱动结构

应用程序(CreateFile,ReadFile)

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

文件系统设备栈

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

卷管理设备栈

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

阅读剩余部分 –

梦境之自由

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

星期天,天气温和,万里无云。我在院子里看着书,妈妈则在洗衣服。过了一段时间,一个人走了进来,是外公。母亲连忙站起迎了上去,“爸,你怎么来了?”妈妈笑着问。“来看看外甥”外公说着望向了我,脸上露出了不易察觉的微笑,“到我家去玩,怎样?”。 “行。”我一口答应。母亲交代了几句后我便与外公离开了。

外公一直在前方走着,丝毫不回头,我跟在身后,观看着周围的秋景,落叶像蝴蝶一样自空中盘旋而下,不知不觉我竟然发起呆来。望着望着,突然空中涌现了一层薄薄的雾气,来时的路变得茫茫一片。渐渐地,空中的落叶变成了一张张黄色的纸钱,到处纷飞,地上瞬间便积了厚厚一层。我使劲地摇了摇头,刚才的景象霎时消失,不留一点痕迹…我望向前方,外公已经走了很远了,我加紧步伐跟了上去,外公依旧沉默不语,自顾自的走着。这时一个熟人走了过来,外公这才停下来与其闲聊,我继续走着,心中思索着刚才的一幕,一阵阵心惊。走了一段距离,我发现后面没有了脚步声,我猛地回过头,外公与那个人都消失的无影无踪!“他们一定到附近聊去了吧!”我自我安慰道。

阅读剩余部分 –