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

VC++ 實作 QQ (OICQ) 登入號碼清除工具:解析 OICQ2000.cfg 檔案結構與操作

     編輯:關於VC++

早期 QQ (OICQ) 客戶端會將登入過的號碼儲存在安裝目錄下 DAT\OICQ2000.cfg 二進位檔案中。本文詳細解析該檔案格式,並提供 VC++ 程式碼讀取、列出、刪除特定號碼的完整實作,幫助使用者在網咖等公用電腦保護隱私。

OICQ2000.cfg 檔案結構分析

以十六進位檢視範例:

00 00 00 00 00 00 00 01 00 00 00 08 00 00 00 35 33 37 34 38 38 37 36

對應結構:

位移長度說明範例值
09 BytesQQ 號碼總數 (大端序整數,最大 999,999,999)0x0000000000000001 = 1
93 Bytes分隔符 (固定 0x00 0x00 0x00)00 00 00
121 Byte第一個 QQ 號碼長度 (位元數)0x08 = 8 位
133 Bytes分隔符00 00 00
16N BytesQQ 號碼 ASCII 碼 (長度由前一欄位決定)35 33 37 34 38 38 37 36 → "53748876"
...重複後續號碼同樣格式:分隔符(3) + 長度(1) + 分隔符(3) + 號碼

核心程式碼實作

1. 定義檔案頭結構

struct QQHead {
  unsigned char head[9]; // 總號碼數 (9 bytes)
  unsigned char sep[3];  // 分隔符 (3 bytes)
};

2. 讀取並解析所有號碼至 ListBox

CFile ofile;
CFileException fe;
if (!ofile.Open(m_filename, CFile::modeRead, &fe)) return;

QQHead thisHead;
ofile.Read(thisHead.head, 9);

// 計算總數 (大端序 9 bytes 轉長整數)
long sum = 0;
for (int i = 0; i < 8; i++)
  sum = sum * 10 + thisHead.head[i];
sum += thisHead.head[8];

ofile.Read(thisHead.sep, 3); // 讀第一個分隔符

CListBox* pList = (CListBox*)GetDlgItem(IDC_LIST1);
unsigned char len[1];
char strItem[100];

for (long i = 0; i < sum; i++) {
  ofile.Read(len, 1);           // 號碼長度
  ofile.Read(thisHead.sep, 3);  // 分隔符
  int nLen = len[0];
  ofile.Read(strItem, nLen);
  strItem[nLen] = '\0';
  pList->AddString(strItem);
}
ofile.Close();

3. 刪除指定號碼 (雙擊 ListBox 項目觸發)

策略:將檔案完整讀入記憶體 vector<BYTE>,定位目標號碼區塊 (含前導分隔符、長度、號碼),以 erase 移除,再整體寫回檔案。注意更新檔案頭「總數」欄位 (減 1,重新編碼為 9 bytes 大端序)。

完整工具功能

  • 列舉目前機器所有已儲存 QQ 號碼
  • 雙擊選中號碼即可從設定檔永久刪除
  • 支援多帳號環境,操作直觀
  • 綠色免安裝,VC++ 6.0 / Win2000 編譯通過

注意事項與版本差異

  • 僅適用於 OICQ 2000 / QQ 2000~2003 早期版本。新版 QQ (NT/Protocal 3.0+) 改用加密資料庫 (MsgEx.db、User.db) 儲存,本工具無效。
  • 修改設定檔前建議備份,避免損壞導致 QQ 無法啟動。
  • 網管環境下可能無寫入權限,需以管理員身分執行。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved