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注入學習分享

球分享

球點贊

球在看

點擊“閲讀原文”,瞭解更多!