首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

QQ 登入列表檔案格式逆向分析與 Delphi 實作解密

     編輯:Delphi

漏洞發現背景

早期 QQ(oicq2000.cfg)將登入帳號與「記住密碼」資訊以明文結構化儲存於安裝目錄 dat\oicq2000.cfg,使用者可直接檢視或修改。

檔案結構深度解析

無密碼模式範例

00 00 00 00 00 00 00 00 05 00 00 00 06 00 00 00 31 32 33 34 35 36 06 00 00 00 32 32 32 32 32 32
  • 第 1 位:是否有密碼(00=無,01=有)
  • 第 2-8 位:保留(全 00)
  • 第 9 位:帳號總數(例 05=5組),後接 3 字節分隔符
  • 後續循環:位數長度(3 字節分隔)+ ASCII 碼帳號內容

含密碼模式範例

01 00 00 00 02 00 00 00 92 86 00 00 00 05 00 00 00 06 00 00 00 31 32 33 34 35 36
  • 第 1 位:01 表示含密碼
  • 第 2-8 位:分隔符 + 密碼長度(02=2字元)+ 分隔符
  • 密碼加密:逐位與 0xFF 互補(例 my → 6D 79 → 92 86)

Delphi 核心解析程式碼

讀取無密碼帳號列表

procedure getQQList();
var
  k, i, j: Integer;
  cfg: File;
  Number, Weishu, Hao: Byte;
begin
  AssignFile(cfg, 'x:\xx\oicq2000.cfg');
  try
    Reset(cfg, 1);
    Seek(cfg, 8); k := 8;
    BlockRead(cfg, Number, 1); Inc(k, 4);
    for i := 1 to Number do begin
      x := '';
      Seek(cfg, k); BlockRead(cfg, Weishu, 1); Inc(k, 4);
      for j := 1 to Weishu do begin
        Seek(cfg, k); BlockRead(cfg, Hao, 1); Inc(k);
        x := x + Char(Hao);
      end;
      ListBox1.Items.Add(x);
    end;
  finally
    CloseFile(cfg);
  end;
end;

含密碼讀取邏輯

流程類似,僅在首位判斷密碼標誌,解析長度與加密資料後,以 0xFF - 加密位元組 還原明文密碼。

安全性啟示

此設計暴露極大風險:本地儲存加密強度極低(單純補碼),任何具備檔案存取權限的程式均可枚舉帳號並破解密碼。開發者應採用 DPAPI、金鑰派生函數(PBKDF2/Argon2)等現代加密機制保護敏感資料,避免自行設計脆弱加密方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved