Blog. Just Blog

Исследование защиты программы iSumsoft RAR Password Refixer

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

Программа RAR Password Refixer от компании iSumsoft, как нетрудно догадаться из названия, предназначена для рефиксинга паролей RAR-архивов. Не могу с уверенностью сказать, каким образом слово "исправление" относится к процессу подбора паролей, наверное, точно так же, как и "лечение" относится к взлому самой программы. Им и займемся.

Забираем с офсайта дистрибутив, устанавливаем, смотрим. Из внешних признаков триальности мне больше всего нравится надпись в окне "О программе":

Окно "О программе"
Окно "О программе"

А вот по функционалу имеется ограничение, а именно по длине восстанавливаемого пароля. Если по мнению программы пароль длиннее 3 символов, то процесс рефиксинга в незарегистрированной версии останавливается вот с таким сообщением:

Сообщение незарегистрированной версии
Сообщение незарегистрированной версии

Отправные точки для исследования у нас есть. Теперь посмотрим на главный исполняемый файл. Он упакован самым обычным пакером UPX, однако после попытки распаковки командой upx -d iSumsoftRARPasswordRefixer.exe перестает запускаться, падая с ошибкой.

Сообщение об ошибке
Сообщение об ошибке

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

Редактируем заголовок файла
Редактируем заголовок файла

Ставим галочку, сохраняем изменения, проверяем. Вот теперь распакованный файл запускается корректно. Отправляем его на разбор в дизассемблер. Когда тот закончит анализ, поищем в файле что-нибудь, связанное с триальным окном.

Триальное окно в ресурсах
Триальное окно в ресурсах

В ресурсах обнаруживается диалог с числовым идентификатором 150 или 96h, если считать в шестнадцатеричной системе. Первый же результат поиска выводит нас на нужный код:
  1. .text:00424260 sub_424260      proc near
  2. .text:00424260                 push    esi
  3. .text:00424261                 push    0
  4. ; Идентификатор диалогового окна из ресурсов
  5. .text:00424263                 push    96h
  6. .text:00424268                 mov     esi, ecx
  7. .text:0042426A                 call    sub_455ED1
  8. .text:0042426F                 mov     dword ptr [esi], offset off_5EE194
  9. .text:00424275                 mov     eax, esi
  10. .text:00424277                 mov     dword ptr [esi+98h], 0
  11. .text:00424281                 mov     dword ptr [esi+9Ch], 0
  12. .text:0042428B                 mov     dword ptr [esi+0A0h], 0
  13. .text:00424295                 mov     dword ptr [esi+0A4h], 0
  14. .text:0042429F                 mov     dword ptr [esi+0ACh], 0
  15. .text:004242A9                 mov     dword ptr [esi+0A8h], offset off_5B731C
  16. .text:004242B3                 pop     esi
  17. .text:004242B4                 retn    4
  18. .text:004242B4 sub_424260      endp
Значение "96h" встречается и дальше, но к появлению триального окна уже никакого отношения не имеет. В этом легко убедиться, запустив программу под отладчиком. Возвращаемся к листингу дизассемблера. Приведенная выше процедура вызывается из двух мест. По первой же перекрестной ссылке выходим на следующий код:
  1. .text:0042B9DD                 mov     dword ptr [esp+20h], 0
  2. .text:0042B9E5                 mov     dword ptr [esp+24h], 0
  3. .text:0042B9ED                 mov     dword ptr [esp+28h], 0
  4. .text:0042B9F5                 mov     byte ptr [esp+2B8h], 1
  5. ; Вызвать функцию проверки
  6. .text:0042B9FD                 call    sub_4382F0
  7. ; Если AL!=0, то триальное окно не появится
  8. .text:0042BA02                 test    al, al
  9. .text:0042BA04                 jnz     loc_42BAA5
  10. .text:0042BA0A                 mov     eax, [edi+1AF4h]
  11. .text:0042BA10                 test    eax, eax
  12. .text:0042BA12                 jz      loc_42BB69
  13. .text:0042BA18                 cmp     dword ptr [eax+30h], 0
  14. .text:0042BA1C                 jnz     loc_42BB69
  15. .text:0042BA22                 mov     eax, [esp+14h]
  16. .text:0042BA26                 cmp     dword ptr [eax-0Ch], 3
  17. .text:0042BA2A                 jle     loc_42BB69
  18. .text:0042BA30                 cmp     dword ptr [edi+1B3Ch], 0
  19. .text:0042BA37                 jnz     loc_42BB69
  20. .text:0042BA3D                 mov     eax, [edi+33BCh]
  21. .text:0042BA43                 test    eax, eax
  22. .text:0042BA45                 jz      short loc_42BA62
  23. .text:0042BA47                 xor     ecx, ecx
  24. .text:0042BA49                 add     eax, 28ECh
  25. .text:0042BA4E                 xchg    ecx, [eax]
  26. .text:0042BA50                 mov     eax, [edi+33BCh]
  27. .text:0042BA56                 mov     ecx, 7
  28. .text:0042BA5B                 add     eax, 28ECh
  29. .text:0042BA60                 xchg    ecx, [eax]
  30. .text:0042BA62 loc_42BA62:
  31. .text:0042BA62                 mov     esi, [edi+1AF4h]
  32. .text:0042BA68                 mov     dword ptr [edi+1B38h], 1
  33. .text:0042BA72                 test    esi, esi
  34. .text:0042BA74                 jz      short loc_42BA8B
  35. .text:0042BA76                 push    esi
  36. .text:0042BA77                 call    ds:EnterCriticalSection
  37. .text:0042BA7D                 push    esi
  38. .text:0042BA7E                 mov     dword ptr [esi+30h], 1
  39. .text:0042BA85                 call    ds:LeaveCriticalSection
  40. .text:0042BA8B loc_42BA8B:
  41. .text:0042BA8B                 push    ecx
  42. .text:0042BA8C                 lea     ecx, [esp+1F8h]
  43. .text:0042BA93                 call    sub_424260
  44. .text:0042BA98                 mov     byte ptr [esp+2B8h], 2
  45. .text:0042BAA0                 jmp     loc_42BB49
  46. .text:0042BAA5 ; ------------------------------------------------------
  47. .text:0042BAA5 loc_42BAA5:
  48. .text:0042BAA5                 mov     al, [edi+3198h]
  49. .text:0042BAAB                 test    al, al
  50. .text:0042BAAD                 jz      loc_42BB69
  51. .text:0042BAB3                 mov     eax, [edi+1AF4h]
  52. .text:0042BAB9                 test    eax, eax
Если какая-то функция проверки вернула AL=0, то триальное окно появляется, иначе алгоритм переходит на другую ветку. Теперь давайте посмотрим эту самую функцию проверки:
  1. .text:004382F0 sub_4382F0      proc near
  2. .text:004382F0                 push    ebp
  3. .text:004382F1                 mov     ebp, esp
  4. .text:004382F3                 push    0FFFFFFFFh
  5. .text:004382F5                 push    offset loc_5A2FE8
  6. .text:004382FA                 mov     eax, large fs:0
  7. .text:00438300                 push    eax
  8. .text:00438301                 sub     esp, 8
  9. .text:00438304                 push    ebx
  10. .text:00438305                 mov     eax, dword_61F480
  11. .text:0043830A                 xor     eax, ebp
  12. .text:0043830C                 push    eax
  13. .text:0043830D                 lea     eax, [ebp+var_C]
  14. .text:00438310                 mov     large fs:0, eax
  15. .text:00438316                 call    sub_453144
  16. .text:0043831B                 xor     ecx, ecx
  17. .text:0043831D                 mov     edx, eax
  18. .text:0043831F                 test    edx, edx
  19. .text:00438321                 setnz   cl
  20. .text:00438324                 test    ecx, ecx
  21. .text:00438326                 jnz     short loc_438332
  22. .text:00438328                 push    80004005h
  23. .text:0043832D                 call    loc_4201B0
  24. .text:00438332 loc_438332:
  25. .text:00438332                 mov     eax, [edx]
  26. .text:00438334                 mov     ecx, edx
  27. .text:00438336                 call    dword ptr [eax+0Ch]
  28. .text:00438339                 add     eax, 10h
  29. .text:0043833C                 mov     [ebp+var_10], eax
  30. .text:0043833F                 lea     eax, [ebp+var_10]
  31. .text:00438342                 mov     [ebp+var_4], 0
  32. .text:00438349                 push    eax
  33. .text:0043834A                 push    ecx
  34. .text:0043834B                 call    sub_438AE0
  35. .text:00438350                 test    al, al
  36. .text:00438352                 jz      short loc_438386
  37. .text:00438354                 mov     eax, [ebp+var_10]
  38. .text:00438357                 cmp     dword ptr [eax-0Ch], 0
  39. .text:0043835B                 jl      short loc_438386
  40. .text:0043835D                 push    offset off_5F240C
  41. .text:00438362                 push    eax
  42. .text:00438363                 call    sub_57C8D4
  43. .text:00438368                 add     esp, 8
  44. .text:0043836B                 test    eax, eax
  45. .text:0043836D                 jz      short loc_438386
  46. .text:0043836F                 sub     eax, [ebp+var_10]
  47. .text:00438372                 sar     eax, 1
  48. .text:00438374                 jnz     short loc_438386
  49. .text:00438376                 lea     ecx, [ebp+var_10]
  50. .text:00438379                 call    sub_438400
  51. .text:0043837E                 test    al, al
  52. .text:00438380                 jz      short loc_438386
  53. .text:00438382                 mov     bl, 1
  54. .text:00438384                 jmp     short loc_4383C7
  55. .text:00438386 ; ---------------------------------------------
  56. .text:00438386 loc_438386:
  57. .text:00438386                 lea     ecx, [ebp+var_10]
  58. .text:00438389                 call    loc_41FEF0
  59. .text:0043838E                 lea     eax, [ebp+var_10]
  60. .text:00438391                 push    eax
  61. .text:00438392                 call    sub_438730
  62. .text:00438397                 mov     eax, [ebp+var_10]
  63. .text:0043839A                 cmp     dword ptr [eax-0Ch], 0
  64. .text:0043839E                 jl      short loc_4383C5
  65. .text:004383A0                 push    offset off_5F240C
  66. .text:004383A5                 push    eax
  67. .text:004383A6                 call    sub_57C8D4
  68. .text:004383AB                 add     esp, 8
  69. .text:004383AE                 test    eax, eax
  70. .text:004383B0                 jz      short loc_4383C5
  71. .text:004383B2                 sub     eax, [ebp+var_10]
  72. .text:004383B5                 sar     eax, 1
  73. .text:004383B7                 jnz     short loc_4383C5
  74. .text:004383B9                 lea     ecx, [ebp+var_10]
  75. .text:004383BC                 call    sub_438400
  76. .text:004383C1                 mov     bl, al
  77. .text:004383C3                 jmp     short loc_4383C7
  78. .text:004383C5 ; ------------------------------------------
  79. .text:004383C5 loc_4383C5:
  80. .text:004383C5                 xor     bl, bl
  81. .text:004383C7 loc_4383C7:
  82. .text:004383C7                 mov     [ebp+var_4], 0FFFFFFFFh
  83. .text:004383CE                 or      ecx, 0FFFFFFFFh
  84. .text:004383D1                 mov     edx, [ebp+var_10]
  85. .text:004383D4                 add     edx, 0FFFFFFF0h
  86. .text:004383D7                 lea     eax, [edx+0Ch]
  87. .text:004383DA                 lock xadd [eax], ecx
  88. .text:004383DE                 dec     ecx
  89. .text:004383DF                 test    ecx, ecx
  90. .text:004383E1                 jg      short loc_4383EB
  91. .text:004383E3                 mov     ecx, [edx]
  92. .text:004383E5                 push    edx
  93. .text:004383E6                 mov     eax, [ecx]
  94. .text:004383E8                 call    dword ptr [eax+4]
  95. .text:004383EB loc_4383EB:
  96. .text:004383EB                 mov     al, bl
  97. .text:004383ED                 mov     ecx, [ebp+var_C]
  98. .text:004383F0                 mov     large fs:0, ecx
  99. .text:004383F7                 pop     ecx
  100. .text:004383F8                 pop     ebx
  101. .text:004383F9                 mov     esp, ebp
  102. .text:004383FB                 pop     ebp
  103. .text:004383FC                 retn
  104. .text:004383FC sub_4382F0      endp
В самой функции мало что есть, но если побродить по процедурам, которые она вызывает, то там обнаружится работа с реестром, какие-то активные вычисления и всякое такое. Тут главное, что момент истины наступает по адресу 004383EB, где в регистр AL заносится итоговое значение. Меняем эту команду двухбайтовой командой MOV AL,1 и сохраняем изменения.

Ограничение снято
Ограничение снято

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

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

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

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

Комментарии

Отзывы посетителей сайта о статье
Жека (13.03.2023 в 01:33):
ManHunter, ну вы блин даёте, вы уже крякали из разряда это "говнософта" ранее, только другим методом. Там их куева туча, такого поделья - с одинаковым интерфейсом и самое главное кодом, от типа, разных производителей. Правильный ключ, для этой, будет: ISUMSOFT-RAR-REFIXER1234-45678  Ключевое слово там - ISUMSOFT-RAR-REFIXER отличатся друг от друга, а 1234-45678 у всех одинаковое. Кстати, они все не поддерживают архивы RAR-5. Как написали 10 лет назад свой код, ТАК И КЛЕПАЮТ, МОЛОДЦЫ!
voffka (09.11.2022 в 11:43):
В последнее время стараюсь не трогать этот флаг, патчу по смещению от ImageBase. Всего 2-3 строчки кода.

Для exe
MOV EAX,DWORD PTR FS:[030h]
MOV EAX,DWORD PTR DS:[EAX+8] ;ImageBase EAX

Для dll
CALL @_00401236
@_00401236:
POP EAX
SUB EAX,01236h ; sub @_00401236 RVA, ImageBase EAX

Хотя при инлайне дорог каждый байт свободного места.
ManHunter (09.11.2022 в 07:35):
Можно заинлайнить упакованный файл, тогда все равно придется флажок сбрасывать.
voffka (09.11.2022 в 06:14):
Распаковка по фэншую: upx -d --strip-relocs=0 iSumsoftRARPasswordRefixer.exe

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

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

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