wibu证书 - 初探
2022-9-24 18:0:12 Author: 看雪学苑(查看原文) 阅读量:17 收藏


本文为看雪论坛优秀文章

看雪论坛作者ID:bluefish蓝鱼

最近遇到一个wibu加密的程序,使用wibu证书进行授权,类似于sentianl的软锁SL,没有加密狗。


前期准备

$cmu -vcmu - CodeMeter Universal Support Tool.Version 6.60 of 2017-Dec-18 (Build 2869) for LinuxCopyright (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
cmboxpgm.exe -f6000010 -lif:"MyFirstUfcLif.WibuCmLIF" - lfs:smart:3 -lpn:"Universal Firm Code - 2000" -lpid:2000 -lopt:vm,reimport -v


初步接触

$cmu -i -f xxx.WibuCmLIFcmu - CodeMeter Universal Support Tool.Version 6.60 of 2017-Dec-18 (Build 2869) for LinuxCopyright (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.
sudo netstat -tlp | grep 22350tcp        0      0 0.0.0.0:22350           0.0.0.0:*               LISTEN      12483/CodeMeterLin tcp6       0      0 [::]:22350              [::]:*                  LISTEN      12483/CodeMeterLin
cmu -i -f xxx.WibuCmLIFcmu - CodeMeter Universal Support Tool.Version 6.60 of 2017-Dec-18 (Build 2869) for LinuxCopyright (C) 2007-2017 by WIBU-SYSTEMS AG. All rights reserved. List remote updates failed: A network error occurred, Error 100.


分析CodeMeterLin

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蓝鱼

https://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注入学习分享

6.V8 Array.prototype.concat函数出现过的issues和他们的POC们

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458471429&idx=1&sn=a85188de9b9697fd1b9e708bb8bb1fdb&chksm=b18e7c8f86f9f59933d6cbf0040ed796f06e37b23f17f1ae842eb22257de02338e1a8d751f6b#rd
如有侵权请联系:admin#unsafe.sh