Эмуляция для поддержки приложений x86 — это новая функция, созданная для Windows в Arm64. Иногда эмуляция выполняет оптимизации, которые не повышают удобство работы. Можно использовать средство устранения проблем с совместимостью программ для переключения параметров эмуляции для вашего приложения x86, уменьшая число оптимизаций по умолчанию и потенциально повышая совместимость.
Запуск средства устранения проблем с совместимостью программ
Средство устранения неполадок совместимости программ запускается вручную на любом компьютере с Windows: щелкните правой кнопкой мыши исполняемый файл (.exe) и выберите «Устранение неполадок совместимости». Отобразится следующий экран.
Если щелкнуть Устранение неполадок программы, отобразятся следующие варианты.
Программы на русском языке — 02/03/2023| VTV4
Все параметры позволяют использовать параметры, применимые и применяемые на настольных компьютерах Windows. Кроме того, первый, второй и четвертый варианты применяют параметры эмуляции Отключить кэш приложения и Отключить гибридный режим выполнения.
Переключение параметров эмуляции
Изменение параметров эмуляции может привести к неожиданному завершению работы приложения или невозможности запустить его.
Чтобы переключить параметры эмуляции, нажмите исполняемый файл правой кнопкой мыши и выберите Свойства.
В ARM раздел под названием Windows 10 arm или Windows 11 на ARM будет доступен на вкладке «Совместимость». Чтобы запустить второе окно, нажмите кнопку «Изменить параметры эмуляции».
В этом окне представлены два способа изменения параметров эмуляции. Можно выбрать заранее определенную группу параметров эмуляции или щелкнуть Использовать дополнительные параметры, чтобы обеспечить возможность выбора отдельных параметров.
Сгруппированные параметры эмуляции позволяют уменьшить число оптимизаций производительности в пользу качества. Ниже представлены некоторые сгруппированные параметры, которые можно выбрать.
Выберите Использовать дополнительные параметры, чтобы выбрать отдельные параметры, как описано в этой таблице.
Выключить кэш приложения
Отключить гибридный режим выполнения
Также можно выбрать многоядерные параметры, как показано здесь.
Эти параметры изменяют число барьеров памяти, используемых для синхронизации доступов к памяти между ядрами в приложениях во время эмуляции. Быстро — это режим по умолчанию, однако параметры строго и очень строго увеличивают число барьеров. Это замедляет работу приложения, но уменьшает риск ошибок приложения. Одноядерный вариант устраняет все барьеры, однако заставляет все потоки приложения работать на одном ядре.
Программы на русском языке — 10/05/2023| VTV4
Источник: learn.microsoft.com
Фундаментальные основы хакерства. Осваиваем разные способы поиска защит в программах для x86-64
Чтобы иметь возможность ломать программы, на страже которых стоят хитрые защитные механизмы, нужно уметь эти механизмы находить. В сегодняшней статье мы покажем, как это делают, а в конце разберем пример работы с графическим приложением.
«Фундаментальные основы хакерства»
Перед тобой уже во второй раз обновленная версия цикла «Фундаментальные основы хакерства». В 2018 году Юрий Язев изменил текст Криса Касперски для соответствия новым версиям Windows и Visual Studio, а теперь внес правки с учетом отладки программ для 64-разрядной архитектуры.
Читай также улучшенные версии прошлых статей цикла:
- Учимся анализировать программы для x86-64 с нуля
- Используем отладчик для анализа 64-разрядных программ в Windows
- Находим реальные адреса инструкций в исполняемых файлах x86-64
Все новые версии статей доступны без платной подписки.
Цикл «Фундаментальные основы хакерства» со всеми обновлениями опубликован в виде книги, купить ее по выгодной цене ты можешь на сайте издательства «Солон‑пресс».
В прошлой статье цикла мы узнали, как соотнести адреса байтов в виртуальной памяти с их реальным расположением на носителе. Это потребовало от нас напрячь мозг и применить математику. Между тем, как мы увидели из предыдущих статей, непосредственный взлом, когда известно месторасположение защитного механизма, представляет собой элементарную задачу, которую легко решить с помощью Hiew или другого редактора PE-файлов.
www
Способ 1. Прямой поиск введенного пароля в памяти
Пароль, хранящийся в теле программы открытым текстом, — скорее из ряда вон выходящее исключение, чем правило. К чему услуги хакера, если пароль и без того виден невооруженным глазом? Поэтому разработчики защиты всячески пытаются скрыть его (о том, как именно они это делают, мы поговорим позже).
Впрочем, учитывая размер современных дистрибутиWow, программист может без особого труда поместить пароль в любом завалящем файле, попутно снабдив его «крякушами» — строками, выглядящими как пароль, но паролем не являющимися. Попробуй разберись, где тут липа, а где нет, тем более что подходящих на эту роль строк в проекте средней величины может быть несколько сотен, а то и тысяч!
Давай подойдем к решению проблемы от обратного — будем искать не исходный пароль, который нам неизвестен, а ту строку, которую мы скормили программе в качестве пароля. А найдя, установим на нее бряк, и дальше всё точно так же, как и раньше. Бряк всплывает на обращение по сравнению, мы выходим из сравнивающей процедуры, корректируем JMP и.
Взглянем еще раз на исходный текст ломаемого нами примера 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
Euro Truck Simulator 2 «Редактор Сохранений TS-SE-Tool» [0.3.9.1]
Эта программа создана для редактирования файлов сохранения в игре Euro Truck Simulator 2.
Вы можете:
- Изменить уровень игрока и мастерство;
- Изменить сохраненные цвета для грузовика и трейлера;
- Изменить штаб-квартиру компании и сумму денег на счете;
- Отремонтировать или заправить свой грузовик;
- Поделиться скинами грузовиков;
- Пользовательские цвета;
- Создать заказную работу для рынка грузовых перевозок;
- Внести основные изменения в грузовой рынок;
- Поделиться GPS-координатами и путями, которые могут быть полезны для конвоев.
Информация:
- Необходимо наличие NET Framework 4.6.1.
- Проверено на Windows 10 x64.
- Интерфейс на русском языке.
Версия 0.2.6.1 для Euro Truck Simulator 2 (v1.40.x — 1.41.х):
- Добавлена форма настроек экспорта и импорта
- Обновленный механизм перевода
- Обновленный профиль и выбор сохранения
- Обновленный механизм поиска обновлений
- Обновленные сообщения о сбоях
- Добавлено письмо разработчика
- Обновленная форма «О нас»
- Исправленная база данных (ошибка усечения)
- Исправлена ошибка декодирования шестнадцатеричного кода в строку
- Проверка фиксированной версии
Версия 0.2.6.4 для Euro Truck Simulator 2 (v1.40.x — 1.41.х):
- Исправлено обнаружение ссылок для трейлеров Slave
- Исправлены кнопки Восстановить Визуальная ошибка после переключения сохранения
Версия 0.2.6.5 для Euro Truck Simulator 2 (v1.40.x — 1.41.х):
- Обновлено редактирование денег Acoount
- Исправлена ошибка отрицательных денег
- Фиксированное шестнадцатеричное десятичное преобразование
Версия 0.2.6.6 для Euro Truck Simulator 2 (v1.40.x — 1.41.х):
- Обновленная обработка данных профиля
- Обновлена обработка данных сохранения.
- Клонирование фиксированного профиля
- Исправлена ошибка пустого буфера обмена при импорте CC
Версия 0.2.6.7 для Euro Truck Simulator 2 (v1.40.x — 1.41.х):
- Проверено на 1.42 (версия 56)
- Обновленная библиотека SII_Decrypt с поддержкой 1.42
Версия 0.2.6.8 для Euro Truck Simulator 2 (v1.40.x — 1.41.х):
- Обновлённая обработка данных профиля
- Обновлённая обработка данных сохранения
Версия 0.2.7.0 для Euro Truck Simulator 2 (v1.40.x — 1.41.х):
- Обновленные ссылки для Updater
Версия 0.2.7.1 для Euro Truck Simulator 2 (v1.42.x — 1.43.х):
- Доработка для обновления 1.43
- Обновлено Поддерживаемые версии (только 61)
- Обновленное меню настроек
- Проверка фиксированной версии БД
- Ограниченное облако Steam экономит нагрузку
Версия 0.2.7.2 для Euro Truck Simulator 2 (v1.42.x — 1.43.х):
- Обработка фиксированных чисел с плавающей запятой
Версия 0.2.7.3 для Euro Truck Simulator 2 (v1.42.x — 1.43.х):
- Обновленная функциональность грузовиков для 1.43
- Обновленная функциональность трейлеров для 1.43
- Фиксированная проверка версии базы данных
- Ограничена загрузка старых сохранений (до 1.43)
Версия 0.2.7.4 для Euro Truck Simulator 2 (v1.42.x — 1.43.х):
- Обновлен выпадающий список сохранений, если у сохранения пустое имя сохранения.
- Обновлено чтение и запись GPS
- Обновлены настройки программы Интервал проверки автообновления заставки
Версия 0.2.7.5 для Euro Truck Simulator 2 (v1.42.x — 1.43.х):
- Исправлено Сохранение элементов Ошибки формата данных
- Исправлена ошибка, если аксессуар для грузовика или прицепа отсутствует
Версия 0.3.0.0 для Euro Truck Simulator 2 (v1.42.x — 1.43.х):
- Закончена система сохранения/загрузки для работы с новой системой сохранений
Версия 0.3.5.0 для Euro Truck Simulator 2 (v1.44.x):
- Добавлен Редактор номерных знаков
- Исправлено сохранение элементов ошибки формата данных
Версия 0.3.6.0 для Euro Truck Simulator 2 (v1.44.x):
- Обновленная структура базы данных
- Исправлено сохранение маршрутов в базе данных
- Исправлена проверка доступности файлов шрифтов
- Исправлено Сохранение элементов Ошибки формата данных
Версия 0.3.6.1 для Euro Truck Simulator 2 (v1.44.x):
- Обновленный расчет расстояния на рынке грузовых перевозок и улучшенные названия грузов в списке грузов.
- Обновлен загрузчик текстур DDS.
- Исправлена ошибка, из-за которой средство обновления проверяло рабочее состояние TS SET.
- Очистка и оптимизация
Версия 0.3.7.0 для Euro Truck Simulator 2 (v1.44.x):
- Добавлен редактор транспортных средств для грузовиков.
- Обновлена обработка блоков сохранения.
- Обновлен загрузчик текстур DDS.
- Обновлено Получение запасных безымянных (редактор транспортных средств)
- Исправлена ошибка базы данных из-за неправильной обработки списка вариантов трейлера.
- Исправлена ошибка при ремонте двойныхтройных прицепов
- Очистка и оптимизация
Версия 0.3.7.1 для Euro Truck Simulator 2 (v1.44.x):
- Обновлен менеджер гаража. Изменения могут быть отменены.
- Обновлены выпадающие списки визуального оформления для грузовиков и прицепов.
- Сортировка по типу (быстрая работа, принадлежит пользователю, в списке сортировки), имени гаража и грузовика Фиксированные грузовики, удаленные из гаражей, все еще экспортируются в файл сохранения
Версия 0.3.7.2 для Euro Truck Simulator 2 (v1.44.x):
- Исправлена ошибка записи сохранения, когда выбранным заданием был специальный транспорт.
- Исправлена ошибка, из-за которой функция восстановления из резервной копии не влияла на информационный файл.
Версия 0.3.8.0 для Euro Truck Simulator 2 (v1.45.x):
- Добавлен список водителей на вкладке «Компания» (щелкните правой кнопкой мыши по водителю, чтобы нанять, уволить или изменить)
- Добавлен редактор водителей для ИИ-водителей (навыки).
- Обновлены изображения пользовательского интерфейса
- Исправлена ошибка при проверке наличия водителя игрока в списке сортировки.
Версия 0.3.9.0 для Euro Truck Simulator 2 (v1.47.x):
- Обновлен SII_Decrypt для версии 1.47
- Обновлены блоки сохранения для версии 1.47
- Обновлены внутренние компоненты программы обновления
- Исправлено неправильное центрирование окна
Версия 0.3.9.1 для Euro Truck Simulator 2 (v1.47.x):
- Исправлена ошибка, из-за которой отсутствует Police_offence_log_entry.
Источник: www.playground.ru