ORF反垃圾邮件系统

邮件服务器-邮件系统-邮件技术论坛(BBS)

 找回密码
 会员注册
查看: 8815|回复: 13
打印 上一主题 下一主题

[原创] Kerio Connect中的License验证部份 分析

[复制链接]
跳转到指定楼层
顶楼
发表于 2013-11-20 12:24:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Tee8088 于 2013-11-26 12:08 编辑

分析完了,用的Open SSL的库函数,生成16个字节的MD5串用于签名的明文,License文件中signature段中256字节的签名密文串经转换成后成128字节的十六进制内存串,反向排列这个signature内存串做为签名密文,把exe文件中存着的128个密钥Key反向排列做为解码用的密钥KEY,这个签名密文的最后四字节应小于密钥KEY的后四字节,开始RSA1024签名解码,E值是10001,经签名解码后生成解码结果,解码结果存放在一个数组中,最后比较解码结果和MD5签明明文是否相等,相等就是正式,不相等就成了试用。下面是IDA中F5出来的
  1. signed int __thiscall Check_License(void *this, int a2)
  2. {
  3.   void *v2; // esp@1
  4.   int v3; // esi@1
  5.   void *v4; // ebx@1
  6.   bool v5; // cf@1
  7.   void *v7; // eax@11
  8.   bool v8; // zf@20
  9.   int v9; // esi@22
  10.   char v10; // bl@24
  11.   void *v11; // eax@42
  12.   char *v12; // edx@45
  13.   char *v13; // edi@51
  14.   const char *v14; // esi@53
  15.   int v15; // eax@60
  16.   unsigned int v16; // [sp-10h] [bp-2414h]@1
  17.   int (__thiscall **v17)(void *, char); // [sp+0h] [bp-2404h]@38
  18.   int v18; // [sp+Ch] [bp-23F8h]@39
  19.   int (__thiscall **v19)(void *, char); // [sp+10h] [bp-23F4h]@106
  20.   int v20; // [sp+1Ch] [bp-23E8h]@107
  21.   int (__thiscall **v21)(void *, char); // [sp+20h] [bp-23E4h]@14
  22.   int v22; // [sp+2Ch] [bp-23D8h]@15
  23.   int (__thiscall **v23)(void *, char); // [sp+34h] [bp-23D0h]@108
  24.   int v24; // [sp+40h] [bp-23C4h]@109
  25.   int v25; // [sp+44h] [bp-23C0h]@1
  26.   char v26; // [sp+4Bh] [bp-23B9h]@6
  27.   int (__thiscall **v27)(void *, char); // [sp+4Ch] [bp-23B8h]@1
  28.   char v28; // [sp+50h] [bp-23B4h]@1
  29.   char v29; // [sp+1050h] [bp-13B4h]@1
  30.   char *v30; // [sp+2050h] [bp-3B4h]@1
  31.   char *v31; // [sp+2054h] [bp-3B0h]@1
  32.   int v32; // [sp+2058h] [bp-3ACh]@1
  33.   int v33; // [sp+205Ch] [bp-3A8h]@1
  34.   char v34; // [sp+2060h] [bp-3A4h]@1
  35.   int v35; // [sp+2064h] [bp-3A0h]@1
  36.   char v36; // [sp+2068h] [bp-39Ch]@1
  37.   char v37; // [sp+206Ch] [bp-398h]@1
  38.   char v38; // [sp+2280h] [bp-184h]@11
  39.   char v39; // [sp+2288h] [bp-17Ch]@33
  40.   char v40; // [sp+2338h] [bp-CCh]@18
  41.   char *Dst; // [sp+2380h] [bp-84h]@35
  42.   unsigned int v42; // [sp+2394h] [bp-70h]@51
  43.   void *Src; // [sp+239Ch] [bp-68h]@29
  44.   int v44; // [sp+23ACh] [bp-58h]@29
  45.   unsigned int v45; // [sp+23B0h] [bp-54h]@29
  46.   void *v46; // [sp+23B8h] [bp-4Ch]@5
  47.   int v47; // [sp+23C8h] [bp-3Ch]@5
  48.   unsigned int v48; // [sp+23CCh] [bp-38h]@5
  49.   void *Str; // [sp+23D4h] [bp-30h]@24
  50.   int v50; // [sp+23E4h] [bp-20h]@24
  51.   unsigned int v51; // [sp+23E8h] [bp-1Ch]@24
  52.   unsigned int v52; // [sp+23F0h] [bp-14h]@1
  53.   unsigned int *v53; // [sp+23F4h] [bp-10h]@1
  54.   int v54; // [sp+2400h] [bp-4h]@1
  55.   int v55; // [sp+2404h] [bp+0h]@1

  56.   v2 = alloca(9204);
  57.   v52 = (unsigned int)&v55 ^ __security_cookie;
  58.   v16 = (unsigned int)&v55 ^ __security_cookie;
  59.   v53 = &v16;
  60.   v3 = a2;
  61.   v4 = this;
  62.   v30 = &v28;
  63.   v25 = (int)this;
  64.   v31 = &v29;
  65.   v32 = 0;
  66.   v33 = 4096;
  67.   v34 = 0;
  68.   v54 = 0;
  69.   v27 = &off_1679F04;
  70.   sub_AA93F0(&v37);
  71.   v35 = -1;
  72.   v36 = 0;
  73.   v5 = *(_DWORD *)(a2 + 20) < 0x10u;
  74.   v54 = 1;
  75.   if ( !v5 )
  76.     v3 = *(_DWORD *)a2;
  77.   if ( !sub_AA9D10((LPCSTR)v3, "rb") )
  78.   {
  79.     v54 = -1;
  80.     sub_AA9A90(&v27);
  81.     return 2;
  82.   }
  83.   sub_AA21D0(&v27);
  84.   v48 = 15;
  85.   v47 = 0;
  86.   LOBYTE(v46) = 0;
  87.   LOBYTE(v54) = 3;
  88.   sub_AA2090(v16);
  89.   if ( (unsigned __int8)sub_47C4B0((int)&v46, "--LICENSE--") )// 扫描读行比较字串
  90.   {
  91.     v26 = 0;
  92.   }
  93.   else
  94.   {
  95.     if ( !(unsigned __int8)sub_47C4B0((int)&v46, "--PRODUCT-LICENSE--") )// 扫描读行比较字串
  96.     {
  97.       std::exception::exception(&v23);
  98.       v23 = &off_1724EE0;
  99.       v24 = 2;
  100.       CxxThrowException();
  101.     }
  102.     v26 = 1;
  103.   }
  104.   sub_AA57D0(0, 1);
  105.   LOBYTE(v54) = 4;
  106.   while ( 1 )
  107.   {
  108.     sub_AA2090(v16);
  109.     if ( (unsigned __int8)sub_47C4B0((int)&v46, "--SIGNATURE--") )// 扫描读行比较字串,如果是SIGNATURE这行就跳出循环
  110.       break;
  111.     v51 = 15;
  112.     v50 = 0;
  113.     LOBYTE(Str) = 0;
  114.     sub_401560(&Str, (int)&v46, 0, 0xFFFFFFFFu);
  115.     LOBYTE(v54) = 5;
  116.     sub_429BA0((int)&Str, 1u, 0);
  117.     sub_407CB0(&v39, &Str);
  118.     LOBYTE(v54) = 4;
  119.     if ( v51 >= 0x10 )
  120.       operator delete(Str);
  121.     sub_AA2370(&Dst, (int)&v46);
  122.     v45 = 15;
  123.     v44 = 0;
  124.     LOBYTE(Src) = 0;
  125.     LOBYTE(v54) = 7;
  126.     if ( (unsigned __int8)sub_47C4B0((int)&v46, "Feature-Begin") )
  127.     {
  128.       sub_401560(&Src, (int)&Dst, 0, 0xFFFFFFFFu);
  129.       while ( 1 )
  130.       {
  131.         sub_AA2090(v16);
  132.         if ( (unsigned __int8)sub_47C4B0((int)&v46, "--SIGNATURE--") )
  133.         {
  134.           std::exception::exception(&v17);
  135.           v17 = &off_1724EE0;
  136.           v18 = 2;
  137.           CxxThrowException();
  138.         }
  139.         v51 = 15;
  140.         v50 = 0;
  141.         LOBYTE(Str) = 0;
  142.         sub_401560(&Str, (int)&v46, 0, 0xFFFFFFFFu);
  143.         LOBYTE(v54) = 8;
  144.         sub_429BA0((int)&Str, 1u, 0);
  145.         sub_407CB0(&v39, &Str);
  146.         LOBYTE(v54) = 7;
  147.         if ( v51 >= 0x10 )
  148.           operator delete(Str);
  149.         v11 = sub_AA2370(&Str, (int)&v46);
  150.         LOBYTE(v54) = 9;
  151.         sub_402C50((void **)&Dst, (void **)v11);
  152.         LOBYTE(v54) = 7;
  153.         if ( v51 >= 0x10 )
  154.           operator delete(Str);
  155.         if ( (unsigned __int8)sub_47C4B0((int)&v46, "Feature-End") )
  156.           break;
  157.         v12 = (char *)Src;
  158.         if ( v45 < 0x10 )
  159.           v12 = (char *)&Src;
  160.         v51 = 15;
  161.         v50 = 0;
  162.         LOBYTE(Str) = 0;
  163.         sub_401860((int)&Str, v12, strlen(v12));
  164.         LOBYTE(v54) = 10;
  165.         sub_AA3040((int)((char *)v4 + 476), (int)&Str, (int)&v46, (int)&Dst);
  166.         LOBYTE(v54) = 7;
  167.         if ( v51 >= 0x10 )
  168.           operator delete(Str);
  169.       }
  170.     }
  171.     v51 = 15;
  172.     v50 = 0;
  173.     LOBYTE(Str) = 0;
  174.     sub_401860((int)&Str, "Main", 4u);
  175.     LOBYTE(v54) = 11;
  176.     sub_AA3040((int)((char *)v4 + 476), (int)&Str, (int)&v46, (int)&Dst);
  177.     LOBYTE(v54) = 7;
  178.     if ( v51 >= 0x10 )
  179.       operator delete(Str);
  180.     v13 = Dst;
  181.     if ( v42 < 0x10 )
  182.       v13 = (char *)&Dst;
  183.     v14 = (const char *)v46;
  184.     if ( v48 < 0x10 )
  185.       v14 = (const char *)&v46;
  186.     if ( !v14 || !v13 )
  187.     {
  188.       std::exception::exception(&v19);
  189.       v19 = &off_1724EE0;
  190.       v20 = 2;
  191.       CxxThrowException();
  192.     }
  193.     if ( !strcmp(v14, "Product") )
  194.     {
  195.       sub_401960((int)((char *)v4 + 8), v13);
  196.       goto LABEL_102;
  197.     }
  198.     if ( !strcmp(v14, "Product-ID") )
  199.     {
  200.       v15 = atoi(v13);
  201.       sub_AA0040(v15);
  202.       goto LABEL_102;
  203.     }
  204.     if ( !strcmp(v14, "Version") )
  205.     {
  206.       sub_401960((int)((char *)v4 + 40), v13);
  207.       goto LABEL_102;
  208.     }
  209.     if ( !strcmp(v14, "Edition") )
  210.     {
  211.       sub_401960((int)((char *)v4 + 68), v13);
  212.       goto LABEL_102;
  213.     }
  214.     if ( !strcmp(v14, "Min-Version") )
  215.     {
  216.       sub_401960((int)((char *)v4 + 124), v13);
  217.       goto LABEL_102;
  218.     }
  219.     if ( !strcmp(v14, "OS") )
  220.     {
  221.       sub_401960((int)((char *)v4 + 96), v13);
  222.       goto LABEL_102;
  223.     }
  224.     if ( !strcmp(v14, "Base-ID") )
  225.     {
  226.       sub_401960((int)((char *)v4 + 152), v13);
  227.       goto LABEL_102;
  228.     }
  229.     if ( !strcmp(v14, "Company") )
  230.     {
  231.       sub_401960((int)((char *)v4 + 208), v13);
  232.       goto LABEL_102;
  233.     }
  234.     if ( !strcmp(v14, "Person") )
  235.     {
  236.       sub_401960((int)((char *)v4 + 180), v13);
  237.       goto LABEL_102;
  238.     }
  239.     if ( !strcmp(v14, "E-Mail") )
  240.     {
  241.       sub_401960((int)((char *)v4 + 236), v13);
  242.       goto LABEL_102;
  243.     }
  244.     if ( !strcmp(v14, "Host-ID") )
  245.     {
  246.       sub_401960((int)((char *)v4 + 264), v13);
  247.       goto LABEL_102;
  248.     }
  249.     if ( !strcmp(v14, "Features") )
  250.     {
  251.       sub_401960((int)((char *)v4 + 292), v13);
  252.       goto LABEL_102;
  253.     }
  254.     if ( !strcmp(v14, "License-Expires") )
  255.     {
  256.       sub_401990((int)&Str, v13);
  257.       LOBYTE(v54) = 12;
  258.       sub_AA1ED0((int)((char *)v4 + 328), (int)&Str);
  259. LABEL_101:
  260.       sub_11DF8E0(&Str);
  261.       goto LABEL_102;
  262.     }
  263.     if ( !strcmp(v14, "Subscription-Expires") )
  264.     {
  265.       sub_401990((int)&Str, v13);
  266.       LOBYTE(v54) = 13;
  267.       sub_AA1ED0((int)((char *)v4 + 336), (int)&Str);
  268.       goto LABEL_101;
  269.     }
  270.     if ( !strcmp(v14, "Antivirus-Expires") )
  271.     {
  272.       sub_401990((int)&Str, v13);
  273.       LOBYTE(v54) = 14;
  274.       sub_AA1ED0((int)((char *)v4 + 344), (int)&Str);
  275.       goto LABEL_101;
  276.     }
  277.     if ( !strcmp(v14, "Warranty-Expires") )
  278.     {
  279.       sub_401990((int)&Str, v13);
  280.       LOBYTE(v54) = 15;
  281.       sub_AA1ED0((int)((char *)v4 + 352), (int)&Str);
  282.       goto LABEL_101;
  283.     }
  284.     if ( !strcmp(v14, "License-Type") )
  285.     {
  286.       sub_401990((int)&Str, v13);
  287.       LOBYTE(v54) = 16;
  288.       sub_AA1C40(&Str);
  289.       goto LABEL_101;
  290.     }
  291.     if ( !strcmp(v14, "License-Version") )
  292.     {
  293.       sub_401960((int)((char *)v4 + 360), v13);
  294.       goto LABEL_102;
  295.     }
  296.     if ( !strcmp(v14, "License-Info") )
  297.     {
  298.       sub_401960((int)((char *)v4 + 388), v13);
  299.       goto LABEL_102;
  300.     }
  301.     if ( !strcmp(v14, "Comment") )
  302.     {
  303.       sub_401960((int)((char *)v4 + 416), v13);
  304.       goto LABEL_102;
  305.     }
  306.     if ( !strcmp(v14, "Format-Version") )
  307.     {
  308.       sub_401960((int)((char *)v4 + 448), v13);
  309.       goto LABEL_102;
  310.     }
  311.     if ( !strcmp(v14, "Users") )
  312.     {
  313.       sub_401990((int)&Str, v13);
  314.       LOBYTE(v54) = 17;
  315.       sub_AA1F50((int)((char *)v4 + 320), (char *)&Str);
  316.       goto LABEL_101;
  317.     }
  318. LABEL_102:
  319.     if ( v45 >= 0x10 )
  320.       operator delete(Src);
  321.     v45 = 15;
  322.     v44 = 0;
  323.     LOBYTE(Src) = 0;
  324.     LOBYTE(v54) = 4;
  325.     if ( v42 >= 0x10 )
  326.       operator delete(Dst);
  327.   }
  328.   Check_signature(v4, (int)&v38, (int)&v27);    // 验证签名
  329.   sub_AA2090(v16);
  330.   v7 = "--PRODUCT-END--";
  331.   if ( !v26 )
  332.     v7 = "--END--";
  333.   if ( !(unsigned __int8)sub_47C4B0((int)&v46, v7) )// 是否已经到最后行的标志串
  334.   {
  335.     std::exception::exception(&v21);
  336.     v21 = &off_1724EE0;
  337.     v22 = 2;
  338.     CxxThrowException();
  339.   }
  340.   if ( !v26 )
  341.     sub_AA1C40((char *)v4 + 68);
  342.   sub_AA9730(&v27);
  343.   LOBYTE(v54) = 3;
  344.   sub_AA54C0(&v40);
  345.   std::basic_ios<char_std::char_traits<char>>::_basic_ios<char_std::char_traits<char>>(&v40);
  346.   if ( v48 >= 0x10 )
  347.     operator delete(v46);
  348.   v8 = *((_DWORD *)v4 + 77) == 0;
  349.   v54 = 1;
  350.   if ( v8 )
  351.     sub_AA1440((char *)v4 + 292);
  352.   v9 = (int)((char *)v4 + 344);
  353.   if ( !*((_DWORD *)v4 + 86) && !*((_DWORD *)v4 + 87) )
  354.   {
  355.     v51 = 15;
  356.     v50 = 0;
  357.     LOBYTE(Str) = 0;
  358.     sub_401860((int)&Str, "Sophos", 6u);
  359.     LOBYTE(v54) = 19;
  360.     v10 = sub_AA1B60(v25 + 476, (int)&Str);
  361.     LOBYTE(v54) = 1;
  362.     if ( v51 >= 0x10 )
  363.       operator delete(Str);
  364.     if ( v10 )
  365.     {
  366.       v51 = 15;
  367.       v50 = 0;
  368.       LOBYTE(Str) = 0;
  369.       sub_401860((int)&Str, "Sophos", 6u);
  370.       LOBYTE(v54) = 20;
  371.       sub_AA1CD0((int)&Str, v9);
  372.       LOBYTE(v54) = 1;
  373.       if ( v51 >= 0x10 )
  374.         operator delete(Str);
  375.     }
  376.     else
  377.     {
  378.       v45 = 15;
  379.       v44 = 0;
  380.       LOBYTE(Src) = 0;
  381.       sub_401860((int)&Src, "McAfee", 6u);  //竟然有Mcafee,难道还有自带防毒是麦咖啡的版本?
  382.       LOBYTE(v54) = 21;
  383.       sub_AA1CD0((int)&Src, v9);
  384.       LOBYTE(v54) = 1;
  385.       if ( v45 >= 0x10 )
  386.         operator delete(Src);
  387.       v45 = 15;
  388.       v44 = 0;
  389.       LOBYTE(Src) = 0;
  390.     }
  391.   }
  392.   sub_AA2000(v25);
  393.   v54 = -1;
  394.   sub_AA9A90(&v27);
  395.   return 0;
  396. }
