很多人都基本知道WPE怎么工作的了,但是还是不能用它来修改游戏,不能做出外挂来,为什么?其实很简单,因为他们对封包的分析不够,不知道封包是可以加密的,更不知道怎么解密,这里我们给大家讲解游戏里面使用频率非常高的几大加密方式-----异或运算加密、背包运算加密等等,并给大家讲解怎么分析这些加密的封包,怎么找到它的内在规律,怎样自己制作假封包满足它的加密规律,来达到修改游戏的目的!
一般来说,网络游戏的封包都可以加密,对一般数据采用简单的加密,不会影响游戏速度,但是对游戏的安全却非常管用,对于非常重要的数据,则采用复杂的加密方式,可以保证游戏平衡,例如:游戏中人物的等级,这个属于非常重要的数据,必须采用非常好的加密方式来保密数据不会轻易被修改,好了,这个大家自然明白,那么我们就开始3大常用加密方式告诉大家,并给出解密方法,大家注意掌握,这个对游戏修改至关重要!不能解密,就做不出象样的外挂!
异或运算加密:
异或运算加密是通常的加密方式,为了大家直观理解,下面给大家图片分析!
这个是一个非常简单的异或运算,经过加密以后,我们看到的是a,b,c ,d ,e ,f但是,他的实际意思不是这样的,实际意思是,1,2,3,4,5,6,当我们看到的是1时,他的实际意思就是6,当然,这个异或运算是比较简单的,但是在映射的时候没有按照一定规律影射,如果要在只知道a,b,c的情况下来破解其中的规律,那是需要一定经验和技巧的!
如果大家有高中以上文化水平(我想都该没有问题吧?),我想利用函数的方法来讲解加密问题,这样大家容易理解,大家知道函数
y=f(x),
这里的 x就相当于我们图上的abcdef,而y呢就是123456,箭头就是f,f是映射方式,函数就是某种映射方式,从函数和映射的角度来理解加密是非常好的和正确的,
我们为什么要讲这种加密方式呢?
因为这种加密方式,不是非常隐蔽,但是非常容易实现,建立一个映射,可以在整个软件中调用,所以,在游戏制作的时候,制作一个映射并不需要太高的技术,而且这个映射可以在任何时候修改,非常容易维护和更新,如果映射规律被破解了,也可以更新游戏来更新映射,达到保密的作用,所以,这种加密方式是游戏里面经常采用的加密方式,更重要的是,这种加密方式对电脑要求低,运算速度快,不会影响游戏速度,所以经常被采用,如果能很好地破解这种加密方式,那么对于游戏里面的一些关键数据,我们就可以非常方便的修改了。
下面结合一个网吧管理软件来讲解异或运算加密,并给大家讲解如何破解这种加密方式:
在一个网管软件中,有一个会员功能,功能是这样的,凡是会员,就可以不在网吧老板那儿去登记而是直接上机,开机后填写自己的用户名和密码就可以解锁,可以开始使用电脑了,相信去过网吧的人都知道这个功能吧?
其实,该软件实现该功能的过程是这样的,首先用户输入用户名和密码,然后把用户名和密码发送到主控电脑(一般是网吧老板身边的那台电脑),由主控电脑检查该用户名是否存在,如果存在,再检查密码是否正确,这些我们不管了,我们已经知道用户名和密码都会发送到主控电脑那儿去,好,有密码发送,就会有封包发到主控机上去,就可以中途拦截,这个是WPE的专长,当然也可以使用其他黑客工具来拦截,我们不管那么多,先拦截几个用户名密码先,下面这个是某台电脑上被拦截到的封包,内容如下:
send 0000 01 00 00 00 7a 68 61 6e 67 6a 75 6e 30 30 37 00
00 02 00 64 66 6c 64 68 6a 66 64 65 6a 68 00 00
要分析这个封包还真是麻烦,呵呵,那么长,总不能乱抓吧?这里有简单方法的,别忘了我们前面已经讲过的方法哦,我们的黄金规则:比较法则和结构法则,这里我们用比较法则,利用比较法则的相同比较和不同比较,很容易辨认用户名和密码各在那一段,这样对我们的分析是非常有用的,至于如何比较,在前面的章节都详细说了,相信大家都知道了,好了,这里就不再罗嗦了!直接给出!
通过比较我们知道,
用户名是: 7a 68 61 6e 67 6a 75 6e 30 30 37
密码是: 64 66 6c 64 68 6a 66 64 65 6a 68
马上使用我们的进位专家来对付这些16进制的文字,翻译出来的结果如下:
用户名:zhangjun007
密码:dfldhjfdejh
显然密码是不大正确的,因为这个密码一般人是很难记住的,从一般的情况分析,一般不会把密码随便显示出来的,总要经过加密才可以安全地发送,不然是很危险的,万一被人拦截,很容易被盗,所以,我们有充分的理由相信,这个不是真正的密码,那么怎么分析呢?这下该运用我们的异或运算分析来分析这个密码!
看一看密码的特点,全部是字母,而且集中在A到L,在没有任何分析的前提下,我们可以假设这是一个单满映射(关于单满映射的特点及分析方法在后面给出),那么我们得到的是映射的原象,现在要自己建立一个映射来分析,简单的,从字母到字母的映射,看能不能找到一个规律,分析很长,我们建立了从A到A的映射到从A到Z的映射逐个分析,结果都是错的,所以,应该考虑从字母到数字的映射,最后检查出映射是从C到L映射到0-9,分析结果出来了:
密码是:13915731275
估计是个手机号,经过测试,这个密码是正确的,可以使用!
上面这个例子不是教大家怎么分析,而是叫大家明白异或运算加密是怎么回事!好了,下面我们进入异或运算的分析,大家注意分析的方法,并多加练习,以后遇到加密的封包就会很容易对付的!
如果大家学习过加密技术,可以跳过您所熟悉的章节!
加密解密
异或运算分析方法,为了简单,这里我们不再一封包作为分析,因为封包要从16位到10位的步骤,很麻烦,我们直接看下面的异或。
从一个进制到另一个进制是一中异或运算,而且是单满映射,所谓单满映射,意思是每一个象都有原象,每一个原象都有象,例如我们的映射是从16进制到10进制,象,就是10进制里面的所有的数,而16进制里面的数就是原象,每一个10进制的数都唯一对应一个16进制的数,所以说所有象都有唯一一个原象,而反过来,每一个16进制也唯一对应一个10进制的数,所以每一个象都有且只有一个象,这样的映射就是单满映射!这样的映射使用起来效率最高,可以知道每次调用函数返回的值都是有用的,下面这个也是单满影射:
但是这个运算要分析起来是复杂的,我们从简单的分析,你想一想,如果我们这样对应,0对应A,1对应B,这样一个一个对应下去,那么如果你的生日是:1986年2月14日,如果我们把生日加密,按照我们的映射,结果就是这样了,BJIG年C月BE 日,看看这个结果,是不是不那么容易认了,这个就是加密,如果改变对应的开头,不是0对应A而是0对应E那么会是怎么样呢?当然会变的,异或运算本身简单,但是可以看出来,加密还是很有效的!
那么我们怎么知道一个封包是不是异或运算加密的呢?
我们不知道!
对于这个回答,大家也许有写心灰,其实完全没有必要,你知道我早上吃的什么?不知道吧?当然不知道,谁知道呢?但是我们可以知道,要么吃的食物,要么喝的水,要么什么都没有吃,如果没吃,很简单嘛,如果吃了,我把所有食物都说一遍,总有一个是你吃的吧,所以,我们虽然不知道封包具体使用异或运算没有,但是我们可以假设已经采用了,然后继续分析!异或运算不改变数据的任何性质,不会影响任何分析。
那么怎么分析呢?如果一个封包确实是异或运算加密的,我们如何可以找到它的加密方法呢?这就要采用枚举法来做了,所谓的枚举法,也称穷举法,如果你认为你发封包应该是数字,那么就找到数字的映射,可以建立方程,比如:y=F(x)
那么我们找几个点,称为已知点,然后解方程,例如,我们我们已经知道:a对应的是0,d对应的是3,f对应的是5,那么我们可以这样做,F(a)=0,F(d)=3,
而这种异或运算都是线性的,也就是可以认为是一维的,那么有两个点就可以算出来了,我们可以认为,映射就是:F(x)=Asc(x)-97,这里是Asc()是VB里面的一个函数,就是返回该字母的Ascii码,这样,我们可以带f对应5进行检验,也许你会问我怎么来这些点,这些可以确定函数的点从那里来?其实很简单,举个例子,你要知道游戏里面钱的数字与封包里面数字的联系怎么办,要确定这个对应关系,就要自己去找一些点来确定,我们可以通过一些方法来找到的,例如,我们扔掉一元钱,看看数字是多少,这里就找到一点了,一个点如果确定不了,可以多取一些点来确定,如果还是不行,那么再来,如果是不规则的影射,就要取遍所有点,当然象钱这样的数字,由于可边范围太大,不可能建立想我们给的图那样的非规则影射,否则很难计算,影响游戏速度,所以可以肯定:游戏里面钱的数字的加密一定是规则的运算加密的,至于是不是异或运算加密的就不知道了!但是我们可以假设是,然后做我们想做的事啊!
当然,异或运算的规则是自己建立的,可以有无穷多,要给大家讲解所有的破解方法是不行的,大家是要多动手分析才行,这个需要的是经验和技巧,你要从别人的角度想,“如果我要加密,我会怎么做能做到计算简单,加密性好,而且加密函数又容易设计”,想多了,你就知道其实异或运算加密是可以比较容易地分析出来的,当然,光靠我们的大脑是痛苦的,何不找一些工具来帮助分析呢?很多黑客软件都具有分析加密数据的功能,试者学习一些,会对您的封包破解很有帮助的,也许他们能提供更好的破解思路也不一定!
加密解密
背包加密是一中相当高级的加密方式,不容易破解,而且还原也相对容易,因此采用这种加密方式加密游戏数据也是非常好的,只要知道背包,就可以轻易算出来,所以在游戏里面采用这种加密方式加密对游戏的影响也不是很大,不会给服务器带来太大的负担,而且加密是非常安全的,对于一些重要的数据采用这种方式加密是非常可靠的,说了那么多,你也许会问:“什么是背包加密方式”,好下面给大家说明。
背包分两种,加法背包和乘法背包!想讲加法背包!
我们知道:1
文章比较长,得慢点看。转载
利用HOOK拦截封包原理 截获API是个很有用的东西,比如你想分析一下别人的程序是怎样工作的。这里我介绍一下一种我自己试验通过的方法。 首先,我们必须设法把自己的代码放到目标程序的进程空间里去。Windows Hook可以帮我们实现这一点。SetWindowsHookEx的声明如下: HHOOK SetWindowsHookEx( int idHook, // hook type HOOKPROC lpfn, // hook procedure HINSTANCE hMod, // handle to application instance DWORD dwThreadId // thread identifier ); 具体的参数含义可以翻阅msdn,没有msdn可谓寸步难行。 这里Hook本身的功能并不重要,我们使用它的目的仅仅只是为了能够让Windows把我们的代码植入别的进程里去。hook Type我们任选一种即可,只要保证是目标程序肯定会调用到就行,这里我用的是WH_CALLWNDPROC。lpfn和hMod分别指向我们的钩子代码及其所在的dll,dwThreadId设为0,表示对所有系统内的线程都挂上这样一个hook,这样我们才能把代码放到别的进程里去。 之后,我们的代码就已经进入了系统内的所有进程空间了。必须注意的是,我们只需要截获我们所关心的目标程序的调用,因此还必须区分一下进程号。我们自己的钩子函数中,第一次运行将进行最重要的API重定向的工作。也就是通过将所需要截获的API的开头几个字节改为一个跳转指令,使其跳转到我们的API中来。这是最关键的部分。这里我想截三个调用,ws2_32.dll中的send和recv、user32.dll中的GetMessageA。 DWORD dwCurrentPID = 0; HHOOK hOldHook = NULL; DWORD pSend = 0; DWORD pRecv = 0; GETMESSAGE pGetMessage = NULL; BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 }; DWORD dwOldBytes[3][2]; HANDLE hDebug = INVALID_HANDLE_value; LRESULT CALLBACK CallWndProc( int nCode, WPARAM wParam, LPARAM lParam ) { DWORD dwSize; DWORD dwPIDWatched; HMODULE hLib; if( dwCurrentPID == 0 ) { dwCurrentPID = GetCurrentProcessId(); HWND hwndMainHook; hwndMainHook = ::FindWindow( 0, "MainHook" ); dwPIDWatched = ::SendMessage( hwndMainHook, (WM_USER+100), 0, 0 ); hOldHook = (HHOOK)::SendMessage( hwndMainHook, (WM_USER+101), 0, 0 ); if( dwCurrentPID == dwPIDWatched ) { hLib = LoadLibrary( "ws2_32.dll" ); pSend = (DWORD)GetProcAddress( hLib, "send" ); pRecv = (DWORD)GetProcAddress( hLib, "recv" ); ::ReadProcessMemory( INVALID_HANDLE_value, (void *)pSend, (void *)dwOldBytes[0], sizeof(DWORD)*2, dwSize ); *(DWORD *)( btNewBytes + 1 ) = (DWORD)new_send; ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pSend, (void *)btNewBytes, sizeof(DWORD)*2, dwSize ); ::ReadProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)dwOldBytes[1], sizeof(DWORD)*2, dwSize ); *(DWORD *)( btNewBytes + 1 ) = (DWORD)new_recv; ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pRecv, (void *)btNewBytes, sizeof(DWORD)*2, dwSize ); hLib = LoadLibrary( "user32.dll" ); pGetMessage = (GETMESSAGE)GetProcAddress( hLib, "GetMessageA" ); ::ReadProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, dwSize ); *(DWORD *)( btNewBytes + 1 ) = (DWORD)new_GetMessage; ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes, sizeof(DWORD)*2, dwSize ); hDebug = ::CreateFile( "C:\\Trace.log", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 ); } } if( hOldHook != NULL ) { return CallNextHookEx( hOldHook, nCode, wParam, lParam ); } return 0; } 上面的钩子函数,只有第一次运行时有用,就是把三个函数的首8字节修改一下(实际上只需要7个)。btNewBytes中的指令实际就是 mov eax, 0x400000 jmp eax 这里的0x400000就是新的函数的地址,比如new_recv/new_send/new_GetMessage,此时,偷梁换柱已经完成。再看看我们的函数中都干了些什么。以GetMessageA为例: BOOL _stdcall new_GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax ) { DWORD dwSize; char szTemp[256]; BOOL r = false; //Watch here before it's executed. sprintf( szTemp, "Before GetMessage : HWND 0x%8.8X, msgMin 0x%8.8X, msgMax 0x%8.8x \r\n", hWnd, wMsgFilterMin, wMsgFilterMax ); ::WriteFile( hDebug, szTemp, strlen(szTemp), dwSize, 0 ); //Watch over // restore it at first ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)dwOldBytes[2], sizeof(DWORD)*2, dwSize ); // execute it r = pGetMessage( lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax ); // hook it again *(DWORD *)( btNewBytes + 1 ) = (DWORD)new_GetMessage; ::WriteProcessMemory( INVALID_HANDLE_value, (void *)pGetMessage, (void *)btNewBytes, sizeof(DWORD)*2, dwSize ); //Watch here after it's executed sprintf( szTemp, "Result of GetMessage is %d.\r\n", r ); ::WriteFile( hDebug, szTemp, strlen( szTemp ), dwSize, 0 ); if( r ) { sprintf( szTemp, "Msg : HWND 0x%8.8X, MSG 0x%8.8x, wParam 0x%8.8X, lParam 0x%8.8X\r\nTime 0x%8.8X, X %d, Y %d\r\n", lpMsg-hwnd, lpMsg-message, lpMsg-wParam, lpMsg-lParam, lpMsg-time, lpMsg-pt.x, lpMsg-pt.y ); ::WriteFile( hDebug, szTemp, strlen( szTemp ), dwSize, 0 ); } strcpy( szTemp, "\r\n" ); ::WriteFile( hDebug, szTemp, strlen( szTemp ), dwSize, 0 ); //Watch over return r; } 先将截获下来的参数,写入到一个log文件中,以便分析。然后恢复原先保留下来的GetMessageA的首8字节,然后执行真正的GetMessageA调用,完毕后再将执行结果也写入log文件,然后将GetMessageA的执行结果返回给调用者。 整个截获的过程就是这样。你可以把其中的写log部分改成你自己想要的操作。这里有个不足的地方是,截获动作是不能够并发进行的,如果目标进程是多线程的,就会有问题。解决办法是,可以在每次new_GetMessage中加入一个CriticalSection的锁和解锁,以使调用变为串行进行,以原始套接字的方式 截获流经本机网卡的IP数据包 从事网络安全的技术人员和相当一部分准黑客(指那些使用现成的黑客软件进行攻击而不是根据需要去自己编写代码的人)都一定不会对网络嗅探器(sniffer)感到陌生,网络嗅探器无论是在网络安全还是在黑客攻击方面均扮演了很重要的角色。通过使用网络嗅探器可以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析。此分析结果可供网络安全分析之用,但如为黑客所利用也可以为其发动进一步的攻击提供有价值的信息。可见,嗅探器实际是一把双刃剑。 虽然网络嗅探器技术被黑客利用后会对网络安全构成一定的威胁,但嗅探器本身的危害并不是很大,主要是用来为其他黑客软件提供网络情报,真正的攻击主要是由其他黑软来完成的。而在网络安全方面,网络嗅探手段可以有效地探测在网络上传输的数据包信息,通过对这些信息的分析利用是有助于网络安全维护的。权衡利弊,有必要对网络嗅探器的实现原理进行介绍。 文章正文 嗅探器设计原理 嗅探器作为一种网络通讯程序,也是通过对网卡的编程来实现网络通讯的,对网卡的编程也是使用通常的套接字(socket)方式来进行。但是,通常的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取到达的数据包。而网络嗅探器的目的恰恰在于从网卡接收所有经过它的数据包,这些数据包即可以是发给它的也可以是发往别处的。显然,要达到此目的就不能再让网卡按通常的正常模式工作,而必须将其设置为混杂模式。 具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(raw socket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开始对网络数据包进行嗅探了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成。但是与其他两种套接字不同的是,原始套接字此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP头、 TCP头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。下面先给出结构.数据包的总体结构: 数据包 IP头 TCP头(或其他信息头) 数据 数据在从应用层到达传输层时,将添加TCP数据段头,或是UDP数据段头。其中UDP数据段头比较简单,由一个8字节的头和数据部分组成,具体格式如下: 16位 16位 源端口 目的端口 UDP长度 UDP校验和 而TCP数据头则比较复杂,以20个固定字节开始,在固定头后面还可以有一些长度不固定的可选项,下面给出TCP数据段头的格式组成: 16位 16位 源端口 目的端口 顺序号 确认号 TCP头长 (保留)7位 URG ACK PSH RST SYN FIN 窗口大小 校验和 紧急指针 可选项(0或更多的32位字) 数据(可选项) 对于此TCP数据段头的分析在编程实现中可通过数据结构_TCP来定义: typedef struct _TCP{ WORD SrcPort; // 源端口 WORD DstPort; // 目的端口 DWORD SeqNum; // 顺序号 DWORD AckNum; // 确认号 BYTE DataOff; // TCP头长 BYTE Flags; // 标志(URG、ACK等) WORD Window; // 窗口大小 WORD Chksum; // 校验和 WORD UrgPtr; // 紧急指针 } TCP; typedef TCP *LPTCP; typedef TCP UNALIGNED * ULPTCP; 在网络层,还要给TCP数据包添加一个IP数据段头以组成IP数据报。IP数据头以大端点机次序传送,从左到右,版本字段的高位字节先传输(SPARC是大端点机;Pentium是小端点机)。如果是小端点机,就要在发送和接收时先行转换然后才能进行传输。IP数据段头格式如下: 16位 16位 版本 IHL 服务类型 总长 标识 标志 分段偏移 生命期 协议 头校验和 源地址 目的地址 选项(0或更多) 同样,在实际编程中也需要通过一个数据结构来表示此IP数据段头,下面给出此数据结构的定义: typedef struct _IP{ union{ BYTE Version; // 版本 BYTE HdrLen; // IHL }; BYTE ServiceType; // 服务类型 WORD TotalLen; // 总长 WORD ID; // 标识 union{ WORD Flags; // 标志 WORD FragOff; // 分段偏移 }; BYTE TimeToLive; // 生命期 BYTE Protocol; // 协议WORD HdrChksum; // 头校验和 DWORD SrcAddr; // 源地址 DWORD DstAddr; // 目的地址 BYTE Options; // 选项 } IP; typedef IP * LPIP; typedef IP UNALIGNED * ULPIP; 在明确了以上几个数据段头的组成结构后,就可以对捕获到的数据包进行分析了。 嗅探器的具体实现 根据前面的设计思路,不难写出网络嗅探器的实现代码,下面就给出一个简单的示例,该示例可以捕获到所有经过本地网卡的数据包,并可从中分析出协议、IP源地址、IP目标地址、TCP源端口号、TCP目标端口号以及数据包长度等信息。由于前面已经将程序的设计流程讲述的比较清楚了,因此这里就不在赘述了,下面就结合注释对程序的具体是实现进行讲解,同时为程序流程的清晰起见,去掉了错误检查等保护性代码。主要代码实现清单为: // 检查 Winsock 版本号,WSAData为WSADATA结构对象 WSAStartup(MAKEWORD(2, 2), WSAData); // 创建原始套接字 sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)); // 设置IP头操作选项,其中flag 设置为ture,亲自对IP头进行处理 setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)flag, sizeof(flag)); // 获取本机名 gethostname((char*)LocalName, sizeof(LocalName)-1); // 获取本地 IP 地址 pHost = gethostbyname((char*)LocalName)); // 填充SOCKADDR_IN结构 addr_in.sin_addr = *(in_addr *)pHost-h_addr_list[0]; //IP addr_in.sin_family = AF_INET; addr_in.sin_port = htons(57274); // 把原始套接字sock 绑定到本地网卡地址上 bind(sock, (PSOCKADDR)addr_in, sizeof(addr_in)); // dwValue为输入输出参数,为1时执行,0时取消 DWORD dwValue = 1; // 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL // 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) ioctlsocket(sock, SIO_RCVALL, dwValue); 前面的工作基本上都是对原始套接字进行设置,在将原始套接字设置完毕,使其能按预期目的工作时,就可以通过recv()函数从网卡接收数据了,接收到的原始数据包存放在缓存RecvBuf[]中,缓冲区长度BUFFER_SIZE定义为65535。然后就可以根据前面对IP数据段头、TCP数据段头的结构描述而对捕获的数据包进行分析: while (true) { // 接收原始数据包信息 int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0); if (ret 0) { // 对数据包进行分析,并输出分析结果 ip = *(IP*)RecvBuf; tcp = *(TCP*)(RecvBuf + ip.HdrLen); TRACE("协议: %s\r\n",GetProtocolTxt(ip.Protocol)); TRACE("IP源地址: %s\r\n",inet_ntoa(*(in_addr*)ip.SrcAddr)); TRACE("IP目标地址: %s\r\n",inet_ntoa(*(in_addr*)ip.DstAddr)); TRACE("TCP源端口号: %d\r\n",tcp.SrcPort); TRACE("TCP目标端口号:%d\r\n",tcp.DstPort); TRACE("数据包长度: %d\r\n\r\n\r\n",ntohs(ip.TotalLen)); } } 其中,在进行协议分析时,使用了GetProtocolTxt()函数,该函数负责将IP包中的协议(数字标识的)转化为文字输出,该函数实现如下: #define PROTOCOL_STRING_ICMP_TXT "ICMP" #define PROTOCOL_STRING_TCP_TXT "TCP" #define PROTOCOL_STRING_UDP_TXT "UDP" #define PROTOCOL_STRING_SPX_TXT "SPX" #define PROTOCOL_STRING_NCP_TXT "NCP" #define PROTOCOL_STRING_UNKNOW_TXT "UNKNOW" …… CString CSnifferDlg::GetProtocolTxt(int Protocol) { switch (Protocol){ case IPPROTO_ICMP : //1 /* control message protocol */ return PROTOCOL_STRING_ICMP_TXT; case IPPROTO_TCP : //6 /* tcp */ return PROTOCOL_STRING_TCP_TXT; case IPPROTO_UDP : //17 /* user datagram protocol */ return PROTOCOL_STRING_UDP_TXT; default: return PROTOCOL_STRING_UNKNOW_TXT; } 最后,为了使程序能成功编译,需要包含头文件winsock2.h和ws2tcpip.h。在本示例中将分析结果用TRACE()宏进行输出,在调试状态下运行,得到的一个分析结果如下: 协议: UDP IP源地址: 172.168.1.5 IP目标地址: 172.168.1.255 TCP源端口号: 16707 TCP目标端口号:19522 数据包长度: 78 …… 协议: TCP IP源地址: 172.168.1.17 IP目标地址: 172.168.1.1 TCP源端口号: 19714 TCP目标端口号:10 数据包长度: 200 …… 从分析结果可以看出,此程序完全具备了嗅探器的数据捕获以及对数据包的分析等基本功能。 小结 本文介绍的以原始套接字方式对网络数据进行捕获的方法实现起来比较简单,尤其是不需要编写VxD虚拟设备驱动程序就可以实现抓包,使得其编写过程变的非常简便,但由于捕获到的数据包头不包含有帧信息,因此不能接收到与 IP 同属网络层的其它数据包, 如 ARP数据包、RARP数据包等。在前面给出的示例程序中考虑到安全因素,没有对数据包做进一步的分析,而是仅仅给出了对一般信息的分析方法。通过本文的介绍,可对原始套接字的使用方法以及TCP/IP协议结构原理等知识有一个基本的认识。
防火墙的抗攻击拦截特性,比如针对网络中的数据包的arp flood、udp flood、syn flood、ping of death等是可以设置阈值的,当数据包超过阈值防火墙即会对数据包进行拦截或报警;但是超过阈值不一定就发生了攻击行为,有可能是正常应用的大量并发连接导致防火墙发生误报;所以在实际的配置中应该根据实际的应用进行阈值的合理调节,避免误报。
一旦找到了服务器存在的问题,那么后果将是严重的。这就是说作为网络管理员应该采取不要的手段防止黑客对服务器进行扫描,本节我将谈谈如何才能让自己的服务器免遭黑客扫描。
一、防范黑客心得体会:
1、屏蔽可以IP地址:
这种方式见效最快,一旦网络管理员发现了可疑的IP地址申请,可以通过防火墙屏蔽相对应的IP地址,这样黑客就无法在连接到服务器上了。但是这种方法有很多缺点,例如很多黑客都使用的动态IP,也就是说他们的IP地址会变化,一个地址被屏蔽,只要更换其他IP仍然可以进攻服务器,而且高级黑客有可能会伪造IP地址,屏蔽的也许是正常用户的地址。
2、过滤信息包:
通过编写防火墙规则,可以让系统知道什么样的信息包可以进入、什么样的应该放弃,如此一来,当黑客发送有攻击性信息包的时候,在经过防火墙时,信息就会被丢弃掉,从而防止了黑客的进攻。但是这种做法仍然有它不足的地方,例如黑客可以改变攻击性代码的形态,让防火墙分辨不出信息包的真假;或者黑客干脆无休止的、大量的发送信息包,知道服务器不堪重负而造成系统崩溃。
3、修改系统协议:
对于漏洞扫描,系统管理员可以修改服务器的相应协议,例如漏洞扫描是根据对文件的申请返回值对文件存在进行判断的,这个数值如果是200则表示文件存在于服务器上,如果是404则表明服务器没有找到相应的文件,但是管理员如果修改了返回数值、或者屏蔽404数值,那么漏洞扫描器就毫无用处了。
4、经常升级系统版本:
任何一个版本的系统发布之后,在短时间内都不会受到攻击,一旦其中的问题暴露出来,黑客就会蜂拥而致。因此管理员在维护系统的时候,可以经常浏览著名的安全站点,找到系统的新版本或者补丁程序进行安装,这样就可以保证系统中的漏洞在没有被黑客发现之前,就已经修补上了,从而保证了服务器的安全。
5、及时备份重要数据:
亡羊补牢,如果数据备份及时,即便系统遭到黑客进攻,也可以在短时间内修复,挽回不必要的经济损失。想国外很多商务网站,都会在每天晚上对系统数据进行备份,在第二天清晨,无论系统是否收到攻击,都会重新恢复数据,保证每天系统中的数据库都不会出现损坏。数据的备份最好放在其他电脑或者驱动器上,这样黑客进入服务器之后,破坏的数据只是一部分,因为无法找到数据的备份,对于服务器的损失也不会太严重。
然而一旦受到黑客攻击,管理员不要只设法恢复损坏的数据,还要及时分析黑客的来源和攻击方法,尽快修补被黑客利用的漏洞,然后检查系统中是否被黑客安装了木马、蠕虫或者被黑客开放了某些管理员账号,尽量将黑客留下的各种蛛丝马迹和后门分析清除、清除干净,防止黑客的下一次攻击。
6、使用加密机制传输数据:
对于个人信用卡、密码等重要数据,在客户端与服务器之间的传送,应该仙经过加密处理在进行发送,这样做的目的是防止黑客监听、截获。对于现在网络上流行的各种加密机制,都已经出现了不同的破解方法,因此在加密的选择上应该寻找破解困难的,例如DES加密方法,这是一套没有逆向破解的加密算法,因此黑客的到了这种加密处理后的文件时,只能采取暴力破解法。个人用户只要选择了一个优秀的密码,那么黑客的破解工作将会在无休止的尝试后终止。
二、防火墙使用说明:
1.什么是防火墙?
防火墙的英文叫做firewall,它能够在网络与电脑之间建立一道监控屏障,保护在防火墙内部的系统不受网络黑客的攻击。逻辑上讲,防火墙既是信息分离器、限制器,也是信息分析器,它可以有效地对局域网和Internet之间的任何活动进行监控,从而保证局域网内部的安全。
网络上最著名的软件防火墙是LockDown2000,这套软件需要经过注册才能获得完整版本,它的功能强大,小到保护个人上网用户、大到维护商务网站的运作,它都能出色的做出惊人的表现。但因为软件的注册需要一定费用,所以对个人用户来说还是选择一款免费的防火墙更现实。天网防火墙在这里就更加适合个人用户的需要了,天网防火墙个人版是一套给个人电脑使用的网络安全程序,它能够抵挡网络入侵和攻击,防止信息泄露。
2、天网防火墙的基本功能:
天网防火墙个人版把网络分为本地网和互联网,可以针对来自不同网络的信息,来设置不同的安全方案,以下所述的问题都是针对互联网而言的,故所有的设置都是在互联网安全级别中完成的。 怎样防止信息泄露? 如果把文件共享向互联网开放,而且又不设定密码,那么别人就可以轻松的通过互联网看到您机器中的文件,如果您还允许共享可写,那别人甚至可以删除文件。 你可以在个人防火墙的互联网安全级别设置中,将NETBIOS 关闭,这样别人就不能通过INTERNET访问你的共享资源了(这种设置不会影响你在局域网中的资源共享)。
当拨号用户上网获得了分配到的IP地址之后,可以通过天网防火墙将ICMP关闭,这样黑客用PING的方法就无法确定使用者的的系统是否处于上网状态,无法直接通过IP地址获得使用者系统的信息了。
需要指出的是:防火墙拦截的信息并不完全是攻击信息,它记录的只是系统在安全设置中所拒绝接收的数据包。在某些情况下,系统可能会收到一些正常但又被拦截的数据包,例如某些路由器会定时发出一些IGMP包等;或有些主机会定时PING出数据到本地系统确认连接仍在维持着,这个时候如果利用防火墙将ICMP和IGMP屏蔽了,就会在安全记录中见到这些被拦截的数据包,因此这些拦截下来的数据包并不一定是黑客对系统进行攻击造成的。
3、使用防火墙的益处:
使用防火墙可以保护脆弱的服务,通过过滤不安全的服务,Firewall可以极大地提高网络安全和减少子网中主机的风险。例如,Firewall可以禁止NIS、NFS服务通过,同时可以拒绝源路由和ICMP重定向封包。
另外防火墙可以控制对系统的访问权限,例如某些企业允许从外部访问企业内部的某些系统,而禁止访问另外的系统,通过防火墙对这些允许共享的系统进行设置,还可以设定内部的系统只访问外部特定的Mail Server和Web Server,保护企业内部信息的安全。
4、防火墙的种类:
防火墙总体上分为包过滤、应用级网关和代理服务器等三种类型:
(1)数据包过滤
数据包过滤(Packet Filtering)技术是在网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制表(Access Control Table)。通过检查数据流中每个数据包的源地址、目的地址、所用的端口号、协议状态等因素,或它们的组合来确定是否允许该数据包通过。 数据包过滤防火墙逻辑简单,价格便宜,易于安装和使用,网络性能和透明性好,它通常安装在路由器上。路由器是内部网络与Internet连接必不可少的设备,因此在原有网络上增加这样的防火墙几乎不需要任何额外的费用。
数据包过滤防火墙的缺点有二:一是非法访问一旦突破防火墙,即可对主机上的软件和配置漏洞进行攻击;二是数据包的源地址、目的地址以及IP的端口号都在数据包的头部,很有可能被窃听或假冒。
(2)应用级网关
应用级网关(Application Level Gateways)是在网络应用层上建立协议过滤和转发功能。它针对特定的网络应用服务协议使用指定的数据过滤逻辑,并在过滤的同时,对数据包进行必要的分析、登记和统计,形成报告。实际中的应用网关通常安装在专用工作站系统上。
数据包过滤和应用网关防火墙有一个共同的特点,就是它们仅仅依靠特定的逻辑判定是否允许数据包通过。一旦满足逻辑,则防火墙内外的计算机系统建立直接联系,防火墙外部的用户便有可能直接了解防火墙内部的网络结构和运行状态,这有利于实施非法访问和攻击。
(3)代理服务
代理服务(Proxy Service)也称链路级网关或TCP通道(Circuit Level Gateways or TCP Tunnels),也有人将它归于应用级网关一类。它是针对数据包过滤和应用网关技术存在的缺点而引入的防火墙技术,其特点是将所有跨越防火墙的网络通信链路分为两段。防火墙内外计算机系统间应用层的" 链接",由两个终止代理服务器上的" 链接"来实现,外部计算机的网络链路只能到达代理服务器,从而起到了隔离防火墙内外计算机系统的作用。此外,代理服务也对过往的数据包进行分析、注册登记,形成报告,同时当发现被攻击迹象时会向网络管理员发出警报,并保留攻击痕迹。
花钱下载的文章,希望对你有帮助!
用专业术语来说,防火墙是一种位于两个或多个网络间,实施网
络之 访问控制的组件集合。对于普通用户来说,所谓 “ 防火墙”,
指的就是一种破放置在自己的计算机与外界网络之间的防御系统,从
网络发往计算机的所有数据都要经过它的判断处理后,才会决定能不
能把这些数据交给计算机,一旦发现有害数据,防火墙就会拦截下
来,实现了对汁算机的保护功能。
1 防火墙的主要功能
(1 )防火墙是网络安全的屏障。一个防火墙能极大地提高一个
内部网络的安全性,并通过过滤不安全的服务而降低风险。由于只有
经过精心选择的应用协议才能过防火墙,所以网络环境变得更安全。
如防火墙可以禁止诸如众所』 吉 I 知的不安全的NF S 协议进出受保护网
络,这样外部的攻击者就不可能利1 } f 】 这些脆弱的协议来攻击内部网
络。防火墙吲时可以保护网络免受基于路由的攻击 ,如I P 选项中的源
路由攻击和I CMP 重定向中的重定向路径。防火墙应该可以拒绝所有
以上类型攻击的报文并通知系统管理员。
( 2)防火墙可以强化网络安全策略。通过以防火墙为中心的安
全方案配置 ,能将所有安全软件 ( 如口令、加密、身份认证、审计
等)配置在防火墙上。与将网络安全问题分散到各个主机上相比,防
火墙的集中安全管理更经济。例如在网络访 时,一次一密口令系统
和其它的身份认证系统完全可以不必分散在各个主机上,而集中在防
火墙上。
( 3)对婀络存取和访问进行监控审汁。如果所有的访i ' u 】 部经过
防火墙 ,那么,防火墙就能记录下这些访问并作出E t 志汜录, 时也
能提供网络使用情况的统计数据。当发生可疑动作时,防火墙能进行
适当的报警,并提供网络是否受到监测和攻击的详细信息。另外,收
集一个网络的使用和误用情况也是非常重要的 首先的理由是可以清
楚防火墙是否能够抵挡攻击者的探测和攻击,并且清楚防火墙的控制
是否充足。而网络使用统汁对I 矧络需求分析和威胁分析等而言也是非
常重要的。
( 4)防止内部信息的外泄。通过利用防火墙对内部网络的划
分,可实现内部网重点网段的隔离 ,从而限制了局部重点或敏感网络
安全问题对全局网络造成的影响。使用防火墙就可以隐蔽那些透漏内
部细节j t l F i n g e r ,DNS 等服务。F i n g e r 显示了主机的所有用户的注册
名、真名,最后器录时间和使用s h e l l 类型等。但是F i n g e r 显示的信息
非常容易被攻击者所获悉。攻击者可以知道一个系统使用的频繁程
度,这个系统是否有用户正在连线上嘲,这个系统是否在被攻击时引
起注意等等。防火墙可以同样阻塞有关内部网络中的DNS 信息,这样
一
台主机的域名和I P 地址就不会谈外界所了解。
2 防火墙体系结构
(1 )双宿/ 多宿主机。这种模式是在堡垒主机上配置两块或两块
以上的网卡实现的。其中,一块网卡用于外部网络 ,而其余网卡则用
于内部网络,并通过代理服务系统来实现防火墙的各种功能。
( 2)屏蔽主机。这种模式是在双宿/ 多宿主机模式的基础上增加
外部过滤路由没备实现的。堡垒主机通过一个外部过滤路由器进行连
接,在通过代 服务系统将外部过滤路由器传来的消息于内部网络联
系在一起,从而起到保护内部网络的作用。
( 3)屏蔽子网。这种模式是在屏蔽主饥模式的基础上增加内部
过滤路由设备实现的。堡垒主机使用的两个过滤路由器,分别于内部
网络和外部网络连接,再通过代理服务系统处理经过过滤路d t 器的信息
3 防火墙包过滤技术
(1 ) “ 包过滤”技术简介。 “ 包过滤”是最早使用的一种防火
墙技术,也是防火墙所要实现的最基本功能,它可将不符合要求的包
过滤掉。它的第一代模型是 “ 静态包过滤”,使用包过滤技术的防火
墙通常工作在o s i 模型 中的网络层上,后来发展更新的 “ 动态包过
滤”增加了传输层 ,简言之 ,包过滤技术工作的地方就是各种基于
T C P / I P 协议的数据报文进出的通道 ,它把这两层作为数据监控的对
象,对每个数据包的头部、协议、地址 、端口、类型等信息进行分
析,并与预先没定好的防火墙过滤规则进行核对,一旦发现某个包的
某个或多个部分与过滤规则匹配并且条件为 “ 阻止”的时候,这个包
就会被丢弃。
( 2) “ 包过滤”防火墙的一般工作原理。包过滤是在I P 层实现
的,因此,它可以只用路由器完成。包过滤根据包的源I P J ~J L、目的
I P 地址、源端口、目的端口及包传递方向等报头信息来判断是否允许
包通过。过滤用户定义的内容,如I P 地址。其工作原理是系统在网络
层检查数据包 ,与应用层无关 ,包过滤器的应用非常广泛 ,因为
CP U用来处理包过滤的时间可以忽略不汁。而且这种防护措施对用户
透明,合法用户在进出网络时,根本感觉不到它的存在,使用起来很
方便。这样系统就具有很好的传输性能,易扩展:但是这种防火墙不
太安全,因为系统对应用层信息无感知也就是说,它们不理解通信的
内容,不能在用户级别上进行过滤 ,即不能识别不同的用户和防止
I P 地址的盗用。如果攻击者把自己主机的I P 地址没成一个合法主机的
l P 地址,就可以很轻易地通过包过滤器,这样更容易被黑客攻破。
( 3)黑客攻击包过滤防火墙的常用手段。 “ I P 地址欺骗”是黑
客比较常用的一种攻击手段。黑客们 包过滤防火墙发出一系列信息
包 ,这些包中的l P 地址已经被替换为一串顺序的I P 地址,一旦有一个
包通过了防火墙,黑客便可以用这个I P 地址来伪装他们发出的信息。
攻击者向被攻击的计算机发出许许多多个虚假的 “ 同步请求”信息
包 ,目标计算机响应了这种信息包后会等待请求发出者的应答.而攻
击者却不做任何回应 ,服务器在一定时间里没有收到响应信号的话就
会结束这次请求连接 ,但是当服务器在遇到成千上万个虚假请求时,
它便没有能力来处理正常的用户服务请求,处于这种攻下的服务器表 现为性能下降,服务响应时间变长,严重时服务完全停止甚至死机。
但是 ,如果防火墙能结合接口,地址来匹配,这种攻击就不能成功。
4 包过滤技术的优缺点及其发展趋势
随着网络应用的增加,对网络带宽提出了更高的要求。这意味着
防火墙要能够以非常高的速率处理数据。为了满足这种需要,一些防
火墙制造商开发了基于AS I C 的防火墙和基于网络处理器的防火墙。
从执行速度的角度看来 ,基于网络处理器的防火墙也是基于软件的解
决方案,它需要在很大程度上依赖于软件的性能,但是由于这类防火
墙中有一些专门用于处理数据层面任务的引擎,从而减轻了C P U的负
担 ,该类防火墙的性能要比传统防火墙的性能好许多。
一点都不碍事,每天都有大量的冲击波和震荡波中毒电脑向外随机发送数据包,那个IP地址是马来西亚的,没有黑客会愚蠢到数据包被拦截,还不断的发,况且对于黑客来说,建立TCP连接才重要,楼上说的“扫IP”根本就不是UDP方式,而他只是个中毒电脑。你收到UDP包的地址会不断变化。你那里的宽带接入商也太不负责任,这种包早该在网关路由就拦截掉,你给系统打个补丁或干脆不管都可以,天网就爱多事,本来没什么,非要搞得用户紧张,以为它立了什么大功似的。这种情况不会影响你上网和做任何事情。
RNW如薇单 一 一枯登“新品牌新熟TOP 五” 成就 下光暗地里的气力 增加 一年一度 热火朝天的“单 一 一年夜 和”告一段落,据 二0 二 一年 一 一月 一日00:00至 二0 二 一年 一 一月 一 五日 二 三: 五 九: 五 九数据统计,本年 年夜 快消单 一 一新品牌异...
TFT齐称为Thin Film Transistor(厚膜晶体管),是场效应晶体管的品种之一,年夜 致的制造 体式格局是正在基板上轻积各类 分歧 的厚膜,如半导体自动 层、介电层战金属电极层。 对于里板隐示技术感兴致 的,必然 要弄清晰 ,甚么是TFT? 图 一 TFT的汗青 人类 对于 T...
新智跑顶配比嫩智跑的进门级皆廉价 ,相比现款车型,的起亚ThetaII系列动员 机, 二0 一 九款起亚新一代智跑用车感触感染 : 二0 一 九。 杨 九 九 九 二0 一 五- 一0- 九 一 六: 五 六: 二 五,睹图一,只可说一分钱一分货,智跑后继车型,一楼说的很其实 了。起亚智跑。 新...
始谢菜蔬生果 店掉 败的几年夜 缘故原由 寺寺寺寺寺 二0 一 八- 一0-0 四 一 六: 三 六: 三 八第一,便是该入甚么货的答题。菜蔬便没有说了,由于 菜蔬便这么些种类,并且 每一一种类,也没有太分甚么品位。然则 生果 ,学识否便年夜 了。入哪些生果 ,尤为是这些贱的生果 ,该入哪一种。那...
第 一散第 二散第 三散第 四散第 五散第 六散第 七散第 八散第 九散第 一0散第 一 一散第 一 二散第 一 三散第 一 四散第 一 五散第 一 六散第 一 七散第 一 八散第 一 九散第 二0散第 二 一散第 二 二散第 二 三散第 二 四散第 二 五散第 二 六散第 二 七散第 二 八散第 ...
( 一)正在后台模拟 点击一再 访问 其它网站会造成用户挪动流质的益耗。 一 经由 系统 更新路子 拉送马libatel.comCreation Date: 二0 一 九-0 五- 一 六T0 七: 一 二: 三0Z纸不敷 年夜 ,便出有绘图 ,可以或许 参考下面双背ARP诈骗的图。。。 一、针 ...