首页
社区
课程
招聘
[原创]Wibu Codemeter 7.3学习笔记——Codemeter服务端
发表于: 2022-12-31 23:58 20345

[原创]Wibu Codemeter 7.3学习笔记——Codemeter服务端

2022-12-31 23:58
20345

看完了回个贴呗,你们的关注是我更新的动力

0x00 准备

CodeMeter.exe Win32 v7.30

IDA Pro

0x01 初见——反调试

之前我说Codemeter的反调试很猛,我收回。Scylla Hide调至VMP档,运行后将爆出的几个错误全部Pass to the Application && Do not suspend or log即可

0x02 初见——从何入手(通信协议部分)

有了前面分析的经验,感觉还是从通信协议入手比较好,顺便看看咱跟人家写的有什么差距。根据前面的分析,我们知道了Codemeter私有协议中最终要的两个函数就是encrypt_telegram和decrypt_telegram。服务器接受到客户端的请求那就必定调用decrypt_telegram解密,向客户端回复数据必定通过encrypt_telegram解密。因此我们第一步就需要确定这两个函数。

用Bindiff就可以轻而易举的解决这个问题。

先对decrypt_telegram下断,跑起来看看谁调用她。然后我们就轻而易举的找的了这个函数

对encrypt_telegram下断,断在这里

查看decrypt_package和encrypt_package的交叉引用,有一个函数同时引用这两个函数

这不由得让我们联想到send_cm_socket_req函数,以为轻松秒杀。但事情真的由这么简单吗?在这个cm_client_encrypt_req中是先调用encrypt_package加密数据包再发送、接收,最后在decrypt_package。这显然与我们对Codemeter服务器加解密逻辑相违背,服务器应当先接受客户端得请求、解密、进行处理之后再加密数据包发送给客户端。因为cm_client_encrypt_req在运行中不会被调用,我怀疑这只是未被移除的测试代码,但cm_client_encrypt_req却是一块敲门砖,观察她得交叉引用

引用不少,凭借直觉以及一眼丁真的分析,大概所有得codemeter api都得跟她有一腿。看看她是如何被调用的

(api_cm_access_2)

这调用方式不由得让我们联想起她同父同母的亲兄妹send_cm_socket_req,*buf+36便是API code(此处 100对应CmAccess2)。但不必花太长时间重命名一下函数,这只是一块敲门砖,用完就扔,我们就重点分析一下api_cm_access_2。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2023-1-2 11:50 被ericyudatou编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (16)
雪    币: 1189
活跃值: (4817)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2

简单的标注一下常用的API

2023-1-2 00:58
0
雪    币: 1189
活跃值: (4817)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3

0x02 初见——服务端的主要加密算法

  1. CRC32
    主要用于通信协议中的校验,和函数签名的校验

  2. SHA1
    仅用于getRandomkey,其余没有调用

  3. SHA256
    用于签名校验,配合ECDSA

  4. AES
    用于数据包的加解密,以及license文件的加解密

  5. ECDSA

    secp224r1{
          p = 0xffffffffffffffffffffffffffffffff000000000000000000000001
          a = 0xfffffffffffffffffffffffffffffffefffffffffffffffffffffffe
          b = 0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4
          n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D
         Gx = 0xB70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21
         Gy = 0xBD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34
    }
    ECDSA 是研究的重点,涉及License文件的验证

最后于 2023-1-3 14:02 被ericyudatou编辑 ,原因:
2023-1-2 09:34
0
雪    币: 1189
活跃值: (4817)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4

0x03 CodeMeter所特有的ECDSA

吐槽一下,FindCrypt貌似不支持ECDSA算法。


其中我们主要关注checkECDSASignature ECDSAEncrypt ECDSASign这几个函数,因为ECDSA算法的原理及其实现论坛上一抓一大把,我这里只说说这些函数在CodeMeter中的用处以及定位方法

checkECDSASignature

