Blog. Just Blog

Исследование защиты программы iResizer

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот программы iResizer
Скриншот программы iResizer

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

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

Окно ввода серийного номера
Окно ввода серийного номера

Поле ввода серийного номера не совсем обычное, оно сразу же показывает формат серийника, а также фильтрует при вводе недопустимые символы. Автор нам значительно облегчил задачу. Еще даже не открывая ни отладчика, мы знаем, что серийный номер может состоять только из латинских букв и имеет вид типа "ABCD-EFGH-IJKL-MNOP-QRST-UVWX-YZAA-AAAA".

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

Нехорошая строка найдена
Нехорошая строка найдена

Очевидно, что это и есть сообщение, которое выдается при попытке сохранить файл в триальной версии на англоязычной локали. Снова возвращаемся к дизассемблеру. Здесь выводится найденное сообщение:
  1. ...
  2. .text:0047E687 loc_47E687:
  3. .text:0047E687                 mov     [ebp+var_28], offset unk_BE7EA0
  4. .text:0047E68E                 mov     ecx, offset unk_BE7EA0
  5. .text:0047E693                 mov     edx, 1
  6. .text:0047E698                 lock xadd [ecx], edx
  7. .text:0047E69C                 push    0FFFFFFFFh
  8. .text:0047E69E                 push    offset aInpaint ; "Inpaint"
  9. .text:0047E6A3                 mov     [ebp+var_4], 0
  10. .text:0047E6AA                 call    sub_87C5B0
  11. .text:0047E6AF                 mov     [ebp+var_24], eax
  12. .text:0047E6B2                 push    0
  13. .text:0047E6B4                 lea     eax, [ebp+var_34]
  14. .text:0047E6B7                 push    offset aNo_0    ; "No"
  15. .text:0047E6BC                 push    eax
  16. .text:0047E6BD                 mov     byte ptr [ebp+var_4], 1
  17. .text:0047E6C1                 call    sub_479CE0
  18. .text:0047E6C6                 mov     esi, eax
  19. .text:0047E6C8                 push    0
  20. .text:0047E6CA                 lea     ecx, [ebp+var_30]
  21. .text:0047E6CD                 push    offset aYes_1   ; "Yes"
  22. .text:0047E6D2                 push    ecx
  23. .text:0047E6D3                 mov     byte ptr [ebp+var_4], 2
  24. .text:0047E6D7                 call    sub_479CE0
  25. .text:0047E6DC                 mov     ebx, eax
  26. .text:0047E6DE                 push    0
  27. .text:0047E6E0                 lea     edx, [ebp+var_2C]
  28. .text:0047E6E3                 push    offset aThisFeatureIsA
  29. ; "This feature is available in registered"...
  30. .text:0047E6E8                 push    edx
  31. .text:0047E6E9                 mov     byte ptr [ebp+var_4], 3
  32. .text:0047E6ED                 call    sub_479CE0
  33. ...
А вот отсюда к нему идут два условных перевода:
  1. ...
  2. .text:0047E36E                 mov     edi, ecx
  3. .text:0047E370                 mov     eax, [edi+14h]
  4. .text:0047E373                 mov     eax, [eax+8]
  5. .text:0047E376                 lea     esi, [edi+14h]
  6. .text:0047E379                 test    eax, eax
  7. ; Первый условный переход
  8. .text:0047E37B                 jz      loc_47E687
  9. .text:0047E381                 push    esi
  10. ; Вызвать функцию проверки правильности серийного номера
  11. .text:0047E382                 call    sub_47C4F0
  12. .text:0047E387                 add     esp, 4
  13. .text:0047E38A                 test    al, al
  14. .text:0047E38C                 jnz     short loc_47E39F
  15. .text:0047E38E                 push    esi
  16. .text:0047E38F                 call    sub_47C840
  17. .text:0047E394                 add     esp, 4
  18. .text:0047E397                 test    al, al
  19. ; Второй условный переход
  20. .text:0047E399                 jz      loc_47E687
  21. .text:0047E39F loc_47E39F:
  22. .text:0047E39F                 mov     ecx, [edi+0B4h]
  23. .text:0047E3A5                 push    0
  24. .text:0047E3A7                 call    sub_4CA4C0
  25. ...
