Blog. Just Blog

Исследование защиты программы Advanced FTP Password Recovery

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

Программа Advanced FTP Password Recovery предназначена для восстановления забытых паролей от FTP, которые сохранены в настройках различных FTP-клиентов. Уникальность и универсальность Advanced FTP Password Recovery заключается в том, что вам не требуется расшифровывать какие-то файлы, брутить пароли или что-то еще. Если пароль сохранен в FTP-клиенте, то вам достаточно просто послать запрос на соединение, а Advanced FTP Password Recovery перехватит и покажет ваш пароль. Для перехвата надо сперва немного подготовиться: изменить в настройках FTP-клиента адрес нужного сервера на localhost или завернуть его через файл hosts на ip-адрес 127.0.0.1, если отредактировать его нельзя. Advanced FTP Password Recovery при запуске биндит свой перехватчик на порт 21 (FTP) локального хоста и ждет от FTP-клиента запроса на авторизацию. Очень простое и элегантное решение. Лично я считаю, что подобный инструмент в обязательном порядке должен быть на дежурной флешке, но, во-первых, программа не портативная, а во-вторых, бесплатно показывает только количество символов в пароле, сам пароль отображается только после регистрации.

Несмотря на то, что на офсайте есть ссылки на дистрибутив, они все ведут в никуда. Чтобы найти рабочую ссылку, пришлось немало пошерстить интернет. На всякий случай я перезалил его на файлообменник. Устанавливаем программу, смотрим. Главный исполняемый файл упакован UPX, который снимается им же или любым привычным для вас распаковщиком. Все остальные файлы в папке не несут никакой полезной нагрузки и могут быть удалены.

Запускаем распакованную программу, пробуем зарегистрировать любыми левыми данными:

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

Отлично, текст сообщения мы теперь знаем. Поищем его в распакованном файле.

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

Тоже никаких проблем, строка найдена, а рядом строка о корректной регистрации. Может быть придется и ее где-нибудь искать. Но пока посмотрим в дизассемблере условия появления сообщения о неправильной регистрации:
  1. .text:00402BFA                 lea     eax, [ebp+String]
  2. .text:00402C00                 push    eax             ; lpString
  3. ; Вызвать функцию проверки
  4. .text:00402C01                 call    sub_403D50
  5. ; Если она вернула EAX=0, то введенный серийник неправильный
  6. .text:00402C06                 test    eax, eax
  7. .text:00402C08                 pop     ecx
  8. .text:00402C09                 jz      short loc_402C58
  9. ; Сообщение об удачной регистрации
  10. .text:00402C0B                 lea     eax, [ebp+String2]
  11. .text:00402C11                 push    40h             ; uType
  12. .text:00402C13                 push    eax             ; lpCaption
  13. .text:00402C14                 push    offset aThanksForRegis
  14. ; "Thanks for registering this program!"
  15. .text:00402C19                 push    [ebp+hDlg]      ; hWnd
  16. .text:00402C1C                 call    MessageBoxA
  17. .text:00402C22                 mov     esi, EndDialog
  18. .text:00402C28                 push    1               ; nResult
  19. .text:00402C2A                 push    [ebp+hDlg]      ; hDlg
  20. .text:00402C2D                 call    esi ; EndDialog
  21. .text:00402C2F                 lea     eax, [ebp+String]
  22. .text:00402C35                 push    eax             ; lpData
  23. .text:00402C36                 call    sub_403ED0
  24. .text:00402C3B                 pop     ecx
  25. .text:00402C3C                 push    ebx             ; lParam
  26. .text:00402C3D                 push    ebx             ; wParam
  27. .text:00402C3E                 push    464h            ; Msg
  28. .text:00402C43                 push    dword_4043E8    ; hWnd
  29. .text:00402C49                 call    PostMessageA
  30. .text:00402C4F                 push    2               ; nResult
  31. .text:00402C51                 push    [ebp+hDlg]      ; hDlg
  32. .text:00402C54                 call    esi ; EndDialog
  33. .text:00402C56                 jmp     short loc_402C8A
  34. .text:00402C58 ; -----------------------------------------------
  35. .text:00402C58 loc_402C58:
  36. ; Сообщение о неудачной регистрации
  37. .text:00402C58                 lea     eax, [ebp+String2]
  38. .text:00402C5E                 push    10h             ; uType
  39. .text:00402C60                 push    eax             ; lpCaption
  40. .text:00402C61                 push    offset aTheCodeYouHave
  41. ; "The code you have entered is incorrect."...
  42. .text:00402C66                 push    [ebp+hDlg]      ; hWnd
  43. .text:00402C69                 call    MessageBoxA
  44. .text:00402C6F                 jmp     short loc_402C8A