复制代码




沙发
 楼主| 发表于 2013-11-20 12:25:41 | 只看该作者
本帖最后由 Tee8088 于 2013-11-20 13:13 编辑
  1. void __thiscall Check_signature(void *this, int a2, int a3)
  2. {
  3.   int (__stdcall *v3)(_DWORD, _DWORD, _DWORD); // eax@1
  4.   void **v4; // eax@1
  5.   const void *v5; // eax@3
  6.   signed int v6; // edi@5
  7.   int v7; // eax@6
  8.   int *v8; // eax@7
  9.   int v9; // ebx@7
  10.   char v10; // bl@12
  11.   char *v11; // eax@14
  12.   int v12; // ecx@14
  13.   int v13; // eax@15
  14.   int *v14; // eax@16
  15.   int v15; // ebx@16
  16.   int v16; // eax@22
  17.   int v17; // eax@23
  18.   int v18; // ST14_4@24
  19.   signed int v19; // eax@29
  20.   int v20; // ecx@29
  21.   void *v21; // [sp+Ch] [bp-150h]@1
  22.   int v22; // [sp+10h] [bp-14Ch]@24
  23.   void *Src; // [sp+14h] [bp-148h]@1
  24.   size_t Size; // [sp+24h] [bp-138h]@1
  25.   unsigned int v25; // [sp+28h] [bp-134h]@1
  26.   void *v26; // [sp+30h] [bp-12Ch]@1
  27.   int Dst[2]; // [sp+3Ch] [bp-120h]@5
  28.   unsigned int v28; // [sp+44h] [bp-118h]@1
  29.   int v29; // [sp+48h] [bp-114h]@18
  30.   int v30[32]; // [sp+4Ch] [bp-110h]@24
  31.   int SIGNATURE; // [sp+CCh] [bp-90h]@5
  32.   unsigned int v32; // [sp+14Ch] [bp-10h]@1
  33.   int v33; // [sp+158h] [bp-4h]@1
  34.   int v34; // [sp+15Ch] [bp+0h]@1

  35.   v32 = (unsigned int)&v34 ^ __security_cookie;
  36.   v21 = this;
  37.   v25 = 15;
  38.   Size = 0;
  39.   LOBYTE(Src) = 0;
  40.   v3 = (int (__stdcall *)(_DWORD, _DWORD, _DWORD))**(_DWORD **)a2;// 获取签名明文call,调用了Open SSL库
  41.   v33 = 0;
  42.   v4 = (void **)v3(&v26, 0, (unsigned int)&v34 ^ __security_cookie);// v4是16个字节的签名明文
  43.   LOBYTE(v33) = 1;
  44.   sub_402C50(&Src, v4);
  45.   LOBYTE(v33) = 0;
  46.   if ( v28 >= 0x10 )
  47.     operator delete(v26);
  48.   v5 = Src;
  49.   if ( v25 < 0x10 )
  50.     v5 = &Src;
  51.   memcpy(Dst, v5, Size);                        // Dst是一个数组,下标为4
  52.   memset(&SIGNATURE, 0, 0x80u);                 // 取v31为128个空字节
  53.   v6 = 0;
  54.   while ( 1 )                                   // 转换sig签名为16进制字节放到128字节里
  55.   {
  56.     v7 = *(_DWORD *)(a3 + 8204);
  57.     if ( v7 <= 0 )
  58.     {
  59.       v9 = sub_AA8D40(a3);
  60.     }
  61.     else
  62.     {
  63.       *(_DWORD *)(a3 + 8204) = v7 - 1;
  64.       v8 = *(int **)(a3 + 8196);
  65.       v9 = *(_BYTE *)v8;
  66.       *(_DWORD *)(a3 + 8196) = (char *)v8 + 1;
  67.     }
  68.     if ( v9 == -1 )
  69.     {
  70.       std::exception::exception(Dst);
  71.       Dst[0] = (int)&off_1724EE0;
  72.       v29 = 2;
  73.       CxxThrowException();
  74.     }
  75.     if ( !isspace((unsigned __int8)v9) )
  76.     {
  77.       v10 = v9 < 97 ? v9 - 48 : v9 - 87;
  78.       v11 = (char *)&SIGNATURE + v6 / 2;
  79.       v12 = v6++ % 2;
  80.       *v11 |= v10 << (v12 != 0 ? 0 : 4);
  81.       if ( v6 >= 256 )
  82.         break;
  83.     }
  84.   }                                             // 上面while的功能:把sig转换成ASCII码
  85.   do
  86.   {
  87.     v13 = *(_DWORD *)(a3 + 8204);
  88.     if ( v13 <= 0 )
  89.     {
  90.       v15 = sub_AA8D40(a3);
  91.     }
  92.     else
  93.     {
  94.       *(_DWORD *)(a3 + 8204) = v13 - 1;
  95.       v14 = *(int **)(a3 + 8196);
  96.       v15 = *(_BYTE *)v14;
  97.       *(_DWORD *)(a3 + 8196) = (char *)v14 + 1;
  98.     }
  99.     if ( v15 == -1 )
  100.     {
  101.       std::exception::exception(Dst);
  102.       Dst[0] = (int)&off_1724EE0;
  103.       v29 = 2;
  104.       CxxThrowException();
  105.     }
  106.   }
  107.   while ( isspace((unsigned __int8)v15) );
  108.   v16 = *(_DWORD *)(a3 + 8196);
  109.   if ( v16 != a3 + 4 )
  110.   {
  111.     v17 = v16 - 1;
  112.     ++*(_DWORD *)(a3 + 8204);
  113.     *(_DWORD *)(a3 + 8196) = v17;
  114.     *(_BYTE *)v17 = v15;
  115.   }
  116.   v18 = *(_DWORD *)v21;                         // v18=1024
  117.   v22 = 128;
  118.   if ( sub_AA1340(v30, (int)&v22, (int)&SIGNATURE, 0x80u, v18) )// 签名解码算法 v30为解密后返回的明文,函数返回0表示解码成功,OD里跟进v18这个地址里,后面跟的就是128字节的公钥了,如果用自己生成的公钥,那就是替换这串128字节的东西了。
  119.   {
  120. LABEL_25:
  121.     std::exception::exception(Dst);
  122.     Dst[0] = (int)&off_1724EE0;
  123.     v29 = 3;
  124.     CxxThrowException();
  125.   }
  126.   v19 = 16;
  127.   v20 = 0;
  128.   do
  129.   {
  130.     if ( v30[v20] != Dst[v20] )                 // 签名解码出来后的串与原始明文比较
  131.       goto LABEL_25;                              //如果爆破签名检测,就直接复制原始明文的16字节去覆盖解码后的16字节
  132.     v19 -= 4;
  133.     ++v20;
  134.   }
  135.   while ( (unsigned int)v19 >= 4 );
  136.   if ( v25 >= 0x10 )
  137.     operator delete(Src);
  138. }
复制代码
藤椅
发表于 2013-11-20 12:33:51 | 只看该作者
楼主真是高手!有没有办法替换密钥部分,生成自己的License,而不去爆破,这样的的话全平台破解都不是问题了,甚至于Kerio Control 也解决了
板凳
 楼主| 发表于 2013-11-20 12:36:48 | 只看该作者
不知道Kerio的系列产品中是否都是用的这样的验证License的方式
报纸
发表于 2013-11-20 12:42:46 | 只看该作者
我分析过代码,都是这种方式

点评

那你看看这段是个啥个算法来着??知道了这个算法的名称,就可以替换了,这东西就是把签名密文解码成明文的函数。  详情 回复 发表于 2013-11-20 13:31
地板
 楼主| 发表于 2013-11-20 13:31:41 | 只看该作者
newdiy 发表于 2013-11-20 12:42
我分析过代码,都是这种方式

那你看看这段是个啥个算法来着??知道了这个算法的名称,就可以替换了,这东西就是把签名密文解码成明文的函数。

  1. 00AA10D0                                  55                    push ebp
  2. 00AA10D1                                  8BEC                  mov ebp,esp
  3. 00AA10D3                                  81EC 1C020000         sub esp,21C
  4. 00AA10D9                                  A1 E05EAC01           mov eax,dword ptr ds:[1AC5EE0]
  5. 00AA10DE                                  33C5                  xor eax,ebp
  6. 00AA10E0                                  8945 FC               mov dword ptr ss:[ebp-4],eax
  7. 00AA10E3                                  8B45 08               mov eax,dword ptr ss:[ebp+8]
  8. 00AA10E6                                  53                    push ebx
  9. 00AA10E7                                  8B5D 10               mov ebx,dword ptr ss:[ebp+10]
  10. 00AA10EA                                  56                    push esi
  11. 00AA10EB                                  8985 E8FDFFFF         mov dword ptr ss:[ebp-218],eax
  12. 00AA10F1                                  8B45 0C               mov eax,dword ptr ss:[ebp+C]
  13. 00AA10F4                                  57                    push edi
  14. 00AA10F5                                  33F6                  xor esi,esi
  15. 00AA10F7                                  8BFA                  mov edi,edx
  16. 00AA10F9                                  898D E4FDFFFF         mov dword ptr ss:[ebp-21C],ecx
  17. 00AA10FF                                  48                    dec eax
  18. 00AA1100                                  85C0                  test eax,eax
  19. 00AA1102                                  78 29                 js short mailserv.00AA112D
  20. 00AA1104                                  33D2                  xor edx,edx
  21. 00AA1106                                  33C9                  xor ecx,ecx
  22. 00AA1108                                  83F9 20               cmp ecx,20
  23. 00AA110B                                  73 11                 jnb short mailserv.00AA111E
  24. 00AA110D                                  0FB61C38              movzx ebx,byte ptr ds:[eax+edi]
  25. 00AA1111                                  D3E3                  shl ebx,cl
  26. 00AA1113                                  83C1 08               add ecx,8
  27. 00AA1116                                  0BD3                  or edx,ebx
  28. 00AA1118                                  48                    dec eax
  29. 00AA1119                                  8B5D 10               mov ebx,dword ptr ss:[ebp+10]
  30. 00AA111C                                ^ 79 EA                 jns short mailserv.00AA1108
  31. 00AA111E                                  8994B5 70FEFFFF       mov dword ptr ss:[ebp+esi*4-190],edx
  32. 00AA1125                                  46                    inc esi
  33. 00AA1126                                  83FE 21               cmp esi,21
  34. 00AA1129                                ^ 72 D5                 jb short mailserv.00AA1100
  35. 00AA112B                                  EB 17                 jmp short mailserv.00AA1144
  36. 00AA112D                                  83FE 21               cmp esi,21
  37. 00AA1130                                  73 12                 jnb short mailserv.00AA1144
  38. 00AA1132                                  B9 21000000           mov ecx,21
  39. 00AA1137                                  2BCE                  sub ecx,esi
  40. 00AA1139                                  8DBCB5 70FEFFFF       lea edi,dword ptr ss:[ebp+esi*4-190]
  41. 00AA1140                                  33C0                  xor eax,eax
  42. 00AA1142                                  F3:AB                 rep stosd
  43. 00AA1144                                  33F6                  xor esi,esi
  44. 00AA1146                                  B8 7F000000           mov eax,7F
  45. 00AA114B                                  EB 03                 jmp short mailserv.00AA1150
  46. 00AA114D                                  8D49 00               lea ecx,dword ptr ds:[ecx]
  47. 00AA1150                                  85C0                  test eax,eax
  48. 00AA1152                                  78 27                 js short mailserv.00AA117B
  49. 00AA1154                                  33D2                  xor edx,edx
  50. 00AA1156                                  33C9                  xor ecx,ecx
  51. 00AA1158                                  83F9 20               cmp ecx,20
  52. 00AA115B                                  73 0F                 jnb short mailserv.00AA116C
  53. 00AA115D                                  0FB67C18 04           movzx edi,byte ptr ds:[eax+ebx+4]
  54. 00AA1162                                  D3E7                  shl edi,cl
  55. 00AA1164                                  83C1 08               add ecx,8
  56. 00AA1167                                  0BD7                  or edx,edi
  57. 00AA1169                                  48                    dec eax
  58. 00AA116A                                ^ 79 EC                 jns short mailserv.00AA1158
  59. 00AA116C                                  8994B5 78FFFFFF       mov dword ptr ss:[ebp+esi*4-88],edx
  60. 00AA1173                                  46                    inc esi
  61. 00AA1174                                  83FE 21               cmp esi,21
  62. 00AA1177                                ^ 72 D7                 jb short mailserv.00AA1150
  63. 00AA1179                                  EB 17                 jmp short mailserv.00AA1192
  64. 00AA117B                                  83FE 21               cmp esi,21
  65. 00AA117E                                  73 12                 jnb short mailserv.00AA1192
  66. 00AA1180                                  B9 21000000           mov ecx,21
  67. 00AA1185                                  2BCE                  sub ecx,esi
  68. 00AA1187                                  8DBCB5 78FFFFFF       lea edi,dword ptr ss:[ebp+esi*4-88]
  69. 00AA118E                                  33C0                  xor eax,eax
  70. 00AA1190                                  F3:AB                 rep stosd
  71. 00AA1192                                  33F6                  xor esi,esi
  72. 00AA1194                                  B8 7F000000           mov eax,7F
  73. 00AA1199                                  8DA424 00000000       lea esp,dword ptr ss:[esp]
  74. 00AA11A0                                  85C0                  test eax,eax
  75. 00AA11A2                                  78 2A                 js short mailserv.00AA11CE
  76. 00AA11A4                                  33D2                  xor edx,edx
  77. 00AA11A6                                  33C9                  xor ecx,ecx
  78. 00AA11A8                                  83F9 20               cmp ecx,20
  79. 00AA11AB                                  73 12                 jnb short mailserv.00AA11BF
  80. 00AA11AD                                  0FB6BC18 84000000     movzx edi,byte ptr ds:[eax+ebx+84]
  81. 00AA11B5                                  D3E7                  shl edi,cl
  82. 00AA11B7                                  83C1 08               add ecx,8
  83. 00AA11BA                                  0BD7                  or edx,edi
  84. 00AA11BC                                  48                    dec eax
  85. 00AA11BD                                ^ 79 E9                 jns short mailserv.00AA11A8
  86. 00AA11BF                                  8994B5 F4FEFFFF       mov dword ptr ss:[ebp+esi*4-10C],edx
  87. 00AA11C6                                  46                    inc esi
  88. 00AA11C7                                  83FE 21               cmp esi,21
  89. 00AA11CA                                ^ 72 D4                 jb short mailserv.00AA11A0
  90. 00AA11CC                                  EB 17                 jmp short mailserv.00AA11E5
  91. 00AA11CE                                  83FE 21               cmp esi,21
  92. 00AA11D1                                  73 12                 jnb short mailserv.00AA11E5
  93. 00AA11D3                                  B9 21000000           mov ecx,21
  94. 00AA11D8                                  2BCE                  sub ecx,esi
  95. 00AA11DA                                  8DBCB5 F4FEFFFF       lea edi,dword ptr ss:[ebp+esi*4-10C]
  96. 00AA11E1                                  33C0                  xor eax,eax
  97. 00AA11E3                                  F3:AB                 rep stosd
  98. 00AA11E5                                  B9 20000000           mov ecx,20
  99. 00AA11EA                                  8D45 F0               lea eax,dword ptr ss:[ebp-10]
  100. 00AA11ED                                  8D49 00               lea ecx,dword ptr ds:[ecx]
  101. 00AA11F0                                  8378 08 00            cmp dword ptr ds:[eax+8],0
  102. 00AA11F4                                  75 1B                 jnz short mailserv.00AA1211
  103. 00AA11F6                                  8378 04 00            cmp dword ptr ds:[eax+4],0
  104. 00AA11FA                                  75 0F                 jnz short mailserv.00AA120B
  105. 00AA11FC                                  8338 00               cmp dword ptr ds:[eax],0
  106. 00AA11FF                                  75 0D                 jnz short mailserv.00AA120E
  107. 00AA1201                                  83E8 0C               sub eax,0C
  108. 00AA1204                                  83E9 03               sub ecx,3
  109. 00AA1207                                ^ 79 E7                 jns short mailserv.00AA11F0
  110. 00AA1209                                  EB 06                 jmp short mailserv.00AA1211
  111. 00AA120B                                  49                    dec ecx
  112. 00AA120C                                  EB 03                 jmp short mailserv.00AA1211
  113. 00AA120E                                  83E9 02               sub ecx,2
  114. 00AA1211                                  8D79 01               lea edi,dword ptr ds:[ecx+1]
  115. 00AA1214                                  B8 20000000           mov eax,20
  116. 00AA1219                                  8D8D 6CFFFFFF         lea ecx,dword ptr ss:[ebp-94]
  117. 00AA121F                                  90                    nop
  118. 00AA1220                                  8379 08 00            cmp dword ptr ds:[ecx+8],0
  119. 00AA1224                                  75 1B                 jnz short mailserv.00AA1241
  120. 00AA1226                                  8379 04 00            cmp dword ptr ds:[ecx+4],0
  121. 00AA122A                                  75 0F                 jnz short mailserv.00AA123B
  122. 00AA122C                                  8339 00               cmp dword ptr ds:[ecx],0
  123. 00AA122F                                  75 0D                 jnz short mailserv.00AA123E
  124. 00AA1231                                  83E9 0C               sub ecx,0C
  125. 00AA1234                                  83E8 03               sub eax,3
  126. 00AA1237                                ^ 79 E7                 jns short mailserv.00AA1220
  127. 00AA1239                                  EB 06                 jmp short mailserv.00AA1241
  128. 00AA123B                                  48                    dec eax
  129. 00AA123C                                  EB 03                 jmp short mailserv.00AA1241
  130. 00AA123E                                  83E8 02               sub eax,2
  131. 00AA1241                                  8D70 01               lea esi,dword ptr ds:[eax+1]
  132. 00AA1244                                  8D47 FF               lea eax,dword ptr ds:[edi-1]
  133. 00AA1247                                  85C0                  test eax,eax
  134. 00AA1249                                  78 1C                 js short mailserv.00AA1267
  135. 00AA124B                                  EB 03                 jmp short mailserv.00AA1250
  136. 00AA124D                                  8D49 00               lea ecx,dword ptr ds:[ecx]
  137. 00AA1250                                  8B8C85 78FFFFFF       mov ecx,dword ptr ss:[ebp+eax*4-88]
  138. 00AA1257                                  8B9485 70FEFFFF       mov edx,dword ptr ss:[ebp+eax*4-190]
  139. 00AA125E                                  3BD1                  cmp edx,ecx
  140. 00AA1260                                  77 05                 ja short mailserv.00AA1267
  141. 00AA1262                                  72 19                 jb short mailserv.00AA127D
  142. 00AA1264                                  48                    dec eax
  143. 00AA1265                                ^ 79 E9                 jns short mailserv.00AA1250
  144. 00AA1267                                  5F                    pop edi
  145. 00AA1268                                  5E                    pop esi
  146. 00AA1269                                  B8 01040000           mov eax,401
  147. 00AA126E                                  5B                    pop ebx
  148. 00AA126F                                  8B4D FC               mov ecx,dword ptr ss:[ebp-4]
  149. 00AA1272                                  33CD                  xor ecx,ebp
  150. 00AA1274                                  E8 BF5C7A00           call mailserv.01246F38
  151. 00AA1279                                  8BE5                  mov esp,ebp
  152. 00AA127B                                  5D                    pop ebp
  153. 00AA127C                                  C3                    retn
  154. 00AA127D                                  57                    push edi
  155. 00AA127E                                  8D95 78FFFFFF         lea edx,dword ptr ss:[ebp-88]
  156. 00AA1284                                  52                    push edx
  157. 00AA1285                                  56                    push esi
  158. 00AA1286                                  8D85 F4FEFFFF         lea eax,dword ptr ss:[ebp-10C]
  159. 00AA128C                                  50                    push eax
  160. 00AA128D                                  8D8D 70FEFFFF         lea ecx,dword ptr ss:[ebp-190]
  161. 00AA1293                                  51                    push ecx
  162. 00AA1294                                  8D95 ECFDFFFF         lea edx,dword ptr ss:[ebp-214]
  163. 00AA129A                                  52                    push edx
  164. 00AA129B                                  E8 00F8FFFF           call mailserv.00AA0AA0
  165. 00AA12A0                                  8B03                  mov eax,dword ptr ds:[ebx]
  166. 00AA12A2                                  8B8D E4FDFFFF         mov ecx,dword ptr ss:[ebp-21C]
  167. 00AA12A8                                  83C0 07               add eax,7
  168. 00AA12AB                                  57                    push edi
  169. 00AA12AC                                  C1E8 03               shr eax,3
  170. 00AA12AF                                  8D95 ECFDFFFF         lea edx,dword ptr ss:[ebp-214]
  171. 00AA12B5                                  52                    push edx
  172. 00AA12B6                                  50                    push eax
  173. 00AA12B7                                  8901                  mov dword ptr ds:[ecx],eax
  174. 00AA12B9                                  8B85 E8FDFFFF         mov eax,dword ptr ss:[ebp-218]
  175. 00AA12BF                                  50                    push eax
  176. 00AA12C0                                  E8 9BEEFFFF           call mailserv.00AA0160
  177. 00AA12C5                                  8B4D FC               mov ecx,dword ptr ss:[ebp-4]
  178. 00AA12C8                                  83C4 28               add esp,28
  179. 00AA12CB                                  5F                    pop edi
  180. 00AA12CC                                  5E                    pop esi
  181. 00AA12CD                                  33CD                  xor ecx,ebp
  182. 00AA12CF                                  33C0                  xor eax,eax
  183. 00AA12D1                                  5B                    pop ebx
  184. 00AA12D2                                  E8 615C7A00           call mailserv.01246F38
  185. 00AA12D7                                  8BE5                  mov esp,ebp
  186. 00AA12D9                                  5D                    pop ebp
  187. 00AA12DA                                  C3                    retn
复制代码


7
 楼主| 发表于 2013-11-21 09:05:16 | 只看该作者
如何得到16个字节的签名验证明文,在OD中载入8.2.1_win32的mailserver.exe,在这里下断得到。
  1. 00AA6180                                    55                    push ebp
  2. 00AA6181                                    8BEC                  mov ebp,esp
  3. 00AA6183                                    51                    push ecx
  4. 00AA6184                                    807D 0C 00            cmp byte ptr ss:[ebp+C],0
  5. 00AA6188                                    56                    push esi
  6. 00AA6189                                    57                    push edi
  7. 00AA618A                                    8BF1                  mov esi,ecx
  8. 00AA618C                                    C745 FC 00000000      mov dword ptr ss:[ebp-4],0
  9. 00AA6193                                    74 16                 je short mailserv.00AA61AB
  10. 00AA6195                                    83BE A8000000 00      cmp dword ptr ds:[esi+A8],0
  11. 00AA619C                                    75 0D                 jnz short mailserv.00AA61AB
  12. 00AA619E                                    8B46 0C               mov eax,dword ptr ds:[esi+C]
  13. 00AA61A1                                    8B50 0C               mov edx,dword ptr ds:[eax+C]
  14. 00AA61A4                                    8D4E 0C               lea ecx,dword ptr ds:[esi+C]
  15. 00AA61A7                                    6A FF                 push -1
  16. 00AA61A9                                    FFD2                  call edx
  17. 00AA61AB                                    807E 60 00            cmp byte ptr ds:[esi+60],0
  18. 00AA61AF                                    75 34                 jnz short mailserv.00AA61E5
  19. 00AA61B1                                    8D4E 08               lea ecx,dword ptr ds:[esi+8]
  20. 00AA61B4                                    FF15 E8176701         call dword ptr ds:[<&MSVCP100.std::basic_ost>; MSVCP100.std::basic_ostream<wchar_t,std::char_traits<wchar_t> >::flush
  21. 00AA61BA                                    8D86 A8000000         lea eax,dword ptr ds:[esi+A8]                ; 666666666666666666666
  22. 00AA61C0                                    50                    push eax                                     ; 0
  23. 00AA61C1                                    8D4E 68               lea ecx,dword ptr ds:[esi+68]
  24. 00AA61C4                                    51                    push ecx                                     ; 用来存16个字节的结果
  25. 00AA61C5                                    8D56 48               lea edx,dword ptr ds:[esi+48]
  26. 00AA61C8                                    52                    push edx
  27. 00AA61C9                                    E8 8CD57900           call <jmp.&KTLIBEAY100_1.0.1e.#267>          ; EVP_DigestFinal
  28. 00AA61CE                                    83C4 0C               add esp,0C
  29. 00AA61D1                                    85C0                  test eax,eax
  30. 00AA61D3                                    75 0C                 jnz short mailserv.00AA61E1
  31. 00AA61D5                                    E8 06FEFFFF           call mailserv.00AA5FE0
  32. 00AA61DA                                    8BC8                  mov ecx,eax
  33. 00AA61DC                                    E8 2F820100           call mailserv.00ABE410
  34. 00AA61E1                                    C646 60 01            mov byte ptr ds:[esi+60],1
  35. 00AA61E5                                    8B86 A8000000         mov eax,dword ptr ds:[esi+A8]
  36. 00AA61EB                                    8B7D 08               mov edi,dword ptr ss:[ebp+8]
  37. 00AA61EE                                    50                    push eax
  38. 00AA61EF                                    83C6 68               add esi,68
  39. 00AA61F2                                    C747 14 0F000000      mov dword ptr ds:[edi+14],0F
  40. 00AA61F9                                    C747 10 00000000      mov dword ptr ds:[edi+10],0
  41. 00AA6200                                    56                    push esi
  42. 00AA6201                                    8BCF                  mov ecx,edi
  43. 00AA6203                                    C607 00               mov byte ptr ds:[edi],0
  44. 00AA6206                                    E8 55B695FF           call mailserv.00401860
  45. 00AA620B                                    8BC7                  mov eax,edi
  46. 00AA620D                                    5F                    pop edi
  47. 00AA620E                                    5E                    pop esi
  48. 00AA620F                                    8BE5                  mov esp,ebp
  49. 00AA6211                                    5D                    pop ebp
  50. 00AA6212                                    C2 0800               retn 8
复制代码





8
发表于 2013-11-21 11:46:34 | 只看该作者
这么强大,意思是说,从此你就可以无限破解了?

点评

只要验证license部份的代码没变动,那就是老套路了。  详情 回复 发表于 2013-11-21 16:19
9
 楼主| 发表于 2013-11-21 16:19:31 | 只看该作者
本帖最后由 Tee8088 于 2013-11-21 16:27 编辑
钉子 发表于 2013-11-21 11:46
这么强大,意思是说,从此你就可以无限破解了?

只要验证license部份的代码没变动,那就是老套路了。
签名解码成明文的十六字节部份我分析不出来,看着有点复杂烦人,象是个自定义的算法,如果这个分析出来,又会拿Open ssl的函数来用,那就可以写一个通用的补丁和License生成工具了。

我现在是爆破那个签名的解码后明文比较部份来实现的。
10
 楼主| 发表于 2013-11-22 09:53:50 | 只看该作者

早上捣鼓了一下,NND签名算法原来是RSA1024。
您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

小黑屋|手机版|Archiver|邮件技术资讯网

GMT+8, 2024-5-6 06:18

Powered by Discuz! X3.2

© 2001-2016 Comsenz Inc.

本论坛为非盈利中立机构,所有言论属发表者个人意见,不代表本论坛立场。内容所涉及版权和法律相关事宜请参考各自所有者的条款。
如认定侵犯了您权利,请联系我们。本论坛原创内容请联系后再行转载并务必保留我站信息。此声明修改不另行通知,保留最终解释权。
*本论坛会员专属QQ群:邮件技术资讯网会员QQ群
*本论坛会员备用QQ群:邮件技术资讯网备用群

快速回复 返回顶部 返回列表