登入型別 TDS 封包處理流程:
.text:0065C880 mov cl, [edi] ; 取得密文字元
.text:0065C882 mov dl, cl ; 備份
.text:0065C884 xor cl, 5 ; cl ^= 0x05
.text:0065C887 xor dl, 0AFh ; dl ^= 0xAF
.text:0065C88A shr dl, 4 ; dl >>= 4
.text:0065C88D shl cl, 4 ; cl <<= 4
.text:0065C890 or dl, cl ; dl |= cl
.text:0065C892 mov [edi], dl ; 寫回明文
.text:0065C894 inc edi ; 下一字元
.text:0065C895 dec eax ; 計數器--
.text:0065C896 jnz short loc_65C880
void decrypt_pwd(unsigned char *buf, int len) {
for (int i = 0; i < len; i++) {
unsigned char c = buf[i];
unsigned char d = c;
c ^= 0x05;
d ^= 0xAF;
d >>= 4;
c <<= 4;
buf[i] = d | c;
}
}
結論:極簡的位元運算 (XOR + 移位),無金鑰、無隨機性、等同簡易編碼。嗅探 TDS 登入封包可即時解密。0xA5 非分隔符,乃 0x00 加密後產生;若允許雙位元組密碼,無法作為邊界判斷。
早期版本 (SQL 7.0/2000) 使用專屬雜湊演算法 (非標準 SHA/MD5),長度固定、無鹽值、可預計算彩虹表。sysxlogins.password 欄位儲存雜湊,PWDENCRYPT/PWDCOMPARE 為內部函數。現代版本 (2005+) 改用 SHA-512 + 鹽值,大幅增強。