Посмотрим на функцию проверки введенного серийника:
  1. .text:00403D50 sub_403D50      proc near
  2. .text:00403D50                 sub     esp, 2Ch
  3. .text:00403D53                 xor     ecx, ecx
  4. .text:00403D55                 xor     al, al
  5. .text:00403D57                 mov     [esp+2Ch+var_F], ecx
  6. .text:00403D5B                 mov     [esp+2Ch+var_10], al
  7. .text:00403D5F                 mov     [esp+2Ch+var_B], ecx
  8. .text:00403D63                 mov     [esp+2Ch+Src], al
  9. .text:00403D67                 mov     [esp+2Ch+var_1C], al
  10. .text:00403D6B                 push    esi
  11. .text:00403D6C                 mov     esi, [esp+30h+lpString]
  12. .text:00403D70                 mov     [esp+30h+var_7], ecx
  13. .text:00403D74                 xor     edx, edx
  14. .text:00403D76                 xor     eax, eax
  15. .text:00403D78                 mov     [esp+30h+var_3], cx
  16. .text:00403D7D                 mov     dword ptr [esp+30h+Src+1], edx
  17. .text:00403D81                 mov     [esp+30h+var_1B], eax
  18. .text:00403D85                 push    esi             ; lpString
  19. .text:00403D86                 mov     [esp+34h+var_1], cl
  20. .text:00403D8A                 mov     [esp+34h+var_23], edx
  21. .text:00403D8E                 mov     [esp+34h+var_17], eax
  22. .text:00403D92                 call    lstrlenA
  23. .text:00403D98                 test    eax, eax
  24. .text:00403D9A                 jz      loc_403E3D
  25. .text:00403DA0                 mov     ecx, esi
  26. .text:00403DA2                 mov     edx, [ecx]
  27. .text:00403DA4                 mov     dword ptr [esp+30h+Src], edx
  28. .text:00403DA8                 mov     eax, [ecx+4]
  29. .text:00403DAB                 lea     ecx, [esp+30h+var_1C]
  30. .text:00403DAF                 mov     [esp+0Ch], eax
  31. .text:00403DB3                 mov     eax, 1
  32. .text:00403DB8                 dec     ecx
  33. .text:00403DB9 loc_403DB9:
  34. .text:00403DB9                 mov     dl, [esi+eax+8]
  35. .text:00403DBD                 mov     [ecx+eax], dl
  36. .text:00403DC0                 inc     eax
  37. .text:00403DC1                 cmp     eax, 9
  38. .text:00403DC4                 jl      short loc_403DB9
  39. .text:00403DC6                 mov     esi, sscanf
  40. .text:00403DCC                 lea     eax, [esp+30h+var_2C]
  41. .text:00403DD0                 push    eax
  42. .text:00403DD1                 lea     ecx, [esp+34h+Src]
  43. .text:00403DD5                 push    offset Format   ; "%X"
  44. .text:00403DDA                 push    ecx             ; Src
  45. .text:00403DDB                 call    esi ; sscanf
  46. .text:00403DDD                 add     esp, 0Ch
  47. .text:00403DE0                 lea     edx, [esp+30h+lpString]
  48. .text:00403DE4                 lea     eax, [esp+30h+var_1C]
  49. .text:00403DE8                 push    edx
  50. .text:00403DE9                 push    offset Format   ; "%X"
  51. .text:00403DEE                 push    eax             ; Src
  52. .text:00403DEF                 call    esi ; sscanf
  53. .text:00403DF1                 call    sub_403AA0
  54. .text:00403DF6                 lea     ecx, [esp+3Ch+Src]
  55. .text:00403DFA                 push    9
  56. .text:00403DFC                 push    ecx
  57. .text:00403DFD                 call    sub_403AF0
  58. .text:00403E02                 lea     edx, [esp+44h+var_10]
  59. .text:00403E06                 push    10h
  60. .text:00403E08                 push    edx
  61. .text:00403E09                 call    sub_403C20
  62. .text:00403E0E                 lea     eax, [esp+4Ch+var_10]
  63. .text:00403E12                 push    10h
  64. .text:00403E14                 push    eax
  65. .text:00403E15                 call    sub_403CA0
  66. .text:00403E1A                 push    eax
  67. .text:00403E1B                 call    sub_403CF0
  68. .text:00403E20                 mov     ecx, [esp+58h+lpString]
  69. .text:00403E24                 add     esp, 28h
  70. .text:00403E27                 cmp     cx, ax
  71. .text:00403E2A                 jnz     short loc_403E3D
  72. .text:00403E2C                 xor     eax, ecx
  73. .text:00403E2E                 pop     esi
  74. .text:00403E2F                 and     eax, 0FFFF0000h
  75. .text:00403E34                 neg     eax
  76. .text:00403E36                 sbb     eax, eax
  77. .text:00403E38                 inc     eax
  78. .text:00403E39                 add     esp, 2Ch
  79. .text:00403E3C                 retn
  80. .text:00403E3D ; -------------------------------
  81. .text:00403E3D loc_403E3D:
  82. .text:00403E3D                 xor     eax, eax
  83. .text:00403E3F                 pop     esi
  84. .text:00403E40                 add     esp, 2Ch
  85. .text:00403E43                 retn
  86. .text:00403E43 sub_403D50      endp
Во-первых, она вызывается из нескольких мест, то есть как минимум при старте программы и при проверке введенного серийника. Это хорошо, не придется искать другие функции проверки. В-вторых, именно здесь проверяется длина строки, которая может оказаться пустой, то есть никакого серийника может и не быть. Это тоже хорошо, ведь мы планируем сделать портативную версию программы, которая не будет никуда сохранять данные регистрации и, соответственно, ниоткуда их не будет получать. Ну и, наконец, функция проверки всегда должна возвращать EAX с ненулевым значением. Проще всего заменить двухбайтную команду XOR EAX,EAX по адресу 00403E3D на двухбайтную команду MOV AL,1. При пустой строке серийника переход будет выполнен сразу же сюда.

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

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

На всякий случай проверим, как обновленная Advanced FTP Password Recovery справляется со своей основной задачей. Тоже все работает как надо, в окне программы мы видим перехваченный логин и пароль. Цель достигнута. Точно так же можно сделать портативными и зарегистрированными остальные программы этой компании, среди которых, кстати, немало полезных. Иметь на дежурной флешке полный набор их инструментария не помешает.

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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (21.10.2014 в 14:57):
Радость от выкладывания исходников стилера? Ну это да, в потрошках там реально интересно поковыряться :)
DimitarSerg (21.10.2014 в 13:59):
ЦитатаНе путай мягкое и теплое :)

Да я не путаю, статью читал и видел как работает. Это был скорее оффтоп с радости :)
ManHunter (21.10.2014 в 08:55):
ЦитатаUFR Stealer сделали опенсорсным

Не путай мягкое и теплое :) У стилеров и этой программы совершенно разные принципы работы.
DimitarSerg (21.10.2014 в 03:35):
ЦитатаЧтобы найти рабочую ссылку, пришлось немало пошерстить интернет.

Web-архив никто не отменял, время поиска 3-4 минуты.

Цитатапредназначена для восстановления забытых паролей от FTP, которые сохранены в настройках различных FTP-клиентов.

Вон UFR Stealer сделали опенсорсным, можно навостанавливать чего угодно и не только своё :D , так навеяло что-то, сорри
Maksovich (19.10.2014 в 20:33):
Хорошая Программа!
user (17.10.2014 в 04:01):
Описана версия 1.0.180.2006

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

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

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