
Чтобы иметь возможность ломать программы, на страже которых стоят хитрые защитные механизмы, нужно уметь эти механизмы находить. В сегодняшней статье мы покажем, как это делают, а в конце разберем пример работы с графическим приложением.
«Фундаментальные основы хакерства»
Перед тобой уже во второй раз обновленная версия цикла «Фундаментальные основы хакерства». В 2018 году Юрий Язев изменил текст Криса Касперски для соответствия новым версиям Windows и Visual Studio, а теперь внес правки с учетом отладки программ для 64-разрядной архитектуры.
Читай также улучшенные версии прошлых статей цикла:
- Учимся анализировать программы для x86-64 с нуля
- Используем отладчик для анализа 64-разрядных программ в Windows
- Находим реальные адреса инструкций в исполняемых файлах x86-64
Все новые версии статей доступны без платной подписки.
КАК ПОДКЛЮЧИТЬСЯ к любому WiFi? | Лом@ем соседский Wi-Fi | Этичный хакинг

Цикл «Фундаментальные основы хакерства» со всеми обновлениями опубликован в виде книги, купить ее по выгодной цене ты можешь на сайте издательства «Солон‑пресс».
В прошлой статье цикла мы узнали, как соотнести адреса байтов в виртуальной памяти с их реальным расположением на носителе. Это потребовало от нас напрячь мозг и применить математику. Между тем, как мы увидели из предыдущих статей, непосредственный взлом, когда известно месторасположение защитного механизма, представляет собой элементарную задачу, которую легко решить с помощью Hiew или другого редактора PE-файлов.
www
Способ 1. Прямой поиск введенного пароля в памяти
Пароль, хранящийся в теле программы открытым текстом, — скорее из ряда вон выходящее исключение, чем правило. К чему услуги хакера, если пароль и без того виден невооруженным глазом? Поэтому разработчики защиты всячески пытаются скрыть его (о том, как именно они это делают, мы поговорим позже).
Впрочем, учитывая размер современных дистрибутиWow, программист может без особого труда поместить пароль в любом завалящем файле, попутно снабдив его «крякушами» — строками, выглядящими как пароль, но паролем не являющимися. Попробуй разберись, где тут липа, а где нет, тем более что подходящих на эту роль строк в проекте средней величины может быть несколько сотен, а то и тысяч!
Давай подойдем к решению проблемы от обратного — будем искать не исходный пароль, который нам неизвестен, а ту строку, которую мы скормили программе в качестве пароля. А найдя, установим на нее бряк, и дальше всё точно так же, как и раньше. Бряк всплывает на обращение по сравнению, мы выходим из сравнивающей процедуры, корректируем JMP и.
авторское право на youtube | как уникализировать видео для ютуба | монетизация youtube
Взглянем еще раз на исходный текст ломаемого нами примера passCompare1. cpp :
printf ( «Enter password: » ) ;
if ( strcmp ( Wrong password n » ) ;
else break ;
if ( ++ count > 2 ) return — 1 ;
Обрати внимание — в buff читается введенный пользователем пароль, сравнивается с оригиналом, затем (при неудачном сравнении) запрашивается еще раз, но (!) при этом buff не очищается! Отсюда следует, что, если после выдачи ругательства «Wrong password» вызвать отладчик и пройтись по памяти контекстным поиском, можно обнаружить тот заветный buff , а остальное уже дело техники!
Итак, приступим (мы еще не знаем, во что мы ввязываемся, — но, увы, в жизни все сложнее, чем в теории). На этот раз запустим passCompare1. exe отдельно от отладчика. Затем подключимся к процессу из отладчика («Attach to process» в WinDbg). Обрати внимание: в окне выбора процесса отображаются все запущенные процессы и для каждого из них выводится его разрядность в столбце Platform. Вводим любой пришедший на ум пароль (например, KPNC Kaspersky++ ), пропускаем возмущенный вопль Wrong мимо ушей и в отладчике нажимаем Break (сочетание клавиш Alt-Del).

Попробуем отыскать в памяти введенный пароль:
0: 004> s — a 0x0 L? 0x7FFFFFFFFFF «KPNC Kaspersky»
Пояснения
Первый параметр после команды s — флаг -a — определяет цель поиска как набор ASCII-символов. Второй параметр — смещение, по которому начать искать. Вообще‑то начинать поиск с нулевого смещения — идея глупая. Судя по карте памяти, здесь расположен служебный код и искомого пароля быть не может. Впрочем, это ничему не вредит, и так гораздо быстрее, чем разбираться, с какого адреса загружена программа и откуда именно начинать поиск.
Третий параметр — верхний предел поиска, то есть докуда надо искать. Так как в 64-битной Windows адресное пространство процесса ограничено 8 Тбайт, верхний лимит составляет 0x7FFFFFFFFFF . Последний параметр — собственно искомая строка. Обрати внимание, что мы ищем не всю строку, а только ее часть ( KPNC Kaspersky++ против KPNC Kaspersky ). Это позволяет избавиться от ложных срабатываний, возникающих из‑за ссылок на внутренние буфера.
Результат
0000002f10effe30 4b 50 4e 43 20 4b 61 73- 70 65 72 73 6b 79 2b 2b KPNC Kaspersky++
000001dcd30f2580 4b 50 4e 43 20 4b 61 73- 70 65 72 73 6b 79 2b 2b KPNC Kaspersky++
Целых два вхождения! Почему два? Предположим, что при чтении ввода с клавиатуры символы сперва попадают в системный буфер, который и дает ложное срабатывание. Тем не менее не ставить же, не разобравшись, сразу обе точки останова. В данном случае четырех отладочных регистров процессора хватит, а как быть, если бы мы нашли десяток вхождений?
Да и в двух бряках немудрено заблудиться с непривычки! Как отфильтровать помехи?
Начинаем думать головой
На помощь приходит карта памяти — зная владельца региона, которому принадлежит буфер, можно очень многое сказать об этом буфере. Наскоро набив уже знакомую команду ! dh passCompare1 , мы получим приблизительно следующее (выбраны сведения только о секциях . data и . rdata ):
SECTION HEADER #2
. rdata name
101C virtual size
2000 virtual address
1200 size of raw data
1400 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
40000040 flags
Initialized Data
( no align specified)
SECTION HEADER #3
638 virtual size
4000 virtual address
200 size of raw data
2600 file pointer to raw data
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
C0000040 flags
Initialized Data
( no align specified)
Read Write
Заодно определим базовый адрес модуля приложения: lmf m passCompare1 (в моем конкретном случае он равен 0x7ff7d78f0000 , а у тебя значение, скорее всего, будет другим). Узнаем, куда в памяти загружена секция . rdata :
0x7ff7d78f0000 + 0x2000 == 0x7ff7d78f2000
И куда загружена секция . data :
0x7ff7d78f0000 + 0x4000 == 0x7ff7d78f4000
Это гораздо выше найденных адресов расположения буферов с введенным паролем. Следовательно, найденные адреса не указывают в области . data и . rdata .
Думаем дальше. Адрес 0x1dcd30f2580 выходит далеко за пределы ломаемого приложения, и вообще непонятно, чему он принадлежит. Почесав затылок, мы вспомним о такой «вкусности» Windows, как куча (heap). С помощью команды ! heap посмотрим, где она начинается:
0: 004> !heap
Heap Address NT/ Segment Heap
1dcd30e0000 NT Heap
1dcd2fd0000 NT Heap
Из этого заключаем, что адрес 0x1dcd30f2580 явно находится в куче.
Разбираемся дальше. Поскольку стек растет сверху вниз (то есть от старших адресов к младшим), адрес 0x2f10effe30 явно находится в стеке. Уверенность подогревает тот факт, что большинство программистов размещает буфера в локальных переменных, ну а локальные переменные, в свою очередь, размещаются компилятором в стеке.
Ну что, попробуем поставить бряк по первому адресу?
0: 004> ba r4 0x2f10effe30
На втором запросе пароля снова вводим KPNC Kaspersky++ . Жмем Enter и дожидаемся сиюминутной активации отладчика. Бряк произошел на второй из этих строк:
00007ffb`5d3c4ffc 8806 mov byte ptr [ rsi], al
00007ffb`5d3c4ffe 48ffc6 inc rsi
00007ffb`5d3c5001 4889742428 mov qword ptr [ rsp+28h], rsi
Смотрим, что находится в регистре rsi :
0000002f`10effe30 434e504b 73614b20 73726570 2b2b796b KPNC Kaspersky++
Впрочем, этого и следовало ожидать. Попробуем выйти из текущей функции по Shift-F11. И мы снова попадем на эту же строку. Вновь посмотрим содержимое этого регистра:
0000002f`10effe31 20434e50 7073614b 6b737265 0a2b2b79 PNC Kaspersky++
Ага, один символ откусан. Следовательно, мы находимся в сравнивающей процедуре. Выйдем из нее нажатием на F5, так как при нажатии на Shift-F11 мы перейдем на следующую итерацию перебора символов.
00007ffb`5d37566e 77c8 ja ucrtbase!strcmp+0x8 (7ffb5d375638)
00007ffb`5d375670 488b01 mov rax, qword ptr [rcx]
00007ffb`5d375673 483b040a cmp rax, qword ptr [rdx+rcx]
00007ffb`5d375677 75bf jne ucrtbase!strcmp+0x8 (7ffb5d375638)
И вот мы в теле уже хорошо нам знакомой (развивай зрительную память!) процедуры сравнения оригинального и введенного пользователем паролей. На всякий случай для пущей убежденности выведем значение указателей [ RDX+RCX] и RCX , чтобы узнать, что с чем сравнивается:
0: 000> dc [RDX+RCX]
00007ff7`d78f2280 4f47796d 6170444f 6f777373 000a6472 myGOODpassword..
0: 000> dc RCX
0000002f`10effe30 434e504b 73614b20 73726570 2b2b796b KPNC Kaspersky++
Как раз то, что мы ищем!
Ну а остальное мы уже проходили. Записываем адрес условного перехода (ключевую последовательность для поиска), с помощью сведений из прошлой статьи находим на носителе адрес инструкции, соответствующей спроецированной в памяти, правим исполняемый файл, и всё окей.
Выводы
Итак, мы познакомились с одним более или менее универсальным способом взлома защит, основанных на сравнении пароля (позже мы увидим, что он подходит и для защит, основанных на регистрационных номерах). Его основное достоинство — простота. А недостатки. недостатков у него много:
- если программист очистит буфера после сравнения, поиск введенного пароля ничего не даст, разве что останутся системные буфера, которые так просто не затрешь, но отследить перемещения пароля из системных буферов в локальные не так‑то легко;
- служебных буферов много, и очень трудно определить, какой из них «настоящий». Программист же может располагать буфер и в сегменте данных (статический буфер), и в стеке (локальный буфер), и в куче, и даже выделять память низкоуровневыми вызовами типа VirtualAlloc или. да мало ли как разыграется его фантазия. В результате подчас приходится просеивать все найденные вхождения тупым перебором.
Способ 2. Бряк на функции ввода пароля
Взлом приложения с GUI
Настала пора разнообразить наш объект взлома. Теперь попробуем заломить приложение с графическим интерфейсом. В качестве тренировки разберем passCompare3 . Это то же самое, что и passCompare1. exe , только с графическим интерфейсом на основе MFC Dialog Based App (ищи в скачиваемых материалах к статье).

Также обрати внимание на то, что работа с текстом в этом примере организована по‑другому. Если раньше мы работали с базовым типом char, то здесь используется обертка — класс CString, что, скорее всего, при взломе профессиональных приложений будет встречаться нам чаще. Кроме двух кнопок, идущих в заготовке по умолчанию, добавь на форму элемент Edit Control. Свяжи его с переменной m_password и создай событие обработки нажатия на кнопке OK. Это и будет ключевая процедура приложения, проверяющая введенный пароль на равенство эталонному:
const CString PASSWORD = _T ( «myGOODpassword» ) ;
void CpassCompare3Dlg : : OnBnClickedOk ( )
CString str = NULL ;
m_password . GetWindowText ( str ) ;
if ( PASSWORD . Compare ( str ) )
MessageBox ( _T ( «Wrong password» )) ;
m_password . SetSel ( 0 , — 1 , 0 ) ;
MessageBox ( _T ( «Password OK» )) ;
CDialogEx : : OnOK () ;
Кажется, никаких сюрпризов не предвидится.
При всем желании метод прямого поиска пароля в памяти элегантным назвать нельзя, да и практичным тоже. А собственно, зачем искать сам пароль, спотыкаясь о беспорядочно разбросанные буфера, когда можно поставить бряк непосредственно на функцию, его считывающую? Можно и так. да вот угадать, какой именно функцией разработчик вздумал читать пароль, вряд ли будет намного проще.
На самом деле одно и то же действие может быть выполнено всего лишь несколькими функциями и их перебор не займет много времени. В частности, содержимое окна редактирования обычно добывается при помощи либо функции GetWindowTextW (чаще всего), либо функции GetDlgItemTextW (а это значительно реже). Все версии Windows NT предпочитают работать с юникодом, поэтому на конце функций работы с текстом W (wide), а не A (ASCII).
Раз уж речь зашла об окнах, запустим наш GUI «крякмис» и установим точку останова на функцию GetWindowTextW — bp User32! GetWindowTextW . Хотя эта функция системная, точка останова не будет глобальной и не затронет все приложения в системе, а будет функционировать только в контексте данного приложения.
Вводим какой‑нибудь пароль ( KPNC Kaspersky++ , по обыкновению), нажимаем клавишу Enter, и отладчик незамедлительно всплывает:
Источник: xakep.ru
Как узнать чем защищена программа
Trial-Reset
Текущая версия: 4.0 Final (Public)

в арсенале каждого триальщика нужно иметь все версии Trial-Reset,
как минимум от 3.0 RC06 и по последнюю, ибо каждая из версии находит свой триальный ключик. Например, мне не помогла 3,3 и 3,2 а только 3,0 а чтобы продолж. триал в еще одной прогр. — 3,0 RC7
умолчу об программах, которые были подопытными у меня, так как разрабатывали их не то что бы близкие знакомые, но все же
а сдесь пустить на расстерзание — будет слишком жестоко.
Если я не прав — так это к лучшему, но все же — что Вам стоить попробывать просканировать несколькими из разных версий (от 3,3 и до рц06) БУДУТ ли находится еще ключики после чистки версиеи 3,3
Цитата:
| А если я сейчас затру все ключи, то половина программ, установленных у меня, перестанут работать. |
ну это очень наврятли.
а вот регистрация на зареганные проги, использующие протектор, что ты почистил, скорее всего слетит.
Юзай Otions -> Auto Buckup
Эта же версия раньше работала нормально.
Может ей чего-то не хватает: службы включенной или файла какого-нибудь?
| Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 |
Источник: forum.ru-board.com
Как узнать, безопасен ли файл APK?
Устройства Android безопасны в использовании, особенно когда дело доходит до загрузки приложения. Google Play — самый безопасный способ загрузить любое приложение на свой телефон. Но, помимо этого, если вы хотите использовать файл APK для того же, тогда рекомендуется проверить APK на наличие вирусов, выполнив несколько простых проверок, чтобы сохранить ваш телефон и данные от любого потенциального вреда. В этой статье мы обсудим, как проверить, безопасно ли запускать APK на вашем телефоне.
Способы проверить, безопасен ли файл APK
VirusTotal

Этот веб-сайт позволяет загружать файлы APK, чтобы проверить APK на наличие вирусов. Это один из самых популярных веб-сайтов для проверки файлов Android. Веб-сайт — это универсальное решение для вас, если вы хотите проверить APK размером менее 128 МБ. Если ваш файл больше этого размера, у вас есть другие варианты.
Он известен быстрой проверкой APK на вирусы, черви, трояны и почти все виды вредоносных программ. Чтобы использовать VirusTotal, выполните следующие действия.
Программы для Windows, мобильные приложения, игры — ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале — Подписывайтесь:)
Нажмите на опцию «Выбрать файл»
Выберите свой файл в диалоговом окне браузера.
Нажмите на «Сканировать»
Устройтесь поудобнее и дождитесь результатов
NViso ApkScan
Еще один популярный веб-сайт для проверки APK — это NViso ApkScan. Если вам нужен подробный отчет о вашем APK-файле и размер файла большой, тогда NViso ApkScan — правильный выбор. Это очень быстрый и простой инструмент, который может удовлетворить все ваши требования. Следуйте пошаговым инструкциям, чтобы использовать его.
Перетащите файл APK и зайдите на сайт
Нажмите «Сканировать пакет».
Если вы хотите покинуть сайт и получить отчет на свою электронную почту, отметьте «Электронный ящик» и введите свой адрес электронной почты. Результаты вашего сканирования будут отправлены вам на почту. Отчет представляет собой подробный отчет со всей необходимой информацией, начиная с размера файла и заканчивая разрешениями, которые запрашивает приложение, и многим другим.
Хэш-дроид
Еще один способ проверить безопасные сайты APK — это проверить его хэш. Это то, что вы можете назвать цифровым отпечатком файла, который вы пытаетесь загрузить. Это позволяет вам сравнивать SHA вашего APK-файла с другими. Если оба SHA совпадают, это означает, что ваш файл безопасен для загрузки. Следуйте инструкциям ниже, чтобы использовать Hash Droid.
Найдите и установите приложение «Hash Droid» из Google Play.
Нажмите «Хешировать файл».
Выберите «Выбрать хеш» из вариантов.
Далее выбираем SHA-256
Выберите свой APK-файл
Это покажет хеш-данные вашего APK в виде длинной строки. Теперь сравните этот хеш с тем, который был опубликован издателями приложения.
Вот и все. Эти три метода являются наиболее популярными и простыми в использовании приложениями, когда дело доходит до проверки APK на наличие вирусов и безопасных сайтов APK. За процессами также легко следить, поэтому теперь вы можете быть уверены в том, что загружаете, и обезопасить свой телефон и свои данные от любого потенциального риска.
Источник: vgev.ru