Сейчас на форуме: vsv1, NIKOLA, r0lka, johnniewalker (+4 невидимых)

 eXeL@B —› Крэки, обсуждения —› Помогите определить метод шифрования.
Посл.ответ Сообщение

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

Создано: 25 июля 2019 22:18 · Поправил: prorokk
· Личное сообщение · #1

Всем привет!
Есть прога на delphi (была накрыта SF 5, часть данных в базе накрыто TCrypt с этим за 15 дней разобрался...).
Осталось:
В ней шифруется числовое значение (Ключиком является другое числовое значение).
Нашел IDA-ой где расшифровывается, получил такой псевдокод:

Code:
  1. // Функция расшифровки
  2. long double __stdcall sub_16EADC0(long double encrypted_val, int a2, int a3, __int16 a4)
  3. {
  4.   volatile signed __int32 *v4; // eax@1
  5.   int v5; // edx@1
  6.   int v6; // ecx@1
  7.   int v7; // edx@1
  8.   int v8; // ecx@1
  9.   int v9; // eax@1
  10.   int v10; // edx@3
  11.   int v11; // eax@6
  12.   long double v12; // fst7@6
  13.   char v13; // al@6
  14.   unsigned int v15; // [sp-Ch] [bp-7Ch]@1
  15.   void *v16; // [sp-8h] [bp-78h]@1
  16.   int *v17; // [sp-4h] [bp-74h]@1
  17.   long double v18; // [sp+0h] [bp-70h]@6
  18.   int v19; // [sp+Ch] [bp-64h]@6
  19.   int v20; // [sp+10h] [bp-60h]@1
  20.   int v21; // [sp+14h] [bp-5Ch]@1
  21.   int v22; // [sp+18h] [bp-58h]@24
  22.   int v23; // [sp+1Ch] [bp-54h]@21
  23.   unsigned __int16 v24; // [sp+22h] [bp-4Eh]@16
  24.   int v25; // [sp+24h] [bp-4Ch]@13
  25.   int v26; // [sp+28h] [bp-48h]@9
  26.   int v27; // [sp+2Ch] [bp-44h]@6
  27.   int v28; // [sp+30h] [bp-40h]@3
  28.   int v29; // [sp+34h] [bp-3Ch]@1
  29.   int v30; // [sp+38h] [bp-38h]@1
  30.   int v31; // [sp+3Ch] [bp-34h]@12
  31.   int v32; // [sp+40h] [bp-30h]@1
  32.   int v33; // [sp+44h] [bp-2Ch]@6
  33.   char v34; // [sp+4Bh] [bp-25h]@6
  34.   int v35; // [sp+4Ch] [bp-24h]@6
  35.   unsigned __int16 v36; // [sp+52h] [bp-1Eh]@6
  36.   int v37; // [sp+54h] [bp-1Ch]@1
  37.   int v38; // [sp+58h] [bp-18h]@1
  38.   int v39; // [sp+5Ch] [bp-14h]@12
  39.   long double v40; // [sp+60h] [bp-10h]@28
  40.   int savedregs; // [sp+70h] [bp+0h]@1
  41.  
  42.   v20 = 0;
  43.   v21 = 0;
  44.   v38 = 0;
  45.   v37 = 0;
  46.   v32 = 0;
  47.   v17 = &savedregs;
  48.   v16 = &loc_16EB04D;
  49.   v15 = __readfsdword(0);
  50.   __writefsdword(0, &v15);
  51.   sub_408910(&v38, L"nekiystring");
  52.   v4 = sub_408910(&v37, 0);
  53.   LOWORD(v4) = a4;
  54.   sub_41DA78(&v21, v5, v6, v4, a3, a2);
  55.   v30 = v21;
  56.   HIWORD(v9) = HIWORD(v21);
  57.   v29 = v21;
  58.   if ( v21 )
  59.   {
  60.     v9 = *(v29 - 4);
  61.     v29 = *(v29 - 4);
  62.   }
  63.   LOWORD(v9) = a4;
  64.   sub_41DA78(&v20, v7, v8, v9, a3, a2);
  65.   HIWORD(v10) = HIWORD(v29);
  66.   LOWORD(v10) = *(v20 + 2 * v29 - 2);
  67.   unknown_libname_84(&v37, v10);
  68.   v28 = v38;
  69.   if ( v38 && *(v28 - 10) != 2 )
  70.     v28 = sub_407748(&v38, v38);
  71.   v11 = sub_419CD4(v37);
  72.   v36 = *(v28 + 2 * v11);
  73.   v35 = v36;
  74.   v19 = sub_419CD4(v37) + 1;
  75.   v18 = v19;
  76.   v12 = encrypted_val * encrypted_val * v35 / v18;
  77.   v13 = System::__linkproc__ ROUND(*&v12);
  78.   Sysutils::IntToStr(v13);
  79.   v33 = 0;
  80.   v34 = 0;
  81.   v27 = v32;
  82.   if ( v32 && *(v27 - 10) != 2 )
  83.     v27 = sub_407748(&v32, v32);
  84.   v26 = v27;
  85.   if ( v27 )
  86.     v26 = *(v26 - 4);
  87.   if ( v26 > 0 )
  88.   {
  89.     v31 = v26;
  90.     v39 = 1;
  91.     do
  92.     {
  93.       v25 = v32;
  94.       if ( v32 && *(v25 - 10) != 2 )    
  95.         v25 = sub_407748(&v32, v32);
  96.       v24 = *(v25 + 2 * v39 - 2);
  97.       if ( (*(v25 + 2 * v39 - 2) - 97) < 0x1Au )
  98.         v24 = *(v25 + 2 * v39 - 2) & 0xFFDF;
  99.       if ( v24 >= 0x100u || !_bittest(&dword_178B23C, v24) )
  100.         v34 = 1;
  101.       v23 = v32;
  102.       if ( v32 && *(v23 - 10) != 2 )
  103.         v23 = sub_407748(&v32, v32);
  104.       v22 = v23;
  105.       if ( v23 )
  106.         v22 = *(v22 - 4);
  107.       v33 += (*(v32 + 2 * v39 - 2) - 48) << 3 * (v22 - v39);
  108.       ++v39;
  109.       --v31;
  110.     }
  111.     while ( v31 );
  112.   }
  113.   if ( v34 )
  114.     v40 = 0.0;
  115.   else
  116.     v40 = v33 / 1000.0;
  117.   __writefsdword(0, v15);
  118.   v17 = &loc_16EB054;
  119.   sub_4088B4(&v20, 2);
  120.   sub_4088AC(&v32);
  121.   sub_4088B4(&v37, 2);
  122.   return v40;
  123. }


Прошу подсказки как определить шифрование, а может кто сталкивался с таким.
Если можно объясните что и как считается тут:
v33 += (*(v32 + 2 * v39 - 2) - 48) << 3 * (v22 - v39);
Отладчиком вижу все значения, считаю в калькуляторе, ответ не сходиться с v33.
* это не умножение а ссылка на переменную?

Если кто возьмется переписать этот код на что-то более читабельное или рипнуть ASM из IDA за ₽... Приветствую в ЛС




Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

Создано: 25 июля 2019 22:45
· Личное сообщение · #2

prorokk пишет:
* это не умножение а ссылка на переменную?


Dereferencing the pointer?

-----
Give me a HANDLE and I will move the Earth.





Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 26 июля 2019 02:01
· Личное сообщение · #3

... << 3 * ...
Возможно в этой части выражения порядок действий применил не тот. Хз вообще как можно на один только декомпиль полагаться не сверяясь с листингом.

-----
2 оттенка серого


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


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

Создано: 26 июля 2019 07:57
· Личное сообщение · #4

prorokk
f13nd прав.
Ты лучше бы, дополнительно, показал бы кусок ассемблерного кода, который декомпилировал.



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

Создано: 26 июля 2019 08:55 · Поправил: prorokk
· Личное сообщение · #5

plutos да именно про это я и говорю.. в С а тем более в С от HexRays не бум бум..

f13nd
BlackCode

Code:
  1. .text:016EADC0 ; Функция расшифроки
  2. .text:016EADC0 ; Attributes: bp-based frame
  3. .text:016EADC0
  4. .text:016EADC0 ; long double __stdcall sub_16EADC0(long double time_value, int a2, int a3, __int16 a4)
  5. .text:016EADC0 sub_16EADC0 proc near                   ; CODE XREF: sub_130A1F8+93p
  6. .text:016EADC0                                         ; sub_130A300+F4p ...
  7. .text:016EADC0
  8. .text:016EADC0 var_70= tbyte ptr -70h
  9. .text:016EADC0 var_64= dword ptr -64h
  10. .text:016EADC0 var_60= dword ptr -60h
  11. .text:016EADC0 var_5C= dword ptr -5Ch
  12. .text:016EADC0 var_58= dword ptr -58h
  13. .text:016EADC0 var_54= dword ptr -54h
  14. .text:016EADC0 var_4E= word ptr -4Eh
  15. .text:016EADC0 var_4C= dword ptr -4Ch
  16. .text:016EADC0 var_48= dword ptr -48h
  17. .text:016EADC0 var_44= dword ptr -44h
  18. .text:016EADC0 var_40= dword ptr -40h
  19. .text:016EADC0 var_3C= dword ptr -3Ch
  20. .text:016EADC0 var_38= dword ptr -38h
  21. .text:016EADC0 var_34= dword ptr -34h
  22. .text:016EADC0 var_30= dword ptr -30h
  23. .text:016EADC0 var_2C= dword ptr -2Ch
  24. .text:016EADC0 var_25= byte ptr -25h
  25. .text:016EADC0 var_24= dword ptr -24h
  26. .text:016EADC0 var_1E= word ptr -1Eh
  27. .text:016EADC0 var_1C= dword ptr -1Ch
  28. .text:016EADC0 var_18= dword ptr -18h
  29. .text:016EADC0 var_14= dword ptr -14h
  30. .text:016EADC0 var_10= tbyte ptr -10h
  31. .text:016EADC0 encrypted_val= tbyte ptr  8
  32. .text:016EADC0 arg_C= dword ptr  14h
  33. .text:016EADC0 arg_10= dword ptr  18h
  34. .text:016EADC0 arg_14= word ptr  1Ch
  35. .text:016EADC0
  36. .text:016EADC0 push    ebp
  37. .text:016EADC1 mov     ebp, esp
  38. .text:016EADC3 add     esp, 0FFFFFF90h
  39. .text:016EADC6 xor     eax, eax
  40. .text:016EADC8 mov     [ebp+var_60], eax
  41. .text:016EADCB mov     [ebp+var_5C], eax
  42. .text:016EADCE mov     [ebp+var_18], eax
  43. .text:016EADD1 mov     [ebp+var_1C], eax
  44. .text:016EADD4 mov     [ebp+var_30], eax
  45. .text:016EADD7 xor     eax, eax
  46. .text:016EADD9 push    ebp
  47. .text:016EADDA push    offset loc_16EB04D
  48. .text:016EADDF push    dword ptr fs:[eax]
  49. .text:016EADE2 mov     fs:[eax], esp
  50. .text:016EADE5 lea     eax, [ebp+var_18]
  51. .text:016EADE8 mov     edx, offset aNekiyStrig
  52. .text:016EADED call    sub_408910
  53. .text:016EADF2 lea     eax, [ebp+var_1C]
  54. .text:016EADF5 xor     edx, edx
  55. .text:016EADF7 call    sub_408910
  56. .text:016EADFC mov     ax, [ebp+arg_14]
  57. .text:016EAE00 push    eax
  58. .text:016EAE01 push    [ebp+arg_10]
  59. .text:016EAE04 push    [ebp+arg_C]
  60. .text:016EAE07 lea     eax, [ebp+var_5C]
  61. .text:016EAE0A call    sub_41DA78
  62. .text:016EAE0F mov     eax, [ebp+var_5C]
  63. .text:016EAE12 mov     [ebp+var_38], eax
  64. .text:016EAE15 mov     eax, [ebp+var_38]
  65. .text:016EAE18 mov     [ebp+var_3C], eax
  66. .text:016EAE1B cmp     [ebp+var_3C], 0
  67. .text:016EAE1F jz      short loc_16EAE2C
  68. .text:016EAE21 mov     eax, [ebp+var_3C]
  69. .text:016EAE24 sub     eax, 4
  70. .text:016EAE27 mov     eax, [eax]
  71. .text:016EAE29 mov     [ebp+var_3C], eax
  72. .text:016EAE2C
  73. .text:016EAE2C loc_16EAE2C:                            ; CODE XREF: sub_16EADC0+5Fj
  74. .text:016EAE2C mov     ax, [ebp+arg_14]
  75. .text:016EAE30 push    eax
  76. .text:016EAE31 push    [ebp+arg_10]
  77. .text:016EAE34 push    [ebp+arg_C]
  78. .text:016EAE37 lea     eax, [ebp+var_60]
  79. .text:016EAE3A call    sub_41DA78
  80. .text:016EAE3F mov     eax, [ebp+var_60]
  81. .text:016EAE42 mov     edx, [ebp+var_3C]
  82. .text:016EAE45 mov     dx, [eax+edx*2-2]
  83. .text:016EAE4A lea     eax, [ebp+var_1C]
  84. .text:016EAE4D call    unknown_libname_84              ; BDS 2005-2007 and Delphi6-7 Visual Component Library
  85. .text:016EAE52 mov     eax, [ebp+var_18]
  86. .text:016EAE55 mov     [ebp+var_40], eax
  87. .text:016EAE58 cmp     [ebp+var_40], 0
  88. .text:016EAE5C jz      short loc_16EAE78
  89. .text:016EAE5E mov     eax, [ebp+var_40]
  90. .text:016EAE61 sub     eax, 0Ah
  91. .text:016EAE64 cmp     word ptr [eax], 2
  92. .text:016EAE68 jz      short loc_16EAE78
  93. .text:016EAE6A lea     eax, [ebp+var_18]
  94. .text:016EAE6D mov     edx, [ebp+var_18]
  95. .text:016EAE70 call    sub_407748
  96. .text:016EAE75 mov     [ebp+var_40], eax
  97. .text:016EAE78
  98. .text:016EAE78 loc_16EAE78:                            ; CODE XREF: sub_16EADC0+9Cj
  99. .text:016EAE78                                         ; sub_16EADC0+A8j
  100. .text:016EAE78 mov     eax, [ebp+var_1C]
  101. .text:016EAE7B call    sub_419CD4
  102. .text:016EAE80 mov     edx, [ebp+var_40]
  103. .text:016EAE83 mov     ax, [edx+eax*2]
  104. .text:016EAE87 mov     [ebp+var_1E], ax
  105. .text:016EAE8B movzx   eax, [ebp+var_1E]
  106. .text:016EAE8F mov     [ebp+var_24], eax
  107. .text:016EAE92 mov     eax, [ebp+var_1C]
  108. .text:016EAE95 call    sub_419CD4
  109. .text:016EAE9A inc     eax
  110. .text:016EAE9B mov     [ebp+var_64], eax
  111. .text:016EAE9E fild    [ebp+var_64]
  112. .text:016EAEA1 fstp    [ebp+var_70]
  113. .text:016EAEA4 wait
  114. .text:016EAEA5 fld     [ebp+encrypted_val]
  115. .text:016EAEA8 fmul    st, st
  116. .text:016EAEAA fild    [ebp+var_24]
  117. .text:016EAEAD fmulp   st(1), st
  118. .text:016EAEAF fld     [ebp+var_70]
  119. .text:016EAEB2 fdivp   st(1), st
  120. .text:016EAEB4 call    @System@@ROUND$qqrv             ; System::__linkproc__ ROUND(void)
  121. .text:016EAEB9 push    edx
  122. .text:016EAEBA push    eax                             ; char
  123. .text:016EAEBB lea     eax, [ebp+var_30]
  124. .text:016EAEBE call    @Sysutils@IntToStr$qqrj         ; Sysutils::IntToStr(__int64)
  125. .text:016EAEC3 xor     eax, eax
  126. .text:016EAEC5 mov     [ebp+var_2C], eax
  127. .text:016EAEC8 mov     [ebp+var_25], 0
  128. .text:016EAECC mov     eax, [ebp+var_30]
  129. .text:016EAECF mov     [ebp+var_44], eax
  130. .text:016EAED2 cmp     [ebp+var_44], 0
  131. .text:016EAED6 jz      short loc_16EAEF2
  132. .text:016EAED8 mov     eax, [ebp+var_44]
  133. .text:016EAEDB sub     eax, 0Ah
  134. .text:016EAEDE cmp     word ptr [eax], 2
  135. .text:016EAEE2 jz      short loc_16EAEF2
  136. .text:016EAEE4 lea     eax, [ebp+var_30]
  137. .text:016EAEE7 mov     edx, [ebp+var_30]
  138. .text:016EAEEA call    sub_407748
  139. .text:016EAEEF mov     [ebp+var_44], eax
  140. .text:016EAEF2
  141. .text:016EAEF2 loc_16EAEF2:                            ; CODE XREF: sub_16EADC0+116j
  142. .text:016EAEF2                                         ; sub_16EADC0+122j
  143. .text:016EAEF2 mov     eax, [ebp+var_44]
  144. .text:016EAEF5 mov     [ebp+var_48], eax
  145. .text:016EAEF8 cmp     [ebp+var_48], 0
  146. .text:016EAEFC jz      short loc_16EAF09
  147. .text:016EAEFE mov     eax, [ebp+var_48]
  148. .text:016EAF01 sub     eax, 4
  149. .text:016EAF04 mov     eax, [eax]
  150. .text:016EAF06 mov     [ebp+var_48], eax
  151. .text:016EAF09
  152. .text:016EAF09 loc_16EAF09:                            ; CODE XREF: sub_16EADC0+13Cj
  153. .text:016EAF09 mov     eax, [ebp+var_48]
  154. .text:016EAF0C test    eax, eax
  155. .text:016EAF0E jle     loc_16EAFFC
  156. .text:016EAF14 mov     [ebp+var_34], eax
  157. .text:016EAF17 mov     [ebp+var_14], 1
  158. .text:016EAF1E
  159. .text:016EAF1E loc_16EAF1E:                            ; CODE XREF: sub_16EADC0+236j
  160. .text:016EAF1E mov     eax, [ebp+var_30]
  161. .text:016EAF21 mov     [ebp+var_4C], eax
  162. .text:016EAF24 cmp     [ebp+var_4C], 0
  163. .text:016EAF28 jz      short loc_16EAF44
  164. .text:016EAF2A mov     eax, [ebp+var_4C]
  165. .text:016EAF2D sub     eax, 0Ah
  166. .text:016EAF30 cmp     word ptr [eax], 2
  167. .text:016EAF34 jz      short loc_16EAF44
  168. .text:016EAF36 lea     eax, [ebp+var_30]
  169. .text:016EAF39 mov     edx, [ebp+var_30]
  170. .text:016EAF3C call    sub_407748
  171. .text:016EAF41 mov     [ebp+var_4C], eax
  172. .text:016EAF44
  173. .text:016EAF44 loc_16EAF44:                            ; CODE XREF: sub_16EADC0+168j
  174. .text:016EAF44                                         ; sub_16EADC0+174j
  175. .text:016EAF44 mov     eax, [ebp+var_14]
  176. .text:016EAF47 mov     edx, [ebp+var_4C]
  177. .text:016EAF4A mov     ax, [edx+eax*2-2]
  178. .text:016EAF4F mov     [ebp+var_4E], ax
  179. .text:016EAF53 mov     eax, [ebp+var_14]
  180. .text:016EAF56 mov     edx, [ebp+var_4C]
  181. .text:016EAF59 mov     ax, [edx+eax*2-2]
  182. .text:016EAF5E add     eax, 0FFFFFF9Fh
  183. .text:016EAF61 sub     ax, 1Ah
  184. .text:016EAF65 jnb     short loc_16EAF7A
  185. .text:016EAF67 mov     eax, [ebp+var_14]
  186. .text:016EAF6A mov     edx, [ebp+var_4C]
  187. .text:016EAF6D mov     ax, [edx+eax*2-2]
  188. .text:016EAF72 and     ax, 0FFDFh
  189. .text:016EAF76 mov     [ebp+var_4E], ax
  190. .text:016EAF7A
  191. .text:016EAF7A loc_16EAF7A:                            ; CODE XREF: sub_16EADC0+1A5j
  192. .text:016EAF7A cmp     [ebp+var_4E], 100h
  193. .text:016EAF80 jnb     short loc_16EAF93
  194. .text:016EAF82 mov     al, byte ptr [ebp+var_4E]
  195. .text:016EAF85 and     eax, 0FFh
  196. .text:016EAF8A bt      ds:dword_178B23C, eax
  197. .text:016EAF91 jb      short loc_16EAF97
  198. .text:016EAF93
  199. .text:016EAF93 loc_16EAF93:                            ; CODE XREF: sub_16EADC0+1C0j
  200. .text:016EAF93 mov     [ebp+var_25], 1
  201. .text:016EAF97
  202. .text:016EAF97 loc_16EAF97:                            ; CODE XREF: sub_16EADC0+1D1j
  203. .text:016EAF97 mov     eax, [ebp+var_30]
  204. .text:016EAF9A mov     [ebp+var_54], eax
  205. .text:016EAF9D cmp     [ebp+var_54], 0
  206. .text:016EAFA1 jz      short loc_16EAFBD
  207. .text:016EAFA3 mov     eax, [ebp+var_54]
  208. .text:016EAFA6 sub     eax, 0Ah
  209. .text:016EAFA9 cmp     word ptr [eax], 2
  210. .text:016EAFAD jz      short loc_16EAFBD
  211. .text:016EAFAF lea     eax, [ebp+var_30]
  212. .text:016EAFB2 mov     edx, [ebp+var_30]
  213. .text:016EAFB5 call    sub_407748
  214. .text:016EAFBA mov     [ebp+var_54], eax
  215. .text:016EAFBD
  216. .text:016EAFBD loc_16EAFBD:                            ; CODE XREF: sub_16EADC0+1E1j
  217. .text:016EAFBD                                         ; sub_16EADC0+1EDj
  218. .text:016EAFBD mov     eax, [ebp+var_54]
  219. .text:016EAFC0 mov     [ebp+var_58], eax
  220. .text:016EAFC3 cmp     [ebp+var_58], 0
  221. .text:016EAFC7 jz      short loc_16EAFD4
  222. .text:016EAFC9 mov     eax, [ebp+var_58]
  223. .text:016EAFCC sub     eax, 4
  224. .text:016EAFCF mov     eax, [eax]
  225. .text:016EAFD1 mov     [ebp+var_58], eax
  226. .text:016EAFD4
  227. .text:016EAFD4 loc_16EAFD4:                            ; CODE XREF: sub_16EADC0+207j
  228. .text:016EAFD4 mov     eax, [ebp+var_58]
  229. .text:016EAFD7 sub     eax, [ebp+var_14]
  230. .text:016EAFDA lea     ecx, [eax+eax*2]
  231. .text:016EAFDD mov     eax, [ebp+var_30]
  232. .text:016EAFE0 mov     edx, [ebp+var_14]
  233. .text:016EAFE3 movzx   eax, word ptr [eax+edx*2-2]
  234. .text:016EAFE8 sub     eax, 30h
  235. .text:016EAFEB shl     eax, cl
  236. .text:016EAFED add     [ebp+var_2C], eax
  237. .text:016EAFF0 inc     [ebp+var_14]
  238. .text:016EAFF3 dec     [ebp+var_34]
  239. .text:016EAFF6 jnz     loc_16EAF1E




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

Создано: 26 июля 2019 09:04
· Личное сообщение · #6

продолжение:
Code:
  1. .text:016EAFFC loc_16EAFFC:                            ; CODE XREF: sub_16EADC0+14Ej
  2. .text:016EAFFC cmp     [ebp+var_25], 0
  3. .text:016EB000 jz      short loc_16EB010
  4. .text:016EB002 xor     eax, eax
  5. .text:016EB004 mov     dword ptr [ebp+var_10], eax
  6. .text:016EB007 mov     dword ptr [ebp+var_10+4], eax
  7. .text:016EB00A mov     word ptr [ebp+var_10+8], ax
  8. .text:016EB00E jmp     short loc_16EB01D
  9. .text:016EB010 ; ---------------------------------------------------------------------------
  10. .text:016EB010
  11. .text:016EB010 loc_16EB010:                            ; CODE XREF: sub_16EADC0+240j
  12. .text:016EB010 fild    [ebp+var_2C]
  13. .text:016EB013 fdiv    dword ptr ds:unk_16EB084
  14. .text:016EB019 fstp    [ebp+var_10]
  15. .text:016EB01C wait
  16. .text:016EB01D
  17. .text:016EB01D loc_16EB01D:                            ; CODE XREF: sub_16EADC0+24Ej
  18. .text:016EB01D xor     eax, eax
  19. .text:016EB01F pop     edx
  20. .text:016EB020 pop     ecx
  21. .text:016EB021 pop     ecx
  22. .text:016EB022 mov     fs:[eax], edx
  23. .text:016EB025 push    offset loc_16EB054
  24. .text:016EB02A
  25. .text:016EB02A loc_16EB02A:                            ; CODE XREF: sub_16EADC0+292j
  26. .text:016EB02A lea     eax, [ebp+var_60]
  27. .text:016EB02D mov     edx, 2
  28. .text:016EB032 call    sub_4088B4
  29. .text:016EB037 lea     eax, [ebp+var_30]
  30. .text:016EB03A call    sub_4088AC
  31. .text:016EB03F lea     eax, [ebp+var_1C]
  32. .text:016EB042 mov     edx, 2
  33. .text:016EB047 call    sub_4088B4
  34. .text:016EB04C retn
  35. .text:016EB04D ; ---------------------------------------------------------------------------
  36. .text:016EB04D
  37. .text:016EB04D loc_16EB04D:                            ; DATA XREF: sub_16EADC0+1Ao
  38. .text:016EB04D jmp     @System@@HandleFinally$qqrv     ; System::__linkproc__ HandleFinally(void)
  39. .text:016EB052 ; ---------------------------------------------------------------------------
  40. .text:016EB052 jmp     short loc_16EB02A
  41. .text:016EB054 ; ---------------------------------------------------------------------------
  42. .text:016EB054
  43. .text:016EB054 loc_16EB054:                            ; CODE XREF: sub_16EADC0+28Cj
  44. .text:016EB054                                         ; DATA XREF: sub_16EADC0+265o
  45. .text:016EB054 fld     [ebp+var_10]
  46. .text:016EB057 mov     esp, ebp
  47. .text:016EB059 pop     ebp
  48. .text:016EB05A retn    18h
  49. .text:016EB05A sub_16EADC0 endp
  50. .text:016EB05A




Ранг: 20.2 (новичок), 16thx
Активность: 0.020.01
Статус: Участник

Создано: 26 июля 2019 09:11
· Личное сообщение · #7

Дружище, а что за идея делать Сишный листинг, если компайлер паскалевский?
Сигнатуры Kanal наложи или другие из DiE, может что подскажет.




Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 26 июля 2019 09:26 · Поправил: f13nd
· Личное сообщение · #8

Code:
  1. .text:016EAFD4 mov     eax, [ebp+var_58]
  2. .text:016EAFD7 sub     eax, [ebp+var_14]
  3. .text:016EAFDA lea     ecx, [eax+eax*2]
  4. .text:016EAFDD mov     eax, [ebp+var_30]
  5. .text:016EAFE0 mov     edx, [ebp+var_14]
  6. .text:016EAFE3 movzx   eax, word ptr [eax+edx*2-2]
  7. .text:016EAFE8 sub     eax, 30h
  8. .text:016EAFEB shl     eax, cl

Вот выборка слова по адресу var_14*2 + var_30 - 2, вычитание из него 48 (очевидно преобразование из символа 0..9 в число) и сдвиг на (var_58 - var_14)*3 влево. var_14 очевидно номер символа в строке (начиная с 1), var_30 указатель на строку.

-----
2 оттенка серого




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

Создано: 26 июля 2019 10:32
· Личное сообщение · #9

GroundHog
DiE особо не помог... только сказал что Delphi 2010.

Проходил и x3chuns crypto searcher, чего он только не нашел... но все не в той области что разбираю я (хотя это наверно не показатель)

про Сишный листинг не знал не знал... Я первый раз)

f13nd
Спасибо! Теперь попытаюсь это понять и применить...




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 26 июля 2019 16:27
· Личное сообщение · #10

немного <offtop>
Code:
  1. 016EAF97 mov     eax, [ebp+var_30]
  2. 016EAF9A mov     [ebp+var_54], eax   ; копирование указателя во временную переменную
  3. 016EAF9D cmp     [ebp+var_54], 0
  4. 016EAFA1 jz      short loc_16EAFBD 
  5. 016EAFA3 mov     eax, [ebp+var_54]
  6. 016EAFA6 sub     eax, 0Ah
  7. 016EAFA9 cmp     word ptr [eax], 2    ; не уверен насчёт флага. мб проверка на статичный объект
  8. 016EAFAD jz      short loc_16EAFBD
  9. 016EAFAF lea     eax, [ebp+var_30]
  10. 016EAFB2 mov     edx, [ebp+var_30]
  11. 016EAFB5 call    sub_407748
  12. 016EAFBA mov     [ebp+var_54], eax  ; вот теперь объект строки официально присвоен, с увеличением счётчика ссылок
  13. 016EAFBD
  14. 016EAFBD loc_16EAFBD: 
  15. 016EAFBD mov     eax, [ebp+var_54]
  16. 016EAFC0 mov     [ebp+var_58], eax
  17. 016EAFC3 cmp     [ebp+var_58], 0
  18. 016EAFC7 jz      short loc_16EAFD4
  19. 016EAFC9 mov     eax, [ebp+var_58]
  20. 016EAFCC sub     eax, 4
  21. 016EAFCF mov     eax, [eax]
  22. 016EAFD1 mov     [ebp+var_58], eax  ; и вот наконец мы имеем длину строки



вопрос: зачем дельфи так поступает? копирует с увеличением счётчика ссылок, когда в коде просто берётся длина строки?
я просто железобетонно уверен, что в исходнике ничего такого нет - это всё компиляторная придурь
</offtop>


prorokk
псевдокод после опускания бессмысленных перетасовок выглядит примерно так
Code:
  1.  
  2.     var18 = ref (nekiystring)
  3.     var1C = ref (0)
  4.  
  5.     var_60 = sub_41DA78 (arg_C, arg_10, word arg_14)
  6.     var_1C = unknown_libname_84 (var_60 [(var_60.length-1)*2]) ; len*2-2 обращение к последнему символу юникод-строки
  7.  
  8.     eax = sub_419CD4 (var_1C)
  9.     var_1E = var_18 [eax*2]
  10.     var_64 = sub_419CD4 (var_1C)+1
  11.    ; собственно, магия. дальше лишь трансформация результата
  12.     var_30 = IntToStr (encrypted_val ** 2 * var_1E / float (var_64))
  13.  
  14.     var_2C = 0
  15.     var_28[3] = 0
  16.  
  17.     for i in xrange (var_30.length):
  18.       var_4C = var_30
  19.       var_4E = var_30 [i]
  20.       
  21.       ; выглядит как работа с латинскими буквами, но на входе же цифры после IntToStr... нипанятна
  22.       eax = var_4E - 'a' - 0x26
  23.       jnb @f
  24.         var_4E & ~0x20
  25.       @@:
  26.  
  27.       ; прогонка по битовой таблице. если в таблице бит опущен - после цикла будет фейл
  28.       if var_4E >= 0x100  or  <bt bytearray_178B23C, var_4E>:
  29.         var_25 = 1
  30.  
  31.       ; выходит что цифры не должны занимать больше трёх бит, иначе будут потери
  32.       ecx = (var_30.length-1-i) * 3
  33.       var_2C += (var_30 [i] - '0') << ecx
  34.  
  35.     ; цикл кончился
  36.     loc_16EAFFC:
  37.       if var_25:
  38.         memset (var_10, '\0', 10)   ; обнуление результата
  39.       else:
  40.         var_10 = fstp tbyte (var_2C / unk_16EB084)
  41.  
  42.     return var_10 ; возвращает флоат через st(0)




Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 26 июля 2019 18:45 · Поправил: user99
· Личное сообщение · #11

-=AkaBOSS=- пишет:
я просто железобетонно уверен, что в исходнике ничего такого нет - это всё компиляторная придурь

код в стиле
Code:
  1.   s2 := s1;
  2.   if (Length(s2) = 0) then
  3.     ...

не может быть написан человеком?




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 26 июля 2019 19:34 · Поправил: -=AkaBOSS=-
· Личное сообщение · #12

user99 пишет:
код в стиле

а, так копирование строк в нигде больше не используемую переменную перед тем как её длину взять - это такой стиль? ну ок тогда.

// оффтоп вышел из-под контроля.
user99
Я Вам на больное место наступил штоль?

Вопрос был не о том, может ли кодер написать такие грабли, и раскопипастить их три-четыре раза в пределах одной функции - безусловно, кодер может всё.
Просто не первый раз встречаю подобные шаблонные конструкции в дельфячьих бинарях, и удивляюсь их избыточности.



Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 26 июля 2019 20:17
· Личное сообщение · #13

-=AkaBOSS=-, т.е. все программисты на 100% идеальны и говнокодеров не существует? а может быть у вас не бывает говнокода в ваших проектах? может быть где-то что-то воткнули для отладки, а потом забыли? может быть планировался другой функционал, но его не написали (удалили)? ну да, верю, в идеального программиста




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

Создано: 27 июля 2019 02:25
· Личное сообщение · #14

-=AkaBOSS=-

> в дельфячьих бинарях, и удивляюсь их избыточности.

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

-----
vx





Ранг: 271.2 (наставник), 331thx
Активность: 0.321.49
Статус: Участник

Создано: 27 июля 2019 05:00
· Личное сообщение · #15

Тут десятичные числа опорной таблицы для шифрования хранятся в юникод-строке и сам по себе алгоритм страшный как моя жизнь. По теореме эскобара, будь он на цэ написан и скомпилен ржавчиной или еще какой-нибудь перхотью, это ничего бы не изменило. Мы живем в эпоху постпрограммирования, когда программы пишут мышью и все их недостатки компенсируются мощностью проца и объемом памяти, а вы еще чему-то удивляетесь.

-----
2 оттенка серого




Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 27 июля 2019 08:28
· Личное сообщение · #16

-=AkaBOSS=- пишет:
Я Вам на больное место наступил штоль?

Ни в коем случае. Уже очень много раз слышал подобные безапелляционные рассуждения в стиле "делфи - говно" (посмотрите на difexacaw), если задача обосрать делфи и немного возвыситься самому, то все ок, я умываю руки. Если все-таки хочется чутка приблизиться к истине, то я вам высказал свое наблюдение относительно делфи и его кода. При этом я не говорю "делфи - идеальный компилятор", но как показывает практика: говеного скомпилированного кода в нем появляется не чаще, чем в том же с++, и большая часть говна идет от программиста



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 27 июля 2019 11:37 · Поправил: cppasm
· Личное сообщение · #17

Внезапно, ты сам и показал что дельфовый компилятор оптимизирует фигово.
Все нормальные плюсовые компиляторы при коде с копированием строки в другую только для того чтобы получить длину копии весь этот код выбросят нафиг и возьмут длину оригинала.
Даже если программист по какой-то причине написал такой бред.



Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 27 июля 2019 12:32
· Личное сообщение · #18

cppasm, резонное замечание о недостаточно полной оптимизации и вычистки мусора за программистом.
Но ради интереса взял визуал студио и скомпилил примитивный код
Code:
  1.          string s1;
  2.          s1 = "string1";
  3.          if (0 == s1.length())
  4.                  return 0xDEADC0DE;
  5.          return 0;

дальше добавил объявление неиспользуемой переменной s2:
Code:
  1.          string s1, s2;
  2.          s1 = "string1";
  3.          if (0 == s1.length())
  4.                  return 0xDEADC0DE;
  5.          return 0;

дальше ввел ненужное присваивание:
Code:
  1.          string s1, s2;
  2.          s1 = "string1";
  3.          s2 = s1;
  4.          if (0 == s2.length())
  5.                  return 0xDEADC0DE;
  6.          return 0;

и на выходе получилось 3 бинарника с различным количество вызываемых функции для обработки строк, хотя вроде как бинарники должны были быть идентичными, т.к. сишный компилятор должен все ненужное вырезать.

Сборка релизная с включенной оптимизацией по минимальному размеру и пробовал оптимизацию по скорости. Может там еще какие-то особые настройки, которые позволяют убирать избыточный код, но я такие не видел.



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

Создано: 29 июля 2019 11:16 · Поправил: prorokk
· Личное сообщение · #19

f13nd
-=AkaBOSS=-
Большое спасибо за Ваше участие!

Вот еще часть которую не могу понять

Code:
  1. .text:0135858D mov     edx, [eax]              
  2. .text:0135858F call    dword ptr [edx+64h]         ; Выборка значения из базы
  3. .text:01358592 mov     [ebp+var_64], eax          ; Копируем EAX = Record_ID = 0x21 = 33 в ebp-64
  4. .text:01358595 fild    [ebp+var_64]                    ; Меняем формат на 3.3e1 грузим в ST0 А как это написать в Delphi? желательно одной строкой)
  5. .text:01358598 add     esp, 0FFFFFFF4h               ; х.з.
  6. .text:0135859B fstp    tbyte ptr [esp+0FCh+var_FC]     ; сохраняет значение ST0 3.3e1 в память? (в памяти это: 00 00 00 84 04 40)
  7. .text:0135859E wait
  8.  
  9. Выборка шифрованного значения
  10. .text:0135859F mov     eax, [ebp+var_4]
  11. .text:013585A2 mov     eax, [eax+458h]                 ; this
  12. .text:013585A8 mov     edx, offset aValue_2       ; System::AnsiString
  13. .text:013585AD call    @Db@TDataSet@FieldByName$qqrx17System@AnsiString ; Db::TDataSet::FieldByName(System::AnsiString)
  14. .text:013585B2 mov     edx, [eax]
  15. .text:013585B4 call    dword ptr [edx+5Ch]
  16. .text:013585B7 add     esp, 0FFFFFFF4h
  17. .text:013585BA fstp    tbyte ptr [esp+108h+var_108]    ; long double
  18. .text:013585BD wait
  19. .text:013585BE call    sub_16EADC0                     ; Функция расшифровки


sub_16EADC0(long double encrypted_val, int a2, int a3, __int16 a4)
на входе у нее:
encrypted_val = 85.482331014442110018
a2 = 0 (ebp+14)
a3 = 0x84000000 (ebp+18)
a4 = 0x4004 (ebp+1C)

a3,a4 появляются после:
.text:0135859B fstp tbyte ptr [esp+0FCh+var_FC] ; х.з.



Ранг: 20.8 (новичок), 7thx
Активность: 0.010.02
Статус: Участник

Создано: 29 июля 2019 12:05 · Поправил: int_256
· Личное сообщение · #20

user99 пишет:
Ни в коем случае. Уже очень много раз слышал подобные безапелляционные рассуждения в стиле "делфи - говно" (посмотрите на difexacaw), если задача обосрать делфи и немного возвыситься самому, то все ок, я умываю руки. Если все-таки хочется чутка приблизиться к истине, то я вам высказал свое наблюдение относительно делфи и его кода. При этом я не говорю "делфи - идеальный компилятор", но как показывает практика: говеного скомпилированного кода в нем появляется не чаще, чем в том же с++, и большая часть говна идет от программиста


у дельфе всегда финальный код был куском неоптимизированного говна. Даже 6 вижуал студия с прошлого века генерировала лучше код, чем дельфи щас. Дельфе всегда был любим в постсовке школоло, преподами-старперами и пенсионерами, за то что можно было прогать мышкой и из говна и палок наляпать прототип за час. Жирный бинарь хелоуворлд был минимум в 1,5МБ длиной то что тупой компилятор прикручивал всю VCL и не мог собрать граф зависимостей и убрать мертвый код



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 29 июля 2019 12:18
· Личное сообщение · #21

int_256
Перестаньте ерунду писать и поднимать флеймы 20 летней давности. У людей с прямыми руками и бинари были тонкие и даже драйвера на делфях писали.

-----
старый пень


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

Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 29 июля 2019 12:32
· Личное сообщение · #22

prorokk пишет:
Меняем формат на 3.3e1 грузим в ST0 А как это написать в Delphi? желательно одной строкой)

Code:
  1. var
  2.   f: Extended;
  3.   i: Integer;
  4. begin
  5.   f := i;
  6. end;


В более менее свежих делфи можешь написать код, поставить на него бряк и когда выполнение остановится, то нажать Ctrl+Alt+C - увидишь асм-код, иногда помогает при исследовании.



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

Создано: 29 июля 2019 13:42 · Поправил: prorokk
· Личное сообщение · #23

user99
Спасибо! Еще на шаг ближе к победе)



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

Создано: 30 июля 2019 11:26 · Поправил: prorokk
· Личное сообщение · #24

Все же не понял как работает эта команда...
Code:
  1. .text:016EAF8A bt      ds:dword_178B23C, eax


если первый параметр это ссылка на arry тогда там:
Code:
  1. 00 00 00 00 00 00 FF 00  00 00 00 00 00 00 00 00
  2. 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00


второй параметр:
eax = 0x38




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 30 июля 2019 13:51 · Поправил: -=AkaBOSS=-
· Личное сообщение · #25

насколько мне известно, инструкция bt напрямую никаким оператором не генерится.
скорее всего в оригинале было сравнение байтовой переменной с диапазоном или набором констант, а уж компилятор оптимизировал это до битовой таблицы.

надо посмотреть что находится по адресу 178B23C, размер карты 256/8 = 0х40 байт

prorokk пишет:
если первый параметр это ссылка на arry тогда там:

в приведённом отрывке установлены биты с 0х30 по 0х37 включительно (символы '0'-'7').
этот диапазон можно закодировать тремя битами, и это соответствует тому что там дальше в алгоритме происходит.

prorokk пишет:
eax = 0x38

однозначно даст в результате ZF=1



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

Создано: 30 июля 2019 16:18 · Поправил: prorokk
· Личное сообщение · #26

-=AkaBOSS=-

пока пришел к тому что var_4E не должна быть >= 0x38 т.е. символ '7' максимум
Но выглядит это нелепо
Code:
  1. if var_4E >= 0x100  or  var_4E >= 0x38 then
  2.   var_25 = 1


а можно на пальцах объяснить:
в приведённом отрывке установлены биты с 0х30 по 0х37 включительно (символы '0'-'7').



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 30 июля 2019 19:37 · Поправил: cppasm
· Личное сообщение · #27

-=AkaBOSS=- пишет:
однозначно даст в результате ZF=1

BT изменяет CF, ZF вообще не трогает.

-=AkaBOSS=- пишет:
насколько мне известно, инструкция bt напрямую никаким оператором не генерится.

Булева арифметика же.
Code:
  1. bt      ds:dword_178B23C, eax

эквивалентно по сути
Code:
  1. if(*((unsigned char *)dword_178B23C+eax/8) & (1 << eax%8)) ...

при eax=0x38
Code:
  1. if(dword_178B23C[7] & 1) ...

dword_178B23C - указатель на массив байт, если брать для массива dword надо пересчитать индекс и маску.




Ранг: 150.3 (ветеран), 175thx
Активность: 0.160.07
Статус: Участник

Создано: 31 июля 2019 06:28 · Поправил: -=AkaBOSS=-
· Личное сообщение · #28

cppasm пишет:
BT изменяет CF, ZF вообще не трогает.

моя ошибка.. почему-то всегда казалось что оно работает как AND для конкретно взятого бита.
не доводилось пользоваться


cppasm пишет:
эквивалентно по сути

суть-то ясна, только вот вряд ли кто-то такое наворотил на дельфе
особенно исходя из общей "продвинутости" алгоритма

prorokk пишет:
а можно на пальцах объяснить:
в приведённом отрывке установлены биты с 0х30 по 0х37 включительно (символы '0'-'7').

командой считывается определённый бит из памяти.
в качестве индекса бита используется символ из строки.
если символ находится в диапазоне '0' >= x <= '7', будет считана единица, в остальных случаях 0

не нужно заморачиваться на эту таблицу, чёрт с ней. проверяйте непосредственно цифры:
Code:
  1. if var_4E < 0x30  or  var_4E > 0x37 then
  2.   var_25 = 1


проверка на 0х100 не нужна, это ограничитель unsigned char чтоб по таблице не пролететь


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


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