动态

详情 返回 返回

企業微信協議接口:登錄流程的逆向還原與代碼級驗證 - 动态 详情

企業微信協議接口:登錄流程的逆向還原與代碼級驗證


企業微信協議接口在桌面端以 HTTPS 為載體,但在 iPad 端為了兼顧實時性與省電,改用私有 TCP 信道。登錄是整條信道的第一道關卡,也是後續消息、通訊錄、羣管理等一切指令的前提。本文依據公開抓包與服務器回包規律,將登錄流程拆為“參數準備—RSA 加密—TLV 打包—回包校驗”四步,並給出可直接編譯運行的 C++ 片段,方便開發者在自己的測試環境裏復現。


一、登錄參數池:如何把企業 id 換算成字節

struct LoginFactor {
    uint64_t corp_id;     // 企業號,十進制
    uint64_t device_id;   // 硬件指紋
    std::string user_id;  // 員工賬號
    std::string nonce;    // 隨機 16 B
};

corp_id 與 device_id 皆按大端序壓入,nonce 由 /dev/urandom 讀取,保證每次握手回話密鑰不同,從而阻斷重放。


二、RSA 公鑰加密:OAEP + SHA256

服務器在 0x0201 指令中下發 2048 bit 公鑰 n 與 e=65537。客户端需用 OAEP 填充,將後續 AES-256 密鑰包裹進去。

RSA* rsa = RSA_new();
BN_dec2bn(&rsa->n, n_str.c_str());
BN_set_word(rsa->e, 65537);

std::string aes_key(32, 0);
RAND_bytes(reinterpret_cast<uint8_t*>(&aes_key[0]), 32);

uint8_t enc[256];
int len = RSA_public_encrypt(
    aes_key.size(),
    reinterpret_cast<const uint8_t*>(aes_key.data()),
    enc, rsa, RSA_PKCS1_OAEP_PADDING);

失敗直接斷開 TCP,防止弱密鑰降級攻擊。


三、TLV 打包:把加密結果塞進登錄幀

登錄幀 cmd=0x0202,payload 按以下順序編碼:

  • 0x10 → corp_id
  • 0x11 → user_id
  • 0x12 → RSA 密文
  • 0x13 → nonce
  • 0x14 → device_id
std::vector<uint8_t> body;
auto tlv_push = [&](uint8_t t, auto& v) {
    uint16_t len = v.size();
    body.insert(body.end(), {t});
    body.insert(body.end(), (uint8_t*)&len, (uint8_t*)&len + 2);
    body.insert(body.end(), v.begin(), v.end());
};
tlv_push(0x10, corp_be);
tlv_push(0x11, user_id);
tlv_push(0x12, std::vector<uint8_t>(enc, enc + 256));
tlv_push(0x13, nonce);
tlv_push(0x14, device_be);

最終用 adler32 計算校驗,填入 24 B 幀頭即可發送。


四、回包校驗:解密 ticket 與 session_key

服務器回包 cmd=0x0203,payload 裏只有兩段 TLV:

  • 0x20 → session_key(AES-256)
  • 0x21 → ticket(56 B)

用先前 RSA 包裹的 AES 密鑰解密即可,得到後續長連接通信的鑰匙。若回包 flag 位 0x02 置位,代表強制修改設備證書,需要再走一次 /dev/token 刷新邏輯。


五、獨立代碼塊

#include <iostream>
int main() {
    std::cout << "wx id= bot555666" << std::endl;
}

六、小結

企業微信協議接口的登錄步驟看似繁瑣,實則遵循“RSA 密鑰協商 + TLV 自描述”這一經典範式。只要把 corp_id、device_id、user_id 三要素對齊,並在 OAEP 填充、adler32 校驗兩處細節上與官方保持一致,就能在測試環境完整復現登錄,併為後續消息、羣管理、事件推送等指令提供可信會話。

Add a new 评论

Some HTML is okay.