
- •Курсовая работа
- •Постановка задачи на курсовую работу
- •Внешнее предварительное исследование программного продукта
- •Предварительный анализ кода программы в отладчике
- •3.1. Точки останова
- •3.2. Поиск введенных данных
- •0012F63c 00404ff7 return to textguar.00404ff7 from textguar.004030d0
- •00404Ff2 |. E8 d9e0ffff call textguar.004030d0
- •00405008 |. E8 c3e0ffff call textguar.004030d0
- •«Жесткий» взлом
- •00404Da9 |. 75 03 |jnz short textguar.00404dae
- •00405024 |. E8 b7010000 call textguar.004051e0
- •00405029 |. 85C0 test eax,eax
- •0040502B |. 74 39 je short textguar.00405066
- •Подробный анализ механизма защиты. Осуществление мягкого взлома.
- •Блок-схема алгоритма модуля защиты
- •Рекомендации по улучшению механизма защиты
- •Заключение
00405024 |. E8 b7010000 call textguar.004051e0
00405029 |. 85C0 test eax,eax
0040502B |. 74 39 je short textguar.00405066
0040502D |. 68 C4474100 PUSH textguar.004147C4 ;ASCII "12345"
00405032 |. 68 38144100 PUSH textguar.00411438 ;ASCII "rkey"
00405037 |. 68 30144100 PUSH textguar.00411430 ;ASCII "General"
0040503C |. E8 9FD7FFFF CALL textguar.004027E0
00405041 |. 68 44474100 PUSH textguar.00414744 ;ASCII "dilyara"
00405046 |. 68 28144100 PUSH textguar.00411428 ;ASCII "rname"
0040504B |. 68 30144100 PUSH textguar.00411430 ;ASCII "General"
00405050 |. E8 8BD7FFFF CALL textguar.004027E0
00405055 |. 83C4 18 ADD ESP,18
00405058 |. 6A 40 PUSH 40
0040505A |. 68 20144100 PUSH textguar.00411420 ;ASCII "Thanks"
0040505F |. 68 04144100 PUSH textguar.00411404 ;ASCII "Thank you for your support!"
00405064 |. EB 1A JMP SHORT textguar.00405080
00405066 |> 6A 10 PUSH 10
00405068 |. 68 1C134100 PUSH textguar.0041131C ;ASCII "Error"
0040506D |. C605 C4474100>MOV BYTE PTR DS:[4147C4],0
00405074 |. C605 44474100>MOV BYTE PTR DS:[414744],0
0040507B |. 68 D4134100 PUSH textguar.004113D4 ;ASCII "Wrong key or name! Please contact the author"
00405080 |> 8BCE MOV ECX,ESI
00405082 |. E8 29D2FFFF CALL textguar.004022B0
00405087 |. A0 44474100 MOV AL,BYTE PTR DS:[414744]
0040508C |. 84C0 TEST AL,AL
0040508E |. 74 18 JE SHORT textguar.004050A8
00405090 |. A0 C4474100 MOV AL,BYTE PTR DS:[4147C4]
00405095 |. 84C0 TEST AL,AL
00405097 |. 74 0F JE SHORT textguar.004050A8
00405099 |. B8 01000000 MOV EAX,1
0040509E |. 8BCE MOV ECX,ESI
004050A0 |. 50 PUSH EAX
004050A1 |. E8 2AE1FFFF CALL textguar.004031D0
004050A6 |. 5E POP ESI
004050A7 |. C3 RETN
004050A8 |> 33C0 XOR EAX,EAX
004050AA |. 8BCE MOV ECX,ESI
004050AC |. 50 PUSH EAX
004050AD |. E8 1EE1FFFF CALL textguar.004031D0
004050B2 |. 5E POP ESI
004050B3 \. C3 RETN
Как видно, после следующей вызываемой процедуры идет сравнение регистра EAX с нулем. В случае, если регистр равен нулю, происходит переход на команды передачи в стек текстовых ресурсов программы о том, что введенный пароль неправилен: "Error" и "Wrong key or name! Please contact the author". Значит, необходимо поменять флаг Z на ноль, или же сделать регистр EAX равным значению, отличному от нуля для того, чтобы пароль был принят программой. При выполнении данных шагов, был получен следующий результат:
Кроме этого, я обнаружила, что в файле textguard.ini программой была записана введенная мной информация в следующих строчках: rkey=12345 и rname=dilyara.
Однако программа осталась незарегистрированная – в заголовке программы осталась надпись UNREGISTERED (присутствие надписи – UNGERISTERED – вероятная ошибка автора программы):
Для решения этой проблемы необходимо посмотреть код третьей процедуры, вызываемой командой: CALL textguar.004051E0.
004051E0 /$ 68 C4474100 PUSH textguar.004147C4 ; ASCII "12345"
004051E5 |. 68 44474100 PUSH textguar.00414744 ; ASCII "dilyara"
004051EA |. E8 D1FEFFFF CALL textguar.004050C0
004051EF |. 83C4 08 ADD ESP,8
Как видно, в данной процедуре происходит вызов еще одной процедуры, в которую одновременно передаются введенные имя и пароль пользователя. Можно сделать вывод, что процедура по адресу textguar.004050C0 – и есть та процедура, которая принимает решение о правильности пароля.
004051F2 |. 33C9 XOR ECX,ECX ;обнуление регистра ECX
004051F4 |. 85C0 TEST EAX,EAX ;сравнение регистра EAX с нулем
004051F6 |. 0F9FC1 SETG CL ;установка регистра CL в 1,
;если регистр EAX больше нуля
004051F9 |. 8BC1 MOV EAX,ECX ;занесение регистра ECX в EAX
004051FB \. C3 RETN ;возврат
Как мы помним, регистр EAX должен быть отличен от 0 для того, чтобы пароль был принят программой как правильный. Вероятно, разработчик попытался запутать присвоение регистру EAX значения 1 этими командами. Но здесь, сначала обнуляется регистр ECX, а затем, на основании значения регистра EAX (который, вероятно, устанавливается в процессе работы вызываемой функции textguar.004050C0), устанавливается значение регистра ECX в 1, если пароль правилен, а затем это значение заносится в EAX.
Кроме того, выделив строчку кода по адресу 004051E0 (процедура, вызываемая для проверки пароля), я обнаружила посредством OllyDbg, что данная процедура вызывается из нескольких мест кода – с адресов 00405024 и 00405FA3. Сюда мы пришли с адреса 00405024, значит данная процедура проверки пароля единственна, и со второго адреса она вызывается с целью формирования заголовка.
Возможными путями «жесткого» взлома здесь являются следующие:
1. Здесь можно заменить команду установки байта по условию на противоположный, то есть на SETLE.
004051F6 |. 0F9EC1 SETLE CL
004051F9 |. 8BC1 MOV EAX,ECX
004051FB \. C3 RETN
2. Здесь можно фактически заносить в регистр AL единицу. Используется регистр AL для того, чтобы длина команды соответствовала длине предыдущей команды.
004051F4 |. 85C0 TEST EAX,EAX
004051F6 |. 0F9FC1 SETG CL
004051F9 |. B0 01 MOV AL,1
004051FB \. C3 RETN
3. В этом варианте мы можем использовать свободное место после команды RETN и дописать ту же команду присвоения значения 1 регистру AL.
004051F4 |. 85C0 TEST EAX,EAX
004051F6 |. 0F9FC1 SETG CL
004051F9 |. 8BC1 MOV EAX,ECX
004051FB \. C3 RETN
004051FC 90 NOP
004051FD 90 NOP
004051FE 90 NOP
004051FF 90 NOP
Я выбрала первый вариант и с помощью редактора кода Hiew произвела изменения в файле, сохранив результат с именем hardreset_textguard.exe. Запустила измененную программу и получила следующий результат при вводе пары имя пользователя – пароль равные dilyara и 12345 соответственно:
Как видно, программа приняла предложенный пароль и теперь является зарегистрированной. Кроме того, пункт меню «Register» после ввода данного пароля стал неактивен. Регистрационную информацию измененная программа сохранила уже в файле hardreset_textguard.ini.
Жесткий взлом программы успешно удалось реализовать.