BOOL __cdecl checkECDSASignature(
        char *ecdsa,
        unsigned __int8 *pubKey,
        unsigned __int8 *pbSignature,
        unsigned __int8 *mabDigest)
{
  BOOL result; // eax
  void *curve_n; // [esp+10h] [ebp-A8h] BYREF
  void *curve_G_y; // [esp+14h] [ebp-A4h] BYREF
  void *curve_G_x; // [esp+18h] [ebp-A0h] BYREF
  __int128 pSignature_2[2]; // [esp+1Ch] [ebp-9Ch] BYREF
  char a2[16]; // [esp+3Ch] [ebp-7Ch] BYREF
  __int128 v10; // [esp+4Ch] [ebp-6Ch]
  int pSignature_1[7]; // [esp+5Ch] [ebp-5Ch] BYREF
  int pubkey[4]; // [esp+78h] [ebp-40h] BYREF
  __int128 v13; // [esp+88h] [ebp-30h]
  char plaintext[4]; // [esp+98h] [ebp-20h] BYREF

  result = sub_B1C960(ecdsa, (int)pubKey, 32);
  if ( result )
  {
    bignum_copy((int)pSignature_1, pbSignature, 0x1Cu);
    bignum_copy((int)pSignature_2, pbSignature + 32, 0x1Cu);
    bignum_copy((int)plaintext, mabDigest, 0x1Cu);
    get_ecdsa_curve(&curve_n, &curve_G_x, &curve_G_y);
    result = bignum_compare_int((int)pSignature_1, (int)curve_n, 7);
    if ( !result )
    {
      result = bignum_compare_int((int)pSignature_1, 0, 7);
      if ( result != 3 )
      {
        result = bignum_compare_int((int)pSignature_2, (int)curve_n, 7);
        if ( !result )
        {
          result = bignum_compare_int((int)pSignature_2, 0, 7);
          if ( result != 3 )
          {
            sub_B1FBE0(pSignature_2, (int)a2, curve_n, 7);
            sub_B1FE90((int)plaintext, (int)a2, curve_n, 7);
            sub_B1FE90((int)a2, (int)pSignature_1, curve_n, 7);
            bignum_copy((int)pubkey, pubKey, 0x1Cu);
            bignum_copy((int)pSignature_2, pubKey + 32, 0x1Cu);
            result = init_ecdsa_curve_G(ecdsa, a2, 7, pubkey, pSignature_2);
            if ( result )
            {
              *(_OWORD *)a2 = *(_OWORD *)ecdsa;
              v10 = *((_OWORD *)ecdsa + 1);
              pSignature_2[0] = *((_OWORD *)ecdsa + 2);
              pSignature_2[1] = *((_OWORD *)ecdsa + 3);
              *(_OWORD *)pubkey = *((_OWORD *)ecdsa + 4);
              v13 = *((_OWORD *)ecdsa + 5);
              result = init_ecdsa_curve_G(ecdsa, plaintext, 7, curve_G_x, curve_G_y);
              if ( result )
              {
                result = sub_B1BC30(ecdsa, a2, (int)pSignature_2, (int)pubkey);
                if ( result )
                {
                  result = bignum_compare_int((int)(ecdsa + 64), 0, 7);
                  if ( result != 3 )
                  {
                    init_ecdsa_curve_p(ecdsa);
                    result = bignum_compare_int((int)ecdsa, (int)pSignature_1, 7);
                    if ( result == 3 )
                      return 1;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  return 0;
}

用处:

client CmValiateSignature验证签名

server License授权校验 Licensor Public Key检查 etc

破解方法:

函数尾xor eax,eax改成mov  al,1 就能爆掉证书检查

定位方法:

  1. 搜索字符串 “Licensor Public Key Signature is invalid.”,串参找引用,只有一个函数


  2. 这个便是checkECDSASignature

(未完待续)

最后于 2023-1-3 16:50 被ericyudatou编辑 ,原因:
2023-1-3 16:50
0
雪    币: 156
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
license使用时间过期的能爆破么
2023-1-3 17:56
0
雪    币: 12
活跃值: (671)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢大佬的分享!文章还更新吗?
2023-1-5 22:41
0
雪    币: 1189
活跃值: (4817)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
7
whshizy 感谢大佬的分享!文章还更新吗?
更,看着答辩一样的代码快吐了,缓两天
2023-1-5 23:43
0
雪    币: 4651
活跃值: (4617)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
大佬什么时候研究一下SafeNet Sentinel LDK的证书授权
2023-1-6 14:33
0
雪    币: 156
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
ericyudatou 0x03 CodeMeter所特有的ECDSA吐槽一下,FindCrypt貌似不支持ECDSA算法。其中我们主要关注checkECDSASignature ECDSAEncrypt& ...
最新版本7.5和7.3差异挺大,Licensor Public Key Signature is invalid. 字符串都找不到
2023-1-14 21:59
0
雪    币: 1189
活跃值: (4817)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
lxr677 最新版本7.5和7.3差异挺大,Licensor Public Key Signature is invalid. 字符串都找不到
可以试试搜截图里头的常数
2023-1-14 23:11
0
雪    币: 156
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
ericyudatou 可以试试搜截图里头的常数
最新版本那些常数都已经搜不到了,我看变动还挺大的,以前能找到的导入license的那些读取系统变量的也都找不到了,大概率重写了
2023-1-22 11:33
0
雪    币: 1189
活跃值: (4817)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
12
lxr677 license使用时间过期的能爆破么
有license就能做出永久的假服务器
2023-1-26 23:16
0
雪    币: 101
活跃值: (97)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
狗内的授权可以提取?然后脱狗运行吗?
2023-1-27 21:04
0
雪    币: 2903
活跃值: (2839)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主太厉害了,膜拜
2023-1-28 16:57
0
雪    币: 232
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
楼主太厉害了,膜拜
2023-2-28 15:47
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16

加个qq2528658984  我这个有几个wibu 激活文件


最后于 2023-4-28 18:02 被机械战甲编辑 ,原因:
2023-4-28 18:01
0
雪    币: 2167
活跃值: (3569)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
ericyudatou 0x03 CodeMeter所特有的ECDSA吐槽一下,FindCrypt貌似不支持ECDSA算法。其中我们主要关注checkECDSASignature ECDSAEncrypt& ...
楼主,请教下,0x03 CodeMeter所特有的ECDSA
吐槽一下,FindCrypt貌似不支持ECDSA算法。这些算法是如何定位 的,用什么工具可以找到这些算法,谢谢。
2023-4-29 16:56
0
游客
登录 | 注册 方可回帖
返回
//