Blog. Just Blog

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

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

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

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

Сообщение о неправильной регистрации
Сообщение о неправильной регистрации

Главный файл ничем не защищен и не упакован, отправляем его на разборку в дизассемблер. Поскольку программа состоит из единственного файла и никаких дополнительных пакетов локализации нет, значит надо искать строку в нем. Встроенный просмотрщик Total Commander легко обнаруживает вот такой блок:

Строка сообщения в файле
Строка сообщения в файле

Выше и ниже находятся похожие блоки с другими строками на разных языках. Логично предположить, что обращение к ним выполняется по идентификатору, в нашем случае это число 401060 или 61EA4h, если считать в шестнадцатеричной системе. Поиск в листинге этого значения приводит нас на следующий код:
  1. .text:0042631B                 mov     ecx, [ebx+6E4h]
  2. .text:00426321                 test    ecx, ecx
  3. .text:00426323                 jz      short loc_426361
  4. ; Вызывать функцию проверки
  5. .text:00426325                 call    sub_427A60
  6. .text:0042632A                 test    al, al
  7. .text:0042632C                 jnz     short loc_426361
  8. ; Вывести сообщение о неправильной регистрации
  9. .text:0042632E                 mov     dl, [ebx+6E0h]
  10. .text:00426334                 mov     ecx, [ebx+6DCh]
  11. .text:0042633A                 mov     dword ptr [ebx+6E4h], 0
  12. .text:00426344                 call    sub_42A0E0
  13. .text:00426349                 test    eax, eax
  14. .text:0042634B                 jns     short loc_426361
  15. .text:0042634D                 mov     ecx, [ebx+1Ch]
  16. .text:00426350                 push    61EA4h
  17. .text:00426355                 call    sub_42F3B0
  18. .text:0042635A                 mov     ecx, eax
  19. .text:0042635C                 call    sub_44AE60
Посмотрев условие, при котором выводится сообщение о неправильной регистрации, мы попадаем вот на такую функцию проверки:
  1. .text:00427A60 sub_427A60
  2. .text:00427A60                 imul    eax, ecx, 1001h
  3. .text:00427A66                 add     eax, 7ED55D16h
  4. .text:00427A6B                 mov     ecx, eax
  5. .text:00427A6D                 shr     ecx, 13h
  6. .text:00427A70                 xor     ecx, eax
  7. .text:00427A72                 xor     ecx, 0C761C23Ch
  8. .text:00427A78                 mov     eax, ecx
  9. .text:00427A7A                 add     ecx, 165667B1h
  10. .text:00427A80                 shl     eax, 5
  11. .text:00427A83                 add     eax, ecx
  12. .text:00427A85                 lea     ecx, [eax-2C5D9B94h]
  13. .text:00427A8B                 shl     eax, 9
  14. .text:00427A8E                 xor     ecx, eax
  15. .text:00427A90                 lea     ecx, [ecx+ecx*8]
  16. .text:00427A93                 add     ecx, 0FD7046C5h
  17. .text:00427A99                 mov     eax, ecx
  18. .text:00427A9B                 shr     eax, 10h
  19. .text:00427A9E                 xor     al, cl
  20. .text:00427AA0                 shr     al, 7
  21. .text:00427AA3                 not     al
  22. .text:00427AA5                 and     al, 1
  23. .text:00427AA7                 retn
  24. .text:00427AA7 sub_427A60      endp
Еще одна проверка, которая также отлавливается по идентификатору строки сообщения. Тут введенный серийник сравнивается с числом 3B9ACA00h или 1000000000 в более привычной десятичной системе счисления. Введенное число должно быть больше этого значения.
  1. .text:0041A7EA                 mov     [ebx+6E4h], eax
  2. .text:0041A7F0                 cmp     eax, 3B9ACA00h
  3. .text:0041A7F5                 jb      short loc_41A833
  4. ...
  5. ...
  6. ...
  7. .text:0041A833 loc_41A833:
  8. ; Вывести сообщение о неправильном серийном номере
  9. .text:0041A833                 push    61EA4h
  10. .text:0041A838                 call    sub_42F3B0
  11. .text:0041A83D                 mov     ecx, eax
  12. .text:0041A83F                 call    sub_44AE60
  13. .text:0041A844                 mov     ecx, [ebx+6ECh]
  14. .text:0041A84A                 push    0
Минимальное значение мы выяснили, алгоритм проверки тоже, серийник подбирается простейшим брутфорсом. Например, всем условиям удовлетворяет первое же попавшееся число "1000000001". Вводим его в окно, программа благодарит за регистрацию.

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

Внешне программа выглядит зарегистрированной, однако при попытке открыть любой графический файл, регистрация мгновенно слетает. В этих ваших интернетах уже появлялись релизы генераторов ключей и отдельных серийников от разных крякерских команд, но все они не работают, регистрация стабильно слетает. Каким образом отловить код, который сбрасывает регистрацию? Давайте посмотрим на окно "О программе". Сразу после запуска программы и фейковой псевдо-регистрации в нем красуется надпись "(Зарегистрировано)". Строчки мы искать уже умеем, по аналогии находим строку с индексом 401040, оно же 61E90h. Находим в листинге место, где этот индекс используется:
  1. ; Проверить флаг зарегистрированности
  2. .text:00455BC5                 cmp     byte ptr [ebx+3Ch], 0
  3. .text:00455BC9                 jz      short loc_455C12
  4. .text:00455BCB                 mov     eax, [esi]
  5. .text:00455BCD                 mov     ecx, esi
  6. .text:00455BCF                 push    0
  7. .text:00455BD1                 push    0AAh
  8. .text:00455BD6                 push    0
  9. .text:00455BD8                 call    dword ptr [eax+130h]
  10. .text:00455BDE                 mov     eax, [esi]
  11. .text:00455BE0                 mov     ecx, esi
  12. .text:00455BE2                 push    1
  13. .text:00455BE4                 call    dword ptr [eax+14Ch]
  14. .text:00455BEA                 mov     ecx, [ebx+10h]
  15. .text:00455BED                 mov     eax, [ecx]
  16. .text:00455BEF                 call    dword ptr [eax+24h]
  17. ; Загрузить строчку
  18. .text:00455BF2                 push    61E90h
  19. .text:00455BF7                 mov     ecx, eax
  20. .text:00455BF9                 mov     edx, [eax]
Проверка понятна. Теперь надо найти место, где инициализируется этот флажок. Мотаем листинг вверх. Долго мотаем, но ничего нужного не находим. Зато выясняем, что мы находимся внутри процедуры, которая вызывается из единственного места. По перекрестной ссылке переходим на место вызова.
  1. ; Проверить серийный номер 
  2. .text:004272BD                 cmp     dword ptr [ebx+6E4h], 3B9ACA00h
  3. .text:004272C7                 mov     eax, [ebx+1C8h]
  4. ; Если значение меньше 3B9ACA00h, то программа не зарегистрирована
  5. .text:004272CD                 jb      short loc_4272D5
  6. ; Установить флаг регистрации
  7. .text:004272CF                 mov     byte ptr [eax+3Ch], 1
  8. .text:004272D3                 jmp     short loc_4272D9
  9. .text:004272D5 ; ---------------------------------------
  10. .text:004272D5 loc_4272D5:
  11. ; Сбросить флаг регистрации
  12. .text:004272D5                 mov     byte ptr [eax+3Ch], 0
  13. .text:004272D9 loc_4272D9:
  14. .text:004272D9                 push    dword ptr [ebx+18Ch]
  15. .text:004272DF                 mov     ecx, [ebx+1C8h]
  16. .text:004272E5                 call    sub_454520
  17. .text:004272EA                 pop     edi
Вот где этот флажок инициализируется. Тут и условие - это сравнение с уже знакомым нами числом 3B9ACA00h. Серийник хранится в определнной ячейке памяти и нам надо отловить момент, когда он обнуляется. Поскольку конструкция [ebx+6E4h] может указывать на какой угодно адрес в памяти, придется воспользоваться отладчиком. Загружаем программу в отладчик, ставим точку останова на адрес 004272BD и запускаем на выполнение. После запуска программы откроем окно "О программе", сработает точка останова.

Адрес ячейки памяти
Адрес ячейки памяти

Таким образом мы узнаем адрес ячейки памяти, в которой пока еще хранится серийник. Переходим на этот адрес в дампе и ставим Memory breakpoint на любую запись в этот адрес.

Ставим точку останова
Ставим точку останова

Отпускаем программу на выполнение и выполняем любое действие, которое приводит к слету регистрации, в нашем случае это попытка открыть любой графический файл для просмотра. Точка останова сработает в момент записи нуля в ячейку памяти, то есть выполняется сброс регистрации.
  1. .text:00419D7A                 cmp     dword ptr [ebx+6E4h], 0
  2. .text:00419D81                 jz      short loc_419DAC
  3. .text:00419D83                 mov     ecx, [esp+40h+var_10]
  4. ; Вызвать проверку
  5. .text:00419D87                 call    sub_429FE0
  6. .text:00419D8C                 test    al, al
  7. ; Регистрацию не обнулять, проверка пройдена успешно
  8. .text:00419D8E                 jnz     short loc_419DAC
  9. .text:00419D90                 mov     dl, byte ptr [esp+40h+var_18+3]
  10. .text:00419D94                 mov     ecx, esi
  11. .text:00419D96                 call    sub_42A0E0
  12. .text:00419D9B                 test    eax, eax
  13. .text:00419D9D                 jns     short loc_419DA4
  14. .text:00419D9F                 call    sub_429F80
  15. .text:00419DA4 loc_419DA4:
  16. ; Обнулить регистрацию
  17. .text:00419DA4                 xor     eax, eax
  18. .text:00419DA6                 mov     [esp+40h+var_10], eax
  19. .text:00419DAA                 jmp     short loc_419DB0
  20. .text:00419DAC ; ---------------------------------------
  21. .text:00419DAC loc_419DAC:
  22. .text:00419DAC                 mov     eax, [esp+40h+var_10]
  23. .text:00419DB0 loc_419DB0:
  24. ; Записать новые данные регистрации
  25. .text:00419DB0                 mov     [ebx+6E4h], eax
  26. .text:00419DB6                 mov     [ebx+6DCh], esi
  27. .text:00419DBC                 test    eax, eax
  28. .text:00419DBE                 jnz     short loc_419DD3
Посмотрев условие, при котором слетает регистрация, мы выходим на еще одну проверку:
  1. .text:00429FE0 sub_429FE0      proc near
  2. .text:00429FE0                 imul    eax, ecx, 1001h
  3. .text:00429FE6                 add     eax, 7ED55D16h
  4. .text:00429FEB                 mov     ecx, eax
  5. .text:00429FED                 shr     ecx, 13h
  6. .text:00429FF0                 xor     ecx, eax
  7. .text:00429FF2                 xor     ecx, 0C761C23Ch
  8. .text:00429FF8                 mov     eax, ecx
  9. .text:00429FFA                 add     ecx, 165667B1h
  10. .text:0042A000                 shl     eax, 5
  11. .text:0042A003                 add     eax, ecx
  12. .text:0042A005                 lea     ecx, [eax-2C5D9B94h]
  13. .text:0042A00B                 shl     eax, 9
  14. .text:0042A00E                 xor     ecx, eax
  15. .text:0042A010                 lea     ecx, [ecx+ecx*8]
  16. .text:0042A013                 add     ecx, 0FD7046C5h
  17. .text:0042A019                 mov     eax, ecx
  18. .text:0042A01B                 shr     eax, 10h
  19. .text:0042A01E                 xor     al, cl
  20. .text:0042A020                 shr     al, 6
  21. .text:0042A023                 and     al, 1
  22. .text:0042A025                 retn
  23. .text:0042A025 sub_429FE0      endp
Добавляем ее в брутфорсер. Чистим реестр, выполняем регистрацию с новым серийником. Повторяем трюк с окном "О программе" и попадаем на целую пачку дополнительных проверок. Я оставил только важные участки:
  1. .text:004242AB                 mov     eax, [ebx+6E4h]
  2. ...
  3. .text:004242BB                 mov     ecx, eax
  4. .text:004242BD                 not     eax
  5. .text:004242BF                 shl     ecx, 0Fh
  6. .text:004242C2                 add     ecx, eax
  7. .text:004242C4                 mov     eax, ecx
  8. .text:004242C6                 shr     eax, 0Ch
  9. .text:004242C9                 xor     eax, ecx
  10. .text:004242CB                 lea     edx, [eax+eax*4]
  11. .text:004242CE                 mov     eax, edx
  12. .text:004242D0                 shr     eax, 4
  13. .text:004242D3                 xor     eax, edx
  14. .text:004242D5                 imul    eax, 809h
  15. .text:004242DB                 cmp     eax, 80000000h
  16. ; Сбросить регистрацию
  17. ...
  18. ...
  19. ...
  20. .text:00424327                 mov     eax, [ebx+6E4h]
  21. .text:0042432D                 test    eax, eax
  22. .text:0042432F                 jz      short loc_4243A3
  23. .text:00424331                 mov     ecx, eax
  24. .text:00424333                 not     eax
  25. .text:00424335                 shl     ecx, 0Fh
  26. .text:00424338                 add     ecx, eax
  27. .text:0042433A                 mov     eax, ecx
  28. .text:0042433C                 shr     eax, 0Ch
  29. .text:0042433F                 xor     eax, ecx
  30. .text:00424341                 lea     ecx, [eax+eax*4]
  31. .text:00424344                 mov     eax, ecx
  32. .text:00424346                 shr     eax, 4
  33. .text:00424349                 xor     eax, ecx
  34. .text:0042434B                 imul    eax, 809h
  35. .text:00424351                 test    eax, 10000000h
  36. .text:00424356                 jnz     short loc_4243A3
  37. ; Сбросить регистрацию
  38. ...
  39. ...
  40. ...
  41. .text:004243A3                 mov     eax, [ebx+6E4h]
  42. .text:004243A9                 test    eax, eax
  43. .text:004243AB                 jz      loc_42443B
  44. .text:004243B1                 imul    eax, 1001h
  45. .text:004243B7                 add     eax, 7ED55D16h
  46. .text:004243BC                 mov     ecx, eax
  47. .text:004243BE                 shr     ecx, 13h
  48. .text:004243C1                 xor     ecx, eax
  49. .text:004243C3                 xor     ecx, 0C761C23Ch
  50. .text:004243C9                 mov     eax, ecx
  51. .text:004243CB                 shl     eax, 5
  52. .text:004243CE                 add     eax, ecx
  53. .text:004243D0                 lea     ecx, [eax+165667B1h]
  54. .text:004243D6                 add     eax, 1658CC1Dh
  55. .text:004243DB                 shl     ecx, 9
  56. .text:004243DE                 xor     ecx, eax
  57. .text:004243E0                 add     ecx, 7DDh
  58. .text:004243E6                 lea     eax, [ecx+ecx*8]
  59. .text:004243E9                 test    eax, 40000h
  60. .text:004243EE                 jz      short loc_42443B
  61. ; Сбросить регистрацию
  62. ...
  63. ...
  64. ...
  65. .text:0042443B                 mov     eax, [ebx+6E4h]
  66. ...
  67. .text:0042445A                 imul    eax, 1001h
  68. .text:00424460                 add     eax, 7ED55D16h
  69. .text:00424465                 mov     ecx, eax
  70. .text:00424467                 shr     ecx, 13h
  71. .text:0042446A                 xor     ecx, eax
  72. .text:0042446C                 xor     ecx, 0C761C23Ch
  73. .text:00424472                 mov     eax, ecx
  74. .text:00424474                 shl     eax, 5
  75. .text:00424477                 add     eax, ecx
  76. .text:00424479                 lea     ecx, [eax+165667B1h]
  77. .text:0042447F                 add     eax, 0E9F8CC1Dh
  78. .text:00424484                 shl     ecx, 9
  79. .text:00424487                 xor     ecx, eax
  80. .text:00424489                 lea     ecx, [ecx+ecx*8]
  81. .text:0042448C                 add     ecx, 0FD7046C5h
  82. .text:00424492                 mov     eax, ecx
  83. .text:00424494                 shr     eax, 10h
  84. .text:00424497                 xor     eax, ecx
  85. .text:00424499                 test    eax, 2000h
  86. .text:0042449E                 jnz     short loc_4244D8
  87. ; Сбросить регистрацию
Но и это еще не все. Если пошерстить листинг по константам, которые используются в проверке, то обнаружится еще один "подарочек":
  1. .text:004267B6                 imul    eax, [ebp+var_18], 1001h
  2. .text:004267BD                 add     eax, 7ED55D16h
  3. .text:004267C2                 mov     ecx, eax
  4. .text:004267C4                 shr     ecx, 13h
  5. .text:004267C7                 xor     ecx, eax
  6. .text:004267C9                 xor     ecx, 0C761C23Ch
  7. .text:004267CF                 mov     eax, ecx
  8. .text:004267D1                 shl     eax, 5
  9. .text:004267D4                 add     eax, 165667B1h
  10. .text:004267D9                 add     eax, ecx
  11. .text:004267DB                 lea     esi, [eax-2C5D9B94h]
  12. .text:004267E1                 shl     eax, 9
  13. .text:004267E4                 xor     esi, eax
  14. .text:004267E6                 lea     esi, [esi+esi*8]
  15. .text:004267E9                 add     esi, 0FD7046C5h
  16. .text:004267EF                 mov     eax, esi
  17. .text:004267F1                 shr     eax, 10h
  18. .text:004267F4                 xor     eax, esi
  19. .text:004267F6                 test    al, al
  20. .text:004267F8                 jns     short loc_42680E
Мне не удалось заставить его выполниться, но у программы весьма обширный функционал, скорее всего я просто не нашел нужное действие, при котором он срабатывает.

Если собрать все проверки серийника и заменить в них условные переходы на противоположное значение, то можно сделать полноценный генератор-брутфорсер. У меня он получился вот такой. Код получения случайного числа я тут не привожу, все необходимое для этого есть на сайте в разделе "Ассемблер".
  1. gen:
  2.         ;--------------------------
  3.         ; Получаем случайное число и записываем его в регистр ESI
  4.         ; ESI = случайное число
  5.         ;--------------------------
  6.         mov     eax,esi
  7.         cmp     eax,1000000000
  8.         jb      gen
  9.         ;--------------------------
  10.         mov     eax,esi
  11.         imul    eax, 1001h
  12.         add     eax, 7ED55D16h
  13.         mov     ecx, eax
  14.         shr     ecx, 13h
  15.         xor     ecx, eax
  16.         xor     ecx, 0C761C23Ch
  17.         mov     eax, ecx
  18.         add     ecx, 165667B1h
  19.         shl     eax, 5
  20.         add     eax, ecx
  21.         lea     ecx, [eax-2C5D9B94h]
  22.         shl     eax, 9
  23.         xor     ecx, eax
  24.         lea     ecx, [ecx+ecx*8]
  25.         add     ecx, 0FD7046C5h
  26.         mov     eax, ecx
  27.         shr     eax, 10h
  28.         xor     al, cl
  29.         shr     al, 6
  30.         and     al, 1
  31.         or      al,al
  32.         jz      gen
  33.         ;--------------------------
  34.         mov     eax,esi
  35.         mov     ecx, eax
  36.         not     eax
  37.         shl     ecx, 0Fh
  38.         add     ecx, eax
  39.         mov     eax, ecx
  40.         shr     eax, 0Ch
  41.         xor     eax, ecx
  42.         lea     edx, [eax+eax*4]
  43.         mov     eax, edx
  44.         shr     eax, 4
  45.         xor     eax, edx
  46.         imul    eax, 809h
  47.         cmp     eax, 80000000h
  48.         jae     gen
  49.         ;--------------------------
  50.         mov     eax,esi
  51.         mov     ecx, eax
  52.         not     eax
  53.         shl     ecx, 0Fh
  54.         add     ecx, eax
  55.         mov     eax, ecx
  56.         shr     eax, 0Ch
  57.         xor     eax, ecx
  58.         lea     ecx, [eax+eax*4]
  59.         mov     eax, ecx
  60.         shr     eax, 4
  61.         xor     eax, ecx
  62.         imul    eax, 809h
  63.         test    eax, 10000000h
  64.         jz      gen
  65.         ;--------------------------
  66.         mov     eax,esi
  67.         imul    eax, 1001h
  68.         add     eax, 7ED55D16h
  69.         mov     ecx, eax
  70.         shr     ecx, 13h
  71.         xor     ecx, eax
  72.         xor     ecx, 0C761C23Ch
  73.         mov     eax, ecx
  74.         shl     eax, 5
  75.         add     eax, ecx
  76.         lea     ecx, [eax+165667B1h]
  77.         add     eax, 1658CC1Dh
  78.         shl     ecx, 9
  79.         xor     ecx, eax
  80.         add     ecx, 7DDh
  81.         lea     eax, [ecx+ecx*8]
  82.         test    eax, 40000h
  83.         jnz     gen
  84.         ;--------------------------
  85.         mov     eax,esi
  86.         imul    eax, 1001h
  87.         add     eax, 7ED55D16h
  88.         mov     ecx, eax
  89.         shr     ecx, 13h
  90.         xor     ecx, eax
  91.         xor     ecx, 0C761C23Ch
  92.         mov     eax, ecx
  93.         shl     eax, 5
  94.         add     eax, ecx
  95.         lea     ecx, [eax+165667B1h]
  96.         add     eax, 0E9F8CC1Dh
  97.         shl     ecx, 9
  98.         xor     ecx, eax
  99.         lea     ecx, [ecx+ecx*8]
  100.         add     ecx, 0FD7046C5h
  101.         mov     eax, ecx
  102.         shr     eax, 10h
  103.         xor     eax, ecx
  104.         test    eax, 2000h
  105.         jz      gen
  106.         ;--------------------------
  107.         mov     eax,esi
  108.         imul    eax, 1001h
  109.         add     eax, 7ED55D16h
  110.         mov     ecx, eax
  111.         shr     ecx, 13h
  112.         xor     ecx, eax
  113.         xor     ecx, 0C761C23Ch
  114.         mov     eax, ecx
  115.         shl     eax, 5
  116.         add     eax, 165667B1h
  117.         add     eax, ecx
  118.         lea     ecx, [eax-2C5D9B94h]
  119.         shl     eax, 9
  120.         xor     ecx, eax
  121.         lea     ecx, [ecx+ecx*8]
  122.         add     ecx, 0FD7046C5h
  123.         mov     eax, ecx
  124.         shr     eax, 10h
  125.         xor     eax, ecx
  126.         test    al, al
  127.         js      gen
  128.         ;--------------------------
  129.         mov     eax,esi
  130.         imul    eax, 1001h
  131.         add     eax, 7ED55D16h
  132.         mov     ecx, eax
  133.         shr     ecx, 13h
  134.         xor     ecx, eax
  135.         xor     ecx, 0C761C23Ch
  136.         mov     eax, ecx
  137.         add     ecx, 165667B1h
  138.         shl     eax, 5
  139.         add     eax, ecx
  140.         lea     ecx, [eax-2C5D9B94h]
  141.         shl     eax, 9
  142.         xor     ecx, eax
  143.         lea     ecx, [ecx+ecx*8]
  144.         add     ecx, 0FD7046C5h
  145.         mov     eax, ecx
  146.         shr     eax, 10h
  147.         xor     al, cl
  148.         shr     al, 7
  149.         not     al
  150.         and     al, 1
  151.         cmp     al,1
  152.         jne     gen
  153.         ;--------------------------
  154.         ; ESI = валидный серийник
  155.         ;--------------------------
Вот несколько серийников, которые получены этим брутфорсером: 3052553493, 1961446584, 1693474613. С ними регистрация не слетает. Цель достигнута, хотя я не удивлюсь, если какую-нибудь особо хитрую проверку я все-таки пропустил. Как я уже говорил, программа выполняет множество различных действий, и на то, чтобы проверить их все, уйдет немало времени.

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

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

Поделиться ссылкой ВКонтакте
Просмотров: 1911 | Комментариев: 3

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

Комментарии

Отзывы посетителей сайта о статье
voffka (20.07.2019 в 03:07):
ИМХО. А не оптимальней все jx gen кроме первого направлять на inc или dec esi?
ufo (16.07.2019 в 00:17):
Попробовал программу в деле. Не понравилась. Неудобная, мало форматов открывает, да еще платная с таким функционалом проверок :). Мне кажется она больше подходит не для работы, а для исследований проверок регистрации и поиска "сюрпризов". Бесплатная PhotoScape привычнее.
xussr (22.06.2019 в 11:21):
Это что прикол такой взял прогу по ссылки ввел  шесть пятерок просто по приколу от балды она мне написала что прога успешна зарегина ну ты прикололся ...)))))

Интересная защита

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

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

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