wibu證書 - 初探

語言: CN / TW / HK

本文為看雪論壇優秀文章

看雪論壇作者ID:bluefish藍魚

最近遇到一個wibu加密的程式,使用wibu證書進行授權,類似於sentianl的軟鎖SL,沒有加密狗。

前期準備

下載執行環境codemeter runtime,我這裡使用的是程式自帶的runtime,版本為6.60,執行平臺為linux。下載連結: http://pan.baidu.com/s/1E_6qsUx57Irc4s-E88fD6g?pwd=koqk 提取碼:koqk

$cmu -v
cmu - CodeMeter Universal Support Tool.
Version 6.60 of 2017-Dec-18 (Build 2869) for Linux
Copyright (C) 2007-2017 by WIBU-SYSTEMS AG. All rights reserved.

Operating System:
Name: Ubuntu 18.04.6 LTS (Kernel 5.4.0-124-generic)
Architecture: x86_64

一個以WibuCmLIF結尾的許可資訊檔案。

由於某種原因,無法分享我在使用的WibuCmLIF檔案,有需要的朋友可以找找使用wibu加密的產品。

空許可資訊檔案的生成可以通過以下命令列,此操作需要測試fsb或廠商fsb,詳情可參考wibu證書的相關使用說明( http://help.wibu.com.cn/help/manual/CodeMeter/42a5 )。

cmboxpgm.exe -f6000010 -lif:"MyFirstUfcLif.WibuCmLIF" - lfs:smart:3 -lpn:"Universal Firm Code - 2000" -lpid:2000 -lopt:vm,reimport -v

初步接觸

先使用cmu -i -f xxx.WibuCmLIF來嘗試匯入許可資訊檔案,結果報錯:無法在虛擬機器上匯入該證書。

$cmu -i -f xxx.WibuCmLIF
cmu - CodeMeter Universal Support Tool.
Version 6.60 of 2017-Dec-18 (Build 2869) for Linux
Copyright (C) 2007-2017 by WIBU-SYSTEMS AG. All rights reserved.

List remote updates failed: It is not permitted to use this license on a virtual machine, Error 273.

只能先跟一下cmu,看看cmu的工作原理。cmu絕大多數的功能都是由libwibucm.so實現。繼續跟蹤該so檔案,發現它connect一個服務端,並將xxx.WibuCmLIF的內容加密後打包傳送,可以大膽的猜測服務端才是這次分析主菜。伺服器端的埠為22350,程式為CodeMeterLin。

sudo netstat -tlp | grep 22350
tcp 0 0 0.0.0.0:22350 0.0.0.0:* LISTEN 12483/CodeMeterLin
tcp6 0 0 [::]:22350 [::]:* LISTEN 12483/CodeMeterLin

cmu還有一個有趣的方法防止除錯,就是上述xxx.WibuCmLIF加密時使用當前時間作為金鑰,伺服器收到加密資料使用接收到資料的時間作為金鑰解密,一旦除錯起來在傳輸的某個過程停留超過幾秒則伺服器無法解密資料,錯誤程式碼如下所示。

cmu -i -f xxx.WibuCmLIF
cmu - CodeMeter Universal Support Tool.
Version 6.60 of 2017-Dec-18 (Build 2869) for Linux
Copyright (C) 2007-2017 by WIBU-SYSTEMS AG. All rights reserved.

List remote updates failed: A network error occurred, Error 100.

分析CodeMeterLin

1、先分析一下CodeMeterLin有哪些演算法,在IDA上最好是使用findcrypt外掛,另外還可使用binwalk或者die。我這裡使用的是die,可以看到有base64和AES、sha256等常用演算法。

2、開啟WibuCmLIF檔案看看,看到這串字串大概就能推斷出是base64加密。解密後放進die看看其熵值,蠻高的,感覺還是加密的狀態。

3、一開始認為需要aes或des解密,在兩個演算法的相關函式下斷點,並沒有發現明顯解密的過程,最後直接追蹤tcp接收流的去向,找到了相關的解密(解擾)演算法,其中0x5917和0x4A6B是演算法引數,而a2初值為WibuCmLIF檔案的時間戳(TimeStamp)。 解完之後可以再看看資料的熵值,看看是不是還需要解密。 如圖,熵值降低了很多,並且能看到明顯的字串,可以認為解密成功了。

char __fastcall license_dec(__int64 a1, __int64 a2)
{
int v2; // edx
char result; // al
_DWORD *v4; // rcx
unsigned __int64 v5; // r8
unsigned __int64 v6; // r8
unsigned int v7; // edx
__int64 v8; // rax

v2 = *(_DWORD *)(a1 + 260);
result = 0;
if ( (v2 & 1) == 0 )
{
result = 1;
if ( (v2 & 2) != 0 )
{
v4 = *(_DWORD **)(a1 + 264);
if ( v4 )
{
v5 = *(_QWORD *)(a1 + 280);
if ( v5 )
{
result = 0;
if ( !a2 )
return result;
v6 = v5 >> 2;
if ( v6 )
{
v7 = 0;
v8 = 0LL;
do
{
v4[v8] ^= a2;
v8 = ++v7;
a2 = 0x5917 * a2 + 0x4A6B;
}
while ( v7 < v6 );
v2 = *(_DWORD *)(a1 + 260);
}
}
}
result = 1;
*(_DWORD *)(a1 + 260) = v2 & 0xFFFFFFFD;
}
}
return result;
}

1、解完後的資料是一段asn1碼流,可以使用一些線上網站初步解析,但裡面有很多wibu自己定義的欄位,需要寫程式碼將這些asn1定義涵蓋進來。

2、這裡先放LIF的解析過程,有興趣的朋友可以自行檢視,後續的檔案也會涉及到這裡面的函式。 這裡先看看虛擬機器檢測函式,大致是檢測CPU資訊、硬碟資訊、中斷表、驅動等,待會需要先強制修改返回值來跳過虛擬機器檢查。

【預告】

接下來會講解一下如何asn1的一些相關知識,以及如何使用CodeMeterLin內的asn1定義解析碼流。

看雪ID:bluefish藍魚

http://bbs.pediy.com/user-home-674195.htm

*本文由看雪論壇 bluefish藍魚 原創,轉載請註明來自看雪社群

2.5折搶購中!限時限量

#

往期推薦

1. 因優化而導致的溢位與CVE-2020-16040

2. LLVM PASS PWN 總結

3. win10 1909逆向之APIC中斷和實驗

4. EMET下EAF機制分析以及模擬實現

5. sql注入學習分享

球分享

球點贊

球在看

點選“閱讀原文”,瞭解更多!