Достаточно пропатчить эти условные переходы, заменив NOP'ами, и ограничение на сохранение обработанного файла волшебным образом исчезает. Более того, программа приобретает новое свойство - портативность, то есть может работать с любого носителя без всяких ограничений. Для полной портабелизации надо убрать из программы обращения к ветке реестра, куда она пишет свои регистрационные данные. Любым монитором работы с реестром, или же просто поиском по реестру строки "iResizer", находим следующую ветку:

HKEY_CURRENT_USER\Software\Teorex\iResizer
В исполняемом файле эти строки выглядит так:

Названия веток реестра в файле
Названия веток реестра в файле

Чтобы заблокировать обращения к реестру, достаточно забить эти строчки нулевыми символами. Все, теперь программа "зарегистрирована", никуда ничего не пишет и становится портативной по-настоящему.

С удобными решениями закончили, переходим к решениям красивым. То есть попробуем отреверсить алгоритм генерации серийного номера. Вернемся к условным переходам при сохранении файла. Кроме всего прочего, там вызывается одна интересная функция, которую я отметил в листинге как "Функция проверки правильности серийного номера". Если посмотреть по перекрестным ссылкам, то она же вызывается еще из двух мест. Ситуация становится еще более понятной:
  1. ...
  2. .text:0047D682                 lea     ecx, [ebp+arg_0]
  3. .text:0047D685                 push    ecx
  4. ; Вызвать функцию проверки правильности серийного номера
  5. .text:0047D686                 call    sub_47C4F0
  6. .text:0047D68B                 add     esp, 4
  7. .text:0047D68E                 test    al, al
  8. .text:0047D690                 jnz     short loc_47D6A6
  9. .text:0047D692                 lea     edx, [ebp+arg_0]
  10. .text:0047D695                 push    edx
  11. .text:0047D696                 call    sub_47C840
  12. .text:0047D69B                 add     esp, 4
  13. .text:0047D69E                 test    al, al
  14. .text:0047D6A0                 jz      loc_47D783
  15. .text:0047D6A6 loc_47D6A6:
  16. ; Вывести сообщение об успешной регистрации
  17. .text:0047D6A6                 mov     ecx, [esi+0B4h]
  18. .text:0047D6AC                 push    0
  19. .text:0047D6AE                 call    sub_4CA4C0
  20. .text:0047D6B3                 mov     ecx, [esi+0B8h]
  21. .text:0047D6B9                 push    0
  22. .text:0047D6BB                 call    sub_4CA4C0
  23. .text:0047D6C0                 lea     edx, [ebp+arg_0]
  24. .text:0047D6C3                 push    edx
  25. .text:0047D6C4                 lea     ecx, [esi+14h]
  26. .text:0047D6C7                 call    sub_87A450
  27. .text:0047D6CC                 mov     ecx, esi
  28. .text:0047D6CE                 call    sub_47C340
  29. .text:0047D6D3                 push    0FFFFFFFFh
  30. .text:0047D6D5                 push    offset aIresizer ; "iResizer"
  31. .text:0047D6DA                 call    sub_87C5B0
  32. .text:0047D6DF                 mov     [ebp+var_10], eax
  33. .text:0047D6E2                 push    0
  34. .text:0047D6E4                 lea     eax, [ebp+var_14]
  35. .text:0047D6E7                 push    offset aThankYouForReg
  36. ; "Thank you for registration!"
  37. .text:0047D6EC                 push    eax
  38. ...
Третье место вызова не столь очевидно, но там после проверки добавляются или не добавляются пункты в главное меню программы, связанные с вводом серийника или с ее покупкой. Это нас не особо интересует, хотя тоже можно поковыряться для большей эстетичности портативного варианта программы. А вот функция проверки правильности серийного номера нас интересует. Ее лучше пройти под отладчиком, чтобы можно было установить взаимосвязь между всеми символами и выяснить какие операции над ними проводятся. Обратите внимание, что серийный номер передается для проверки в виде строки без разделителей "-". Чтобы было понятнее, с какими символами серийного номера производится проверка, при трассировке, если срабатывает какой-либо условный переход на возврат с ошибкой, то просто меняйте флаг ZF на нужное значение.
  1. ...
  2. .text:0047C50D                 mov     word ptr [ebp+arg_0+2], cx
  3. .text:0047C511                 push    edi
  4. .text:0047C512                 lea     ecx, [ebp+arg_0+2]
  5. .text:0047C515                 call    sub_87B190
  6. ; Взять нулевой символ серийника
  7. .text:0047C51A                 movsx   eax, al
  8. ; Умножить его на 3
  9. .text:0047C51D                 lea     eax, [eax+eax*2]
  10. .text:0047C520                 cdq
  11. ; Разделить на 19h
  12. .text:0047C521                 mov     ecx, 19h
  13. .text:0047C526                 idiv    ecx
  14. .text:0047C528                 lea     ecx, [ebp+var_2]
  15. ; Добавить результат к символу "A"
  16. .text:0047C52B                 lea     edi, [edx+41h]
  17. ; Взять первый символ серийника
  18. .text:0047C52E                 call    sub_87B190
  19. .text:0047C533                 movsx   edx, al
  20. ; Результаты равны?
  21. .text:0047C536                 cmp     edx, edi
  22. .text:0047C538                 jz      short loc_47C542
  23. .text:0047C53A loc_47C53A:
  24. ; Серийный номер неправильный, на выходе AL=0
  25. .text:0047C53A                 pop     edi
  26. .text:0047C53B                 xor     al, al
  27. .text:0047C53D                 pop     esi
  28. .text:0047C53E                 mov     esp, ebp
  29. .text:0047C540                 pop     ebp
  30. .text:0047C541                 retn
  31. .text:0047C542 ; ------------------------------------
  32. .text:0047C542 loc_47C542:
  33. ; Следующие проверки. В листинге неудобочитаемые, но под отладчиком в
  34. ; пошаговом режиме все предельно понятно
  35. .text:0047C542                 mov     eax, [esi]
  36. .text:0047C544                 mov     ecx, [eax+0Ch]
  37. .text:0047C547                 movzx   edx, word ptr [ecx+4]
  38. .text:0047C54B                 mov     [ebp+var_4], dx
  39. .text:0047C54F                 mov     ecx, [eax+0Ch]
  40. .text:0047C552                 movzx   edx, word ptr [ecx]
  41. .text:0047C555                 mov     [ebp+var_2], dx
  42. .text:0047C559                 mov     eax, [eax+0Ch]
  43. .text:0047C55C                 mov     cx, [eax+2]
  44. .text:0047C560                 mov     word ptr [ebp+arg_0+2], cx
  45. .text:0047C564                 lea     ecx, [ebp+arg_0+2]
  46. .text:0047C567                 call    sub_87B190
  47. .text:0047C56C                 lea     ecx, [ebp+var_2]
  48. .text:0047C56F                 movsx   edi, al
  49. .text:0047C572                 call    sub_87B190
  50. .text:0047C577                 movsx   eax, al
  51. .text:0047C57A                 imul    eax, edi
  52. .text:0047C57D                 cdq
  53. .text:0047C57E                 mov     ecx, 19h
  54. .text:0047C583                 idiv    ecx
  55. .text:0047C585                 lea     ecx, [ebp+var_4]
  56. .text:0047C588                 lea     edi, [edx+41h]
  57. .text:0047C58B                 call    sub_87B190
  58. .text:0047C590                 movsx   edx, al
  59. .text:0047C593                 cmp     edx, edi
  60. ; Символы не совпадают, серийный номер неправильный
  61. .text:0047C595                 jnz     short loc_47C53A
  62. .text:0047C597                 mov     eax, [esi]
  63. .text:0047C599                 mov     ecx, [eax+0Ch]
  64. .text:0047C59C                 mov     dx, [ecx+6]
  65. .text:0047C5A0                 mov     [ebp+var_4], dx
  66. .text:0047C5A4                 mov     eax, [eax+0Ch]
  67. .text:0047C5A7                 mov     cx, [eax+4]
  68. .text:0047C5AB                 mov     word ptr [ebp+arg_0+2], cx
  69. .text:0047C5AF                 lea     ecx, [ebp+arg_0+2]
  70. .text:0047C5B2                 call    sub_87B190
  71. .text:0047C5B7                 movsx   eax, al
  72. .text:0047C5BA                 lea     eax, [eax+eax*4]
  73. .text:0047C5BD                 cdq
  74. .text:0047C5BE                 mov     ecx, 19h
  75. .text:0047C5C3                 idiv    ecx
  76. .text:0047C5C5                 lea     ecx, [ebp+var_4]
  77. .text:0047C5C8                 lea     edi, [edx+41h]
  78. .text:0047C5CB                 call    sub_87B190
  79. .text:0047C5D0                 movsx   edx, al
  80. .text:0047C5D3                 cmp     edx, edi
  81. ; Символы не совпадают, серийный номер неправильный
  82. .text:0047C5D5                 jnz     loc_47C53A
  83. .text:0047C5DB                 mov     eax, [esi]
  84. .text:0047C5DD                 mov     ecx, [eax+0Ch]
  85. .text:0047C5E0                 movzx   edx, word ptr [ecx+0Ah]
  86. .text:0047C5E4                 mov     [ebp+var_2], dx
  87. .text:0047C5E8                 mov     ecx, [eax+0Ch]
  88. .text:0047C5EB                 movzx   edx, word ptr [ecx+4]
  89. .text:0047C5EF                 mov     [ebp+var_4], dx
  90. .text:0047C5F3                 mov     eax, [eax+0Ch]
  91. .text:0047C5F6                 mov     cx, [eax+6]
  92. .text:0047C5FA                 mov     word ptr [ebp+arg_0+2], cx
  93. .text:0047C5FE                 lea     ecx, [ebp+arg_0+2]
  94. .text:0047C601                 call    sub_87B190
  95. .text:0047C606                 lea     ecx, [ebp+var_4]
  96. .text:0047C609                 movsx   edi, al
  97. .text:0047C60C                 call    sub_87B190
  98. .text:0047C611                 movsx   eax, al
  99. .text:0047C614                 imul    eax, edi
  100. .text:0047C617                 lea     eax, [eax+eax*2]
  101. .text:0047C61A                 cdq
  102. .text:0047C61B                 mov     ecx, 19h
  103. .text:0047C620                 idiv    ecx
  104. .text:0047C622                 lea     ecx, [ebp+var_2]
  105. .text:0047C625                 lea     edi, [edx+41h]
  106. .text:0047C628                 call    sub_87B190
  107. .text:0047C62D                 movsx   edx, al
  108. .text:0047C630                 cmp     edx, edi
  109. ; Символы не совпадают, серийный номер неправильный
  110. .text:0047C632                 jnz     loc_47C53A
  111. .text:0047C638                 mov     eax, [esi]
  112. .text:0047C63A                 mov     ecx, [eax+0Ch]
  113. .text:0047C63D                 movzx   edx, word ptr [ecx+0Ch]
  114. .text:0047C641                 mov     [ebp+var_2], dx
  115. .text:0047C645                 mov     ecx, [eax+0Ch]
  116. .text:0047C648                 movzx   edx, word ptr [ecx+8]
  117. .text:0047C64C                 mov     [ebp+var_4], dx
  118. .text:0047C650                 mov     eax, [eax+0Ch]
  119. .text:0047C653                 mov     cx, [eax+0Ah]
  120. .text:0047C657                 mov     word ptr [ebp+arg_0+2], cx
  121. .text:0047C65B                 lea     ecx, [ebp+arg_0+2]
  122. .text:0047C65E                 call    sub_87B190
  123. .text:0047C663                 lea     ecx, [ebp+var_4]
  124. .text:0047C666                 movsx   edi, al
  125. .text:0047C669                 call    sub_87B190
  126. .text:0047C66E                 movsx   eax, al
  127. .text:0047C671                 imul    eax, edi
  128. .text:0047C674                 add     eax, 0Eh
  129. .text:0047C677                 cdq
  130. .text:0047C678                 mov     ecx, 19h
  131. .text:0047C67D                 idiv    ecx
  132. .text:0047C67F                 lea     ecx, [ebp+var_2]
  133. .text:0047C682                 lea     edi, [edx+41h]
  134. .text:0047C685                 call    sub_87B190
  135. .text:0047C68A                 movsx   edx, al
  136. .text:0047C68D                 cmp     edx, edi
  137. ; Символы не совпадают, серийный номер неправильный
  138. .text:0047C68F                 jnz     loc_47C53A
  139. .text:0047C695                 mov     eax, [esi]
  140. .text:0047C697                 mov     ecx, [eax+0Ch]
  141. .text:0047C69A                 movzx   edx, word ptr [ecx+0Eh]
  142. .text:0047C69E                 mov     [ebp+var_6], dx
  143. .text:0047C6A2                 mov     ecx, [eax+0Ch]
  144. .text:0047C6A5                 movzx   edx, word ptr [ecx+0Ah]
  145. .text:0047C6A9                 mov     [ebp+var_2], dx
  146. .text:0047C6AD                 mov     ecx, [eax+0Ch]
  147. .text:0047C6B0                 movzx   edx, word ptr [ecx+0Ch]
  148. .text:0047C6B4                 mov     [ebp+var_4], dx
  149. .text:0047C6B8                 mov     eax, [eax+0Ch]
  150. .text:0047C6BB                 mov     cx, [eax+0Ch]
  151. .text:0047C6BF                 mov     word ptr [ebp+arg_0+2], cx
  152. .text:0047C6C3                 lea     ecx, [ebp+arg_0+2]
  153. .text:0047C6C6                 call    sub_87B190
  154. .text:0047C6CB                 lea     ecx, [ebp+var_4]
  155. .text:0047C6CE                 movsx   edi, al
  156. .text:0047C6D1                 call    sub_87B190
  157. .text:0047C6D6                 movsx   edx, al
  158. .text:0047C6D9                 lea     ecx, [ebp+var_2]
  159. .text:0047C6DC                 add     edi, edx
  160. .text:0047C6DE                 call    sub_87B190
  161. .text:0047C6E3                 movsx   eax, al
  162. .text:0047C6E6                 add     eax, edi
  163. .text:0047C6E8                 cdq
  164. .text:0047C6E9                 mov     ecx, 19h
  165. .text:0047C6EE                 idiv    ecx
  166. .text:0047C6F0                 lea     ecx, [ebp+var_6]
  167. .text:0047C6F3                 lea     edi, [edx+41h]
  168. .text:0047C6F6                 call    sub_87B190
  169. .text:0047C6FB                 movsx   edx, al
  170. .text:0047C6FE                 cmp     edx, edi
  171. ; Символы не совпадают, серийный номер неправильный
  172. .text:0047C700                 jnz     loc_47C53A
  173. .text:0047C706                 mov     eax, [esi]
  174. .text:0047C708                 mov     ecx, [eax+0Ch]
  175. .text:0047C70B                 mov     dx, [ecx+12h]
  176. .text:0047C70F                 mov     [ebp+var_6], dx
  177. .text:0047C713                 mov     eax, [eax+0Ch]
  178. .text:0047C716                 mov     cx, [eax+10h]
  179. .text:0047C71A                 mov     word ptr [ebp+arg_0+2], cx
  180. .text:0047C71E                 lea     ecx, [ebp+arg_0+2]
  181. .text:0047C721                 call    sub_87B190
  182. .text:0047C726                 movsx   eax, al
  183. .text:0047C729                 lea     eax, [eax+eax*4]
  184. .text:0047C72C                 add     eax, eax
  185. .text:0047C72E                 cdq
  186. .text:0047C72F                 mov     ecx, 19h
  187. .text:0047C734                 idiv    ecx
  188. .text:0047C736                 lea     ecx, [ebp+var_6]
  189. .text:0047C739                 lea     edi, [edx+41h]
  190. .text:0047C73C                 call    sub_87B190
  191. .text:0047C741                 movsx   edx, al
  192. .text:0047C744                 cmp     edx, edi
  193. ; Символы не совпадают, серийный номер неправильный
  194. .text:0047C746                 jnz     loc_47C53A
  195. .text:0047C74C                 mov     eax, [esi]
  196. .text:0047C74E                 mov     ecx, [eax+0Ch]
  197. .text:0047C751                 movzx   edx, word ptr [ecx+14h]
  198. .text:0047C755                 mov     [ebp+var_2], dx
  199. .text:0047C759                 mov     ecx, [eax+0Ch]
  200. .text:0047C75C                 movzx   edx, word ptr [ecx+0Ch]
  201. .text:0047C760                 mov     [ebp+var_6], dx
  202. .text:0047C764                 mov     ecx, [eax+0Ch]
  203. .text:0047C767                 movzx   edx, word ptr [ecx+0Eh]
  204. .text:0047C76B                 mov     word ptr [ebp+arg_0+2], dx
  205. .text:0047C76F                 mov     eax, [eax+0Ch]
  206. .text:0047C772                 mov     cx, [eax+0Ah]
  207. .text:0047C776                 mov     [ebp+var_4], cx
  208. .text:0047C77A                 push    ebx
  209. .text:0047C77B                 lea     ecx, [ebp+arg_0+2]
  210. .text:0047C77E                 call    sub_87B190
  211. .text:0047C783                 lea     ecx, [ebp+var_6]
  212. .text:0047C786                 movsx   ebx, al
  213. .text:0047C789                 call    sub_87B190
  214. .text:0047C78E                 movsx   edi, al
  215. .text:0047C791                 lea     ecx, [ebp+var_4]
  216. .text:0047C794                 imul    edi, ebx
  217. .text:0047C797                 call    sub_87B190
  218. .text:0047C79C                 movsx   edx, al
  219. .text:0047C79F                 lea     eax, [edx+edi+29h]
  220. .text:0047C7A3                 cdq
  221. .text:0047C7A4                 mov     ecx, 19h
  222. .text:0047C7A9                 idiv    ecx
  223. .text:0047C7AB                 lea     ecx, [ebp+var_2]
  224. .text:0047C7AE                 lea     edi, [edx+41h]
  225. .text:0047C7B1                 call    sub_87B190
  226. .text:0047C7B6                 movsx   edx, al
  227. .text:0047C7B9                 pop     ebx
  228. .text:0047C7BA                 cmp     edx, edi
  229. ; Символы не совпадают, серийный номер неправильный
  230. .text:0047C7BC                 jnz     loc_47C53A
  231. .text:0047C7C2                 mov     esi, [esi]
  232. .text:0047C7C4                 mov     eax, [esi+0Ch]
  233. .text:0047C7C7                 movzx   ecx, word ptr [eax+16h]
  234. .text:0047C7CB                 mov     [ebp+var_2], cx
  235. .text:0047C7CF                 mov     edx, [esi+0Ch]
  236. .text:0047C7D2                 mov     ax, [edx+10h]
  237. .text:0047C7D6                 mov     [ebp+var_4], ax
  238. .text:0047C7DA                 mov     ecx, [esi+0Ch]
  239. .text:0047C7DD                 mov     dx, [ecx+12h]
  240. .text:0047C7E1                 mov     [ebp+var_6], dx
  241. .text:0047C7E5                 mov     eax, [esi+0Ch]
  242. .text:0047C7E8                 movzx   ecx, word ptr [eax+14h]
  243. .text:0047C7EC                 mov     word ptr [ebp+arg_0+2], cx
  244. .text:0047C7F0                 lea     ecx, [ebp+arg_0+2]
  245. .text:0047C7F3                 call    sub_87B190
  246. .text:0047C7F8                 lea     ecx, [ebp+var_6]
  247. .text:0047C7FB                 movsx   edi, al
  248. .text:0047C7FE                 call    sub_87B190
  249. .text:0047C803                 movsx   esi, al
  250. .text:0047C806                 lea     ecx, [ebp+var_4]
  251. .text:0047C809                 imul    esi, edi
  252. .text:0047C80C                 call    sub_87B190
  253. .text:0047C811                 movsx   eax, al
  254. .text:0047C814                 imul    eax, esi
  255. .text:0047C817                 inc     eax
  256. .text:0047C818                 cdq
  257. .text:0047C819                 mov     ecx, 19h
  258. .text:0047C81E                 idiv    ecx
  259. .text:0047C820                 lea     ecx, [ebp+var_2]
  260. .text:0047C823                 lea     esi, [edx+41h]
  261. .text:0047C826                 call    sub_87B190
  262. .text:0047C82B                 movsx   edx, al
  263. .text:0047C82E                 cmp     edx, esi
  264. ; Символы совпадают? Результат в AL
  265. .text:0047C830                 pop     edi
  266. .text:0047C831                 setz    al
  267. ...
Переведем машинный код на человеческий язык. Если условно обозначить символы серийного номера их позицией, то получится такой псевдокод. Операция "%" означает результат от деления (регистр EDX после выполнения команды IDIV).

[0] = любой разрешенный символ
[1] = ([0] * 3) % 19h + 'A'
[2] = ([1] * [0]) % 19h + 'A'
[3] = ([2] * 5) % 19h + 'A'

[4] = любой разрешенный символ
[5] = ([3] * [2] * 3) % 19h + 'A'
[6] = ([5] * [4] + 0Eh) % 19h + 'A'
[7] = ([6] + [6] + [5]) % 19h + 'A'

[8] = любой разрешенный символ
[9] = ([8] * 0Ah) % 19h + 'A'
[10] = ([6] * [7] + [5] + 29h) % 19h + 'A'
[11] = ([10] * [9] * [8] + 1) % 19h + 'A'

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

Программа успешно зарегистрирована
Программа успешно зарегистрирована

iResizer, как и другие продукты автора, - на самом деле очень полезные программы, к тому же сделаны качественно. И, хоть это не в моих правилах, я все-таки рекомендую по возможности поддержать разработчика. А автору бы я порекомендовал задуматься о портабелизации своих программ штатными средствами, без необходимости их потрошения.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 3554 | Комментариев: 7

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
irokkezz (14.01.2017 в 12:40):
ЦитатаТретье место вызова не столь очевидно

Вы не могли бы подсказать, как до него добраться?
ManHunter (25.03.2012 в 14:17):
brute, это и есть один из методов "лечения".
brute (25.03.2012 в 06:32):
поправил два перехода, которые не давали сохранить изменения: теперь программа "не зарегистрирована", но работает.
AyTkACT (24.03.2012 в 20:31):
Как всегда чётко!
JIEMM (24.03.2012 в 20:11):
Спасибо за ссылку MAN-попробую сделать все так как описано здесь!
ManHunter (24.03.2012 в 13:38):
google -> IDA Pro
JIEMM (24.03.2012 в 13:19):
ДАЙТЕ ссыль на данный дизассемблер плизз!!

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.004 сек.) / Память: 5 Mb
Наверх