Сейчас на форуме: bartolomeo, asfa, _MBK_ (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Расшифрока алгоритма
Посл.ответ Сообщение

Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 28 ноября 2011 17:52 · Поправил: Tatarin
· Личное сообщение · #1

Здравствуйте дорогие форумчане.
Пытаюсь разгадать один алгоритм но что-то никак не пойму как он работает. То ли опыта маловато то ли асм плохо знаю. Вообщем помогите разобраться...

Программу я саму взломал и серейник у меня уже есть и даже алгоритм постройки серийника я нашел, вот только не пойму как он работает. А понимать очень хочется! Подскажите хотя бы куда рыть.

Вот алгоритм...
Code:
  1. 005D17A9  |> 8BC3           /MOV EAX,EBX
  2. 005D17AB  |. 48             |DEC EAX                                 ; Switch (cases 1..4)
  3. 005D17AC  |. 83E8 02        |SUB EAX,2
  4. 005D17AF  |. 72 07          |JB SHORT MPK_Valu.005D17B8
  5. 005D17B1  |. 83E8 02        |SUB EAX,2
  6. 005D17B4  |. 72 4A          |JB SHORT MPK_Valu.005D1800
  7. 005D17B6  |. EB 1C          |JMP SHORT MPK_Valu.005D17D4
  8. 005D17B8  |> 8D45 B0        |LEA EAX,DWORD PTR SS:[EBP-50]           ; Cases 1,2 of switch 005D17AB
  9. 005D17BB  |. 8B55 DC        |MOV EDX,DWORD PTR SS:[EBP-24]
  10. 005D17BE  |. 8A541A FF      |MOV DL,BYTE PTR DS:[EDX+EBX-1]
  11. 005D17C2  |. E8 5933E3FF    |CALL MPK_Valu.00404B20
  12. 005D17C7  |. 8B55 B0        |MOV EDX,DWORD PTR SS:[EBP-50]
  13. 005D17CA  |. 8D45 EC        |LEA EAX,DWORD PTR SS:[EBP-14]
  14. 005D17CD  |. E8 2E34E3FF    |CALL MPK_Valu.00404C00
  15. 005D17D2  |. EB 2C          |JMP SHORT MPK_Valu.005D1800
  16. 005D17D4  |> 8BC3           |MOV EAX,EBX                             ; Default case of switch 005D17AB
  17. 005D17D6  |. 25 01000080    |AND EAX,80000001
  18. 005D17DB  |. 79 05          |JNS SHORT MPK_Valu.005D17E2
  19. 005D17DD  |. 48             |DEC EAX
  20. 005D17DE  |. 83C8 FE        |OR EAX,FFFFFFFE
  21. 005D17E1  |. 40             |INC EAX
  22. 005D17E2  |> 85C0           |TEST EAX,EAX
  23. 005D17E4  |. 75 1A          |JNZ SHORT MPK_Valu.005D1800
  24. 005D17E6  |. 8D45 AC        |LEA EAX,DWORD PTR SS:[EBP-54]
  25. 005D17E9  |. 8B55 DC        |MOV EDX,DWORD PTR SS:[EBP-24]
  26. 005D17EC  |. 8A541A FF      |MOV DL,BYTE PTR DS:[EDX+EBX-1]
  27. 005D17F0  |. E8 2B33E3FF    |CALL MPK_Valu.00404B20
  28. 005D17F5  |. 8B55 AC        |MOV EDX,DWORD PTR SS:[EBP-54]
  29. 005D17F8  |. 8D45 EC        |LEA EAX,DWORD PTR SS:[EBP-14]
  30. 005D17FB  |. E8 0034E3FF    |CALL MPK_Valu.00404C00
  31. 005D1800  |> 43             |INC EBX                                 ; Cases 3,4 of switch 005D17AB
  32. 005D1801  |. 4E             |DEC ESI
  33. 005D1802  |.^75 A5          \JNZ SHORT MPK_Valu.005D17A9


вот сама программа



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 28 ноября 2011 17:54
· Личное сообщение · #2

Понятно что осуществляется некий цикл с вложенным в нем Switch -> case как в С++ но что именно там происходит....???




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 28 ноября 2011 18:11 · Поправил: reversecode
· Личное сообщение · #3

нажмите F5 в hexrays

что значит показать куда копать - ?
разобрать за все все и показать в исходном коде или перевести в алго?
тогда я пас, дурная трата времени



Ранг: 78.7 (постоянный), 43thx
Активность: 0.070
Статус: Участник

Создано: 28 ноября 2011 18:25 · Поправил: Tyra
· Личное сообщение · #4

Это имелось ввиду ?
Code:
  1. v9 = sub_404BF8(v23, v24, v25);
  2.   if ( v9 > 0 )
  3.   {
  4.     v10 = 1;
  5.     do
  6.     {
  7.       if ( (unsigned int)(v10 - 1) < 2 )
  8.       {
  9.         v11 = v35;
  10.         LOBYTE(v11) = *(_BYTE *)(v35 + v10 - 1);
  11.         unknown_libname_83(v8, v11);
  12.         System::__linkproc___LStrCat(v8, v27);
  13.       }
  14.       else
  15.       {
  16.         if ( (unsigned int)(v10 - 3) >= 2 && !(v10 % 2) )
  17.         {
  18.           v12 = v35;
  19.           LOBYTE(v12) = *(_BYTE *)(v35 + v10 - 1);
  20.           unknown_libname_83(v8, v12);
  21.           System::__linkproc___LStrCat(v8, v26);
  22.         }
  23.       }
  24.       ++v10;
  25.       --v9;
  26.     }
  27.     while ( v9 );
  28.   }




Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 28 ноября 2011 18:29
· Личное сообщение · #5

Tyra пишет:
Это имелось ввиду ?

Это с Hex-Rays???



Ранг: 78.7 (постоянный), 43thx
Активность: 0.070
Статус: Участник

Создано: 28 ноября 2011 18:35
· Личное сообщение · #6

Tatarin пишет:
Это с Hex-Rays???

Да ! Кусок Предоставленный Вами.



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 28 ноября 2011 18:39
· Личное сообщение · #7

Понятно! Спасибо попробую разобраться!




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 28 ноября 2011 18:42
· Личное сообщение · #8

Это лишь маленький кусок процедуры, которая начинается с адреса 005D15D8

-----
Yann Tiersen best and do not fuck




Ранг: 78.7 (постоянный), 43thx
Активность: 0.070
Статус: Участник

Создано: 28 ноября 2011 18:43
· Личное сообщение · #9

PE_Kill пишет:
Это лишь маленький кусок процедуры

Так я Так и Написал. Только Тот Код который просили.
Code:
  1. int __usercall sub_5D15D8<eax>(int a1<eax>)
  2. {
  3.   int v1; // ecx@1
  4.   int v2; // ecx@4
  5.   int v3; // ecx@6
  6.   int v4; // ebx@7
  7.   int v5; // ecx@9
  8.   int v6; // esi@9
  9.   signed int v7; // ebx@10
  10.   int v8; // ecx@23
  11.   int v9; // esi@23
  12.   signed int v10; // ebx@24
  13.   int v11; // edx@28
  14.   int v12; // edx@30
  15.   int v13; // edx@32
  16.   int v14; // edx@32
  17.   int v15; // eax@32
  18.   int v16; // ecx@32
  19.   int v17; // edx@32
  20.   int v18; // eax@32
  21.   int v19; // ecx@32
  22.   int v20; // edx@32
  23.   int (*v21)(); // ecx@32
  24.   unsigned int v23; // [sp-Ch] [bp-6Ch]@1
  25.   int (*v24)(); // [sp-8h] [bp-68h]@1
  26.   int (*v25)(); // [sp-4h] [bp-64h]@1
  27.   int v26; // [sp+Ch] [bp-54h]@1
  28.   int v27; // [sp+10h] [bp-50h]@1
  29.   int v28; // [sp+14h] [bp-4Ch]@1
  30.   int v29; // [sp+18h] [bp-48h]@1
  31.   int v30; // [sp+1Ch] [bp-44h]@1
  32.   int v31; // [sp+20h] [bp-40h]@1
  33.   char v32; // [sp+26h] [bp-3Ah]@2
  34.   char v33; // [sp+3Ah] [bp-26h]@3
  35.   char v34; // [sp+3Bh] [bp-25h]@18
  36.   int v35; // [sp+3Ch] [bp-24h]@1
  37.   int v36; // [sp+40h] [bp-20h]@32
  38.   int v37; // [sp+44h] [bp-1Ch]@32
  39.   int v38; // [sp+4Ch] [bp-14h]@1
  40.   int v39; // [sp+50h] [bp-10h]@32
  41.   int v40; // [sp+54h] [bp-Ch]@32
  42.   int v41; // [sp+5Ch] [bp-4h]@1
  43.   int v42; // [sp+60h] [bp+0h]@1
  44.  
  45.   v26 = 0;
  46.   v27 = 0;
  47.   v28 = 0;
  48.   v29 = 0;
  49.   v30 = 0;
  50.   v31 = 0;
  51.   v38 = 0;
  52.   v35 = 0;
  53.   v41 = a1;
  54.   v25 = (int (*)())&v42;
  55.   v24 = loc_5D18D9;
  56.   v23 = __readfsdword(0);
  57.   __writefsdword(0, (unsigned int)&v23);
  58.   System::__linkproc___LStrClr(v23);
  59.   if ( !(unsigned __int8)sub_5D0F80() && !(unsigned __int8)sub_5D1048(v1, &v32) )
  60.   {
  61.     memcpy(&v32, "53763452", 0x14u);
  62.     v33 = a53763452[20];
  63.   }
  64.   unknown_libname_134(v1, &v31);
  65.   Sysutils::Trim(v2, &v38);
  66.   sub_5D1238(v2, &v30);
  67.   System::__linkproc___LStrLAsg(v2, v30);
  68.   if ( sub_404BF8(v23, v24, v25) > 8 )
  69.     System::__linkproc___LStrSetLength(v2, 8);
  70.   if ( sub_404BF8(v23, v24, v25) < 8 )
  71.   {
  72.     v4 = sub_404BF8(v23, v24, v25) + 1;
  73.     if ( v4 <= 8 )
  74.     {
  75.       do
  76.       {
  77.         System::__linkproc___LStrCat(v3, &dword_5D1910);
  78.         ++v4;
  79.       }
  80.       while ( v4 != 9 );
  81.     }
  82.   }
  83.   Sysutils::UpperCase(v3, &v29);
  84.   System::__linkproc___LStrLAsg(v5, v29);
  85.   v6 = sub_404BF8(v23, v24, v25);
  86.   if ( v6 > 0 )
  87.   {
  88.     v7 = 1;
  89.     do
  90.     {
  91.       Sysutils::IntToStr(v5, &v28);
  92.       System::__linkproc___LStrCat(v5, v28);
  93.       ++v7;
  94.       --v6;
  95.     }
  96.     while ( v6 );
  97.   }
  98.   if ( *(_BYTE *)v35 == 48 )
  99.     *(_BYTE *)j_unknown_libname_88_0() = 49;
  100.   if ( *(_BYTE *)(v35 + 1) == 48 )
  101.     *(_BYTE *)(j_unknown_libname_88_0() + 1) = 50;
  102.   if ( *(_BYTE *)(v35 + 8) == 48 )
  103.     *(_BYTE *)(j_unknown_libname_88_0() + 8) = 57;
  104.   if ( (unsigned __int8)sub_5D12BC(v5, &v34) )
  105.   {
  106.     *(_BYTE *)(j_unknown_libname_88_0() + 9) = 53;
  107.   }
  108.   else
  109.   {
  110.     if ( v34 )
  111.       *(_BYTE *)(j_unknown_libname_88_0() + 9) = 50;
  112.     else
  113.       *(_BYTE *)(j_unknown_libname_88_0() + 9) = 56;
  114.   }
  115.   System::__linkproc___LStrClr(v23);
  116.   v9 = sub_404BF8(v23, v24, v25);
  117.   if ( v9 > 0 )
  118.   {
  119.     v10 = 1;
  120.     do
  121.     {
  122.       if ( (unsigned int)(v10 - 1) < 2 )
  123.       {
  124.         v11 = v35;
  125.         LOBYTE(v11) = *(_BYTE *)(v35 + v10 - 1);
  126.         unknown_libname_83(v8, v11);
  127.         System::__linkproc___LStrCat(v8, v27);
  128.       }
  129.       else
  130.       {
  131.         if ( (unsigned int)(v10 - 3) >= 2 && !(v10 % 2) )
  132.         {
  133.           v12 = v35;
  134.           LOBYTE(v12) = *(_BYTE *)(v35 + v10 - 1);
  135.           unknown_libname_83(v8, v12);
  136.           System::__linkproc___LStrCat(v8, v26);
  137.         }
  138.       }
  139.       ++v10;
  140.       --v9;
  141.     }
  142.     while ( v9 );
  143.   }
  144.   v39 = Sysutils::StrToInt64();
  145.   v40 = v13;
  146.   v36 = Sysutils::StrToInt64();
  147.   v37 = v14;
  148.   v15 = System::__linkproc____lldiv(100000000, 0);
  149.   v16 = v41;
  150.   *(_DWORD *)(v41 + 800) = v15;
  151.   *(_DWORD *)(v16 + 804) = v17;
  152.   v18 = System::__linkproc____llmod(100000000, 0);
  153.   v19 = v41;
  154.   *(_DWORD *)(v41 + 808) = v18;
  155.   *(_DWORD *)(v19 + 812) = v20;
  156.   *(_QWORD *)(v41 + 784) = *(_QWORD *)(v41 + 800) - 529i64;
  157.   *(_QWORD *)(v41 + 792) = *(_QWORD *)(v41 + 808) - 289i64;
  158.   v21 = v25;
  159.   __writefsdword(0, v23);
  160.   v25 = loc_5D18E0;
  161.   System::__linkproc___LStrArrayClr(v21, 6);
  162.   System::__linkproc___LStrClr(v25);
  163.   return System::__linkproc___LStrClr(v25);
  164. }

Это Вся процедура !

| Сообщение посчитали полезным: Tatarin

Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 28 ноября 2011 18:51
· Личное сообщение · #10

Ого! И это всё серийник? Неплохо!



Ранг: 78.7 (постоянный), 43thx
Активность: 0.070
Статус: Участник

Создано: 28 ноября 2011 19:41 · Поправил: Tyra
· Личное сообщение · #11

Несовсем ! Вы Выбрали Правильный Кусок !
Там Смысл Такой, если я Правильно понял.
Пример.
x = Перша цифра - 12173022
y = Друга цифра - 48321658

(x + 529) * 100000000 + (y + 289) = 1217355148321947
Далее пихаем в Ваш Алго
По первому проходу получаем 12 (т.е. первые 2-е цифры)
По второму проходу берем через один начиная с 5-й цифры получаем 518297
ИТОГО : 12518297

Рега сохраняется Тут ! [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ARM_BTI]


 eXeL@B —› Вопросы новичков —› Расшифрока алгоритма
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати