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 и сохраняем изменения.

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

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

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

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

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

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

Комментарии

Отзывы посетителей сайта о статье
Саша (06.12.2023 в 16:00):
ManHunter, Низкий поклон вам, как вас отблагодарить не знай. Очень интересно покопаться
ManHunter (06.12.2023 в 15:56):
ida
Саша (06.12.2023 в 15:36):
ManHunter, Имеется в ввиду Code Assembler
Ни где не могу найти что эта за программа, перекачал многое уже не подходят
ManHunter (06.12.2023 в 14:00):
Взять и загуглить по названиям программ.
Саша (06.12.2023 в 13:35):
А где скачать редактор такой же как в посте ? Благодарю
Жека (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-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 3 (0.0054 сек.) / Память: 4.5 Mb
Наверх