新160个crackme - 087-d4ph1-crackme2

瑞星  金牌会员 | 2024-10-31 01:52:08 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 803|帖子 803|积分 2409

运行分析




  • 需破解Name和Serial

PE分析




  • ASM程序,32位,无壳

静态分析&动态调试




  • ida找到关键字符串

  1. INT_PTR __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4)
  2. {
  3.   HICON IconA; // eax
  4.   int v5; // edi
  5.   unsigned int v6; // ebx
  6.   char v7; // al
  7.   int v8; // ecx
  8.   char v9; // al
  9.   int v10; // ecx
  10.   int v11; // ecx
  11.   int v12; // eax
  12.   int v13; // ebx
  13.   int v14; // edi
  14.   int v15; // esi
  15.   int v16; // ebp
  16.   int v17; // ebx
  17.   int v18; // esi
  18.   unsigned int v19; // ecx
  19.   unsigned int v20; // edx
  20.   unsigned int v21; // eax
  21.   int v22; // ecx
  22.   int v23; // esi
  23.   int v24; // edx
  24.   char v25; // al
  25.   int v26; // esi
  26.   char v27; // al
  27.   char Name_i; // [esp-Ch] [ebp-Ch]
  28.   unsigned int v30; // [esp-8h] [ebp-8h]
  29.   unsigned int Name_len; // [esp-4h] [ebp-4h]
  30.   switch ( a2 )
  31.   {
  32.     case 0x110u:
  33.       GetDlgItem(hDlg, 1002);
  34.       GetDlgItem(hDlg, 1003);
  35.       IconA = LoadIconA(hInstance, (LPCSTR)0x68);
  36.       SendMessageA(hDlg, 0x80u, 0, (LPARAM)IconA);
  37.       break;
  38.     case 0x10u:
  39.       SendMessageA(hDlg, 0x111u, 0x3EEu, 0);
  40.       break;
  41.     case 0x111u:
  42.       switch ( (_WORD)a3 )
  43.       {
  44.         case 0x3EE:
  45.           PostQuitMessage(0);
  46.           break;
  47.         case 0x3EF:
  48.           MessageBoxA(0, Text, Caption, 0x40u);
  49.           break;
  50.         case 0x3ED:
  51.           Name_len = SendDlgItemMessageA(hDlg, 1002, 0xDu, 0x40u, (LPARAM)Name);
  52.           sub_401032();
  53.           Name_len_ = Name_len;
  54.           if ( Name_len <= 4 )
  55.           {
  56.             if ( !Name_len )
  57.             {
  58.               MessageBoxA(0, aNoNameDetected, Caption, 0x10u);
  59.               return 1;
  60.             }
  61.           }
  62.           else if ( Name_len < 33 )             // Name长度小于33
  63.           {
  64.             v5 = 0;
  65.             v6 = 2 * Name_len_;
  66.             do                                  // 循环1:将Name[i]//16和Name[i]%16的数拼接得到Name_encode_1,若得到结果不是数字则+7
  67.             {
  68.               Name_i = Name[v5];
  69.               v7 = plus_0_or_7((unsigned __int16)Name_i / 16u);
  70.               Name_encode_1[v8] = v7;
  71.               v9 = plus_0_or_7((unsigned __int16)Name_i % 16u);
  72.               Name_encode_1[v10] = v9;
  73.               ++v5;
  74.             }
  75.             while ( v10 + 1 < v6 );
  76.             v11 = 0;
  77.             v12 = 0;
  78.             v13 = 0;
  79.             v14 = 0;
  80.             v15 = 1;
  81.             v16 = 0;
  82.             n = 0;
  83.             do                                  // 循环2:对Name_encode_1进行计算取得Name_encode_2
  84.             {
  85.               LOBYTE(v12) = Name_encode_1[v16 + v11];
  86.               LOBYTE(v13) = Name_encode_1_1[v16 + v11];
  87.               if ( v12 == v13 )
  88.               {
  89.                 ++v15;
  90.                 ++n;
  91.                 ++v16;
  92.                 if ( n != 1 )
  93.                 {
  94.                   v14 -= 2;
  95.                   ++v15;
  96.                 }
  97.               }
  98.               else
  99.               {
  100.                 if ( (unsigned __int8)n > 1u )
  101.                   v14 -= 2;
  102.                 n = 0;
  103.                 v15 = 1;
  104.               }
  105.               *(_WORD *)((char *)&Name_encode_2 + v14) = ((_WORD)v12 << 8) + v15;
  106.               v14 += 2;
  107.               ++v11;
  108.             }
  109.             while ( Name_encode_1[v16 + v11] );
  110.             sub_401097();
  111.             SendDlgItemMessageA(hDlg, 1003, 0xDu, 0x40u, (LPARAM)Serial);
  112.             HIWORD(v17) = 0;
  113.             v18 = 1;
  114.             v19 = 1;
  115.             do                                  // 循环3:提取Name和Name_encode_2进行计算,得到Name_encode_3
  116.             {
  117.               LOWORD(v17) = *(_WORD *)(v18 + 0x40321B);// 提取Name_encode_1
  118.               v20 = (v17 + *(char *)(v19 + 0x403157) - v19) % v19;
  119.               v21 = (v17 + *(char *)(v19 + 0x403157) - v19) / v19 - Name_len_4;
  120.               v17 += v19;
  121.               Name_encode_3[v19] = v17 ^ (v20 + v21);
  122.               if ( ++v18 >= Name_len_4 )
  123.                 v18 = 1;
  124.               ++v19;
  125.             }
  126.             while ( v19 <= Name_len_ );
  127.             v22 = 0;
  128.             v23 = 0;
  129.             v24 = 2 * Name_len_;
  130.             do                                  // 循环4:提取通过Name_encode_3每一位进行计算,得到Name_encode
  131.             {
  132.               v30 = Name_encode_3_1[v22];
  133.               v25 = ((v30 >> 4) & 0xF) + 48;
  134.               if ( v25 > 57 )
  135.                 v25 = ((v30 >> 4) & 0xF) + 55;
  136.               Name_encode[v23] = v25;
  137.               v26 = v23 + 1;
  138.               v27 = (v30 & 0xF) + 48;
  139.               if ( v27 > 57 )
  140.                 v27 = (v30 & 0xF) + 55;
  141.               ++v22;
  142.               Name_encode[v26] = v27;
  143.               v23 = v26 + 1;
  144.             }
  145.             while ( v23 != v24 );
  146.             if ( (unsigned __int8)cmp(0) )      // 比较Name_encode和Serial是否相等
  147.               MessageBoxA(0, aTheSerialYouEn, Caption, 0x10u);
  148.             else
  149.               MessageBoxA(0, aWowYouDidItNow, aCrackedSuccess, 0x30u);// 成功
  150.             return 1;
  151.           }
  152.           MessageBoxA(0, aNameIsNotValid, Caption, 0x10u);
  153.           break;
  154.       }
  155.       break;
  156.     default:
  157.       return 0;
  158.   }
  159.   return 1;
  160. }
复制代码


  • 进行动调调试,注释如上,一共4个循环盘算,得到Name_encode,最后Name_encode必要等于Serial

算法分析

  1. Name = 'concealbear'
  2. # 第一个循环
  3. def plus_0_or_7(a1):
  4.     result = (a1 & 0xF) + 0x30
  5.     if (result > 0x39):
  6.         result += 7;
  7.     return result;
  8. Name_encode_1 = []
  9. for i in range(len(Name)):
  10.     Name_encode_1.append(plus_0_or_7(ord(Name[i]) // 16))
  11.     Name_encode_1.append(plus_0_or_7(ord(Name[i]) % 16))
  12. Name_encode_1.append(0)
  13. # 第二个循环
  14. Name_encode_2 = [0] * len(Name_encode_1) * 2
  15. v11 = 0;
  16. v12 = 0;
  17. v13 = 0;
  18. v14 = 0;
  19. v15 = 1;
  20. v16 = 0;
  21. n = 0;
  22. for i in range(0,10000):
  23.   v12 = Name_encode_1[v16 + v11];
  24.   v13 = Name_encode_1[v16 + v11 + 1];
  25.   if ( v12 == v13 ):
  26.     ++v15;
  27.     ++n;
  28.     ++v16;
  29.     if ( n != 1 ):
  30.       v14 -= 2;
  31.       ++v15;
  32.   else:
  33.     if ( n > 1):
  34.       v14 -= 2;
  35.     n = 0;
  36.     v15 = 1;
  37.   Name_encode_2[v14] = int(hex((v12 << 8) + v15)[4:],16);
  38.   Name_encode_2[v14 + 1] = int(hex((v12 << 8) + v15)[2:4],16);
  39.   v14 += 2;
  40.   v11 += 1
  41.   if v13:
  42.       pass
  43.   else:
  44.       break
  45. # 循环3
  46. Name_encode_3 = [0] * len(Name) * 2
  47. v18 = 1;
  48. v19 = 1;
  49. for v19 in range(1,len(Name) + 1):
  50.     v17 = int(hex(Name_encode_2[v18])[2:].zfill(2) + hex(Name_encode_2[v18-1])[2:].zfill(2),16);
  51.     v20 = (v17 + ord(Name[v19-1]) - v19) % v19;
  52.     v21 = (v17 + ord(Name[v19-1]) - v19) // v19 - (len(Name) * 4);
  53.     v17 += v19;
  54.     Name_encode_3[v19] = (v17 ^ (v20 + v21))&0xff;
  55.     v18 += 1
  56.     if ( v18 >= (len(Name) * 4) ):
  57.         v18 = 1;
  58. # 循环4
  59. Name_encode = [0] * len(Name) * 2
  60. v22 = 0;
  61. v23 = 0;
  62. for v22 in range(len(Name)):
  63.     v30 = Name_encode_3[v22+1];
  64.     v25 = ((v30 >> 4) & 0xF) + 48;
  65.     if ( v25 > 57 ):
  66.         v25 = ((v30 >> 4) & 0xF) + 55;
  67.     Name_encode[v23] = v25;
  68.     v26 = v23 + 1;
  69.     v27 = (v30 & 0xF) + 48;
  70.     if ( v27 > 57 ):
  71.         v27 = (v30 & 0xF) + 55;
  72.     Name_encode[v26] = v27;
  73.     v23 = v26 + 1;
  74. Serial = "".join([chr(i)for i in Name_encode])
  75. print(Name + '的Serial为:\n' + Serial)
复制代码




  • 验证乐成

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!

标签云

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