Применение базовых команд не дает никакого преимущества перед использованием API-функции lstrcmp. В этом случае достигается не только разнообразие вариантов программ с запросом пароля, но и детализация внутреннего алгоритма проверки вводимых символов пароля.
Особенностью программы можно считать применение функции WriteConsole, которую так же надо было применить в программе 2.1. Эта функция выводит сообщение с просьбой ввести пароль в консольном окне.
В связи с тем, что эта программа является консольной, то необходимо в среде masm64 использовать bat-файл с командными словами SUBSYSTEM:CONSOLE.
Функция WriteConsole записывает символьную строку в экранный буфер консоли, начинающийся с текущей позиции курсора.
Синтаксис:
Параметры:Код (C):
BOOL WriteConsole( HANDLE hConsoleOutput, // дескриптор экранного буфера CONST VOID * lpBuffer, // буфер записи DWORD nNumberOfCharsToWrite, // число символов для записи LPDWORD lpNumberOfCharsWritten, // число записанных символов LPVOID lpReserved // зарезервировано );
Возвращаемые значения:
- hConsoleOutput – дескриптор экранного буфера консоли. Дескриптор должен иметь право доступа GENERIC_READ. Для получения дополнительной информации, см. статью Защита буфера и права доступа в консоли;
- lpBuffer – указатель на буфер, содержащий символы, которые будут записаны в экранный буфер консоли. Общий размер должен быть меньше чем 64 кб;
- nNumberOfCharsToWrite – число TCHARs для чтения;
- lpNumberOfCharsWritten – указатель на переменную, которая принимает число фактических записей TCHARs;
- lpReserved – зарезервировано, должно быть ПУСТО (NULL).
Чтобы получать расширенные данные об ошибках необходимо воспользоваться функцией GetLastError (System Error Codes).
- если функция завершается успешно, величина возвращаемого значения – не ноль;
- если функция завершается с ошибкой, величина возвращаемого значения – ноль.
Программа 2.4. Проверка пароля при использовании базовых команд:
В программе функцией WriteConsole выводится пригласительное окно консоли с сообщением "Please enter your password, 5 characters".Код (ASM):
include win64a.inc .data Password db "12345" ; пароль len1 equ ($-Password)/type Password ; число символов Buf dq 5 ; Err1 dq 0 Msg1 db "Пароль совпал",0 Msg2 db "Пароль не корректен",0 Title1 db "Проверка пароля",0 stdout dq 0 ; stdin dq 0 ; cRead dq 0 ; cWritten dq 0 ; Msg db "Please enter your password, 5 characters",0dh,0ah,0 ; .code WinMain proc sub rsp,28h; cтек: 28h=32d+8; 8 - возврат mov rbp,rsp invoke GetStdHandle,STD_OUTPUT_HANDLE mov stdout,rax invoke GetStdHandle,STD_INPUT_HANDLE mov stdin,rax invoke WriteConsole,stdout,ADDR Msg,sizeof Msg,ADDR cWritten,0 invoke ReadConsole,stdin,ADDR Buf,5,ADDR cRead,0 lea rsi,Password ; загрузка адреса нахождения Password lea rdi,Buf ; загрузка адреса буфера введенных символов mov rcx,len1 ; счетчик символов m1: mov al,[rsi] ; загрузка адреса нахождения пароля mov bl,[rdi] ; cmp al,bl ; сравнение символов jz m2 ; если совпали символы inc Err1 ; счетчик несовпадений m2: add rsi,1 ; inc адреса add rdi,1 ; loop m1 .if (Err1==0) ; &&(cRead==len1) invoke MessageBox,0,addr Msg1,addr Title1,MB_OK .else invoke MessageBox,0,addr Msg2,addr Title1,MB_OK .endif invoke RtlExitUserProcess,0 ;ExitProcess,0 WinMain endp end
Метка m1 организует цикл чтения пяти символов пароля по значению счетчика в регистре rcx.
Переменная Err1 служит счетчиком несовпадений символов пароля. В случае, если хотя бы один символ не правильный, то выводится сообщение "Пароль не корректен".
В связи с тем, что эта программа мало чем отличается от рассмотренной ранее, то вкратце рассмотрим этапы поиска пароля:
Внести изменения в отладчике x64Dbg можно двумя способами.
- Запускаем отладчик x64Dbg и открываем исследуемый ехе-файл. Для этого открываем в отладчике x64Dbg ехе-файл анализируемой программы и нажимаем F9 для ее выполнения (рис. 2.6).
- Находим функцию вывода сообщения. Для этого последовательно нажимаем в отладчике x64Dbg на клавишу F8 до момента приглашения ввода пароля функцией WriteConsole. Вводим пароль, например, 123. И обязательно нажимаем на клавиатуре Enter. В консольном окне, вроде бы ничего и не отображается. Однако, если продолжать нажимать F8 для выполнения каждой строки кода, то после выполнения функции ReadConsole введенный ранее пароль отобразится и процесс анализа кода продолжится (рис. 2.7).
Следующие три этапа (нахождение места анализа паролей, изменение команды ветвления, внесение изменений) ничем от ранее рассмотренного варианта не отличаются, кроме других адресов ячеек памяти.- Находим место анализа паролей. Продолжаем выполнять строки кода в пошаговом режиме, нажимая на клавишу F8. Немного ниже видны строки кода
В этих строках кода в регистр al заносится из памяти один символ, а в регистр bl – символ из буфера. А команда сравнения cmp сравнивает эти символы. При анализе всегда надо сначала обращать серьезное внимание командам сравнения (конечно, если не применены специальные приемы для того, чтобы спрятать такие строки).Код (ASM):
mov al,byte ptr ds:[rsi] mov bl,byte ptr ds:[rdi] cmp al,bl
После команды сравнения двух символов (эталоного и считываемого) располагается команда ветвления je – переход, если равно. А после перехода строки кода
увеличивают адреса расположения сравниваемых символов.Код (ASM):
add rsi,1 add rdi,1
В блоке кодав первой строке во внутри команды loop как раз и располагается команда jnz – переход по адресу, если значения в счетчике не совпали.Код (ASM):
loop pas2-64.7FF652071093 cmp qword ptr ds:[7FF65207300D],0 jne pas2-64.7FF6520710D1
- Изменение команды ветвления. В последнем блоке кода найдена команда ветвления jne по признаку, которую необходимо изменить. Следовательно, необходимо чтобы строки кода выполнялись ниже без переходов или поставить вместо команды jne команды nop (что в нашем случае проще).
Чтобы заменить команду jne на команды nop подводим курсор к команде, которую надо заменить, дважды нажимаем левую клавишу мышки, выбираем Заполнить командами NOP, вводим в поле имя NOP и нажимаем ОК (рис. 2.8).
- Внесение изменений.
Первый способ: выбираем Файл/ Исправить файл. В новом окне выбрать пункт Исправить файл. Затем – новое имя и расширение ехе.
Второй способ: выбрать пиктограмму с названием Исправления, нажать на кнопку Исправить файл, а далее новое имя и расширение ехе.
После внесенных изменений ехе-файл с новым именем на любой пароль реагирует как на лицензионный.
Реверсинг программы с использованием базовых команд. Часть 2
Дата публикации 22 мар 2019
| Редактировалось 17 май 2019