摘要

本文試著分析瞭微信小程序碼的私有編碼協議,當前已經可以從小程序碼中提取有效信息。需要說明,當前所能提取的信息也僅僅是與wx.scanCode接口返回的result一致,其內容疑似是加密的數據,隻在特定情形下有少量未加密數據。

本文主要參考瞭以下兩篇官方文章所透露的一部分小程序碼協議,並參考瞭QR碼(即常見的二維碼)的編碼標準

[1] 【小程序碼設計篇】菊花綻放

[2] 小程序碼是如何「綻放」的

[3] QR_code

小程序碼版本及數據點分佈

根據文獻[2],小程序碼的版本分為36線、54線、72線,每條線上共計13個可識別的黑白數據點。同時,文獻[2]給出瞭36線版本的小程序碼結構,包括各個數據點的分佈和用途。通過簡單實驗發現,54線和72線的小程序碼各數據點的分佈和用途如下圖所示。

36線、54線、72線小程序碼數據點用途。黑色是固定圖案,黃色可繪制廣告、頭像等。棕色不存儲數據(固定填充為黑、白或跟隨臨近點顏色);綠色存儲元數據,表示該碼的版本、糾錯等級、掩碼圖案等;剩餘的灰色點存儲有效數據。

對於三個不同的版本,元數據(綠色)區域的位置是一致的,這是因為在解碼元數據之前不一定能知道小程序碼的版本,需要在不知道小程序碼版本的情況下識別元數據。

通過目測可以發現,上述三個版本數據區域的總數據點數分別為304、416、528個點(都是16的倍數),分別對應304、416、528個比特。

數據點與數據比特映射關系

根據一些測試,輸入比特與圖案中黑白點的映射關系如下。

以72線為例,首先將朝向左側(即9點鐘方向)的線記為0號線,順時針依次是1, 2, …, 71號線,於是18號線位於12點方向,36號線位於3點方向,以此類推。

然後,比特映射的順序是,將第1個比特映射至0號線由內往外的第1個有效數據點,第k個比特映射至0號線由內往外的第k個有效數據點。0號線映射完畢後繼續按照由內往外的方式映射1, 2, …, 71號線直至映射完畢。

對於36線和54線,數據映射關系也可以參照上述流程,對於不存在的線跳過,繼續映射下一線即可。

舉個例子,對於文獻[1]開頭的那張小程序碼,目測它的版本是36線。通過上一節的數據點分佈及這節所述流程,可以讀到它的元數據為:

01110111001……