Изменение определенных значений конфигурации на экранной клавиатуре Windows 7

4910
fnst

Я должен использовать экранную клавиатуру Windows 7 для набора текста:

(Если вы еще не использовали его, вы можете получить его через: Все программы -> Стандартные -> Удобство доступа -> Экранная клавиатура

или просто ищите "osk.exe")

На экранной клавиатуре

Он предлагает функцию "парить" о кнопках. Microsoft описывает это следующим образом:

В режиме зависания вы используете мышь или джойстик для указания клавиши в течение предопределенного периода времени, и выбранный символ печатается автоматически.

Есть моя конкретная проблема. Предопределенный период времени слишком долго, чтобы быть полезным для меня. Минимальное время составляет 0,5 секунды (максимум 3 секунды).

Есть ли способ изменить это значение на что-то < 0,5? Например через редактирование реестра?

Редактировать: запись HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodне может быть установлена ​​ниже 500 мс.

Редактировать (2): Я думаю, что единственный способ решить мою проблему, это декомпилировать .exe (я полагаю, он написан на C или?) И изменить минимальное время. Затем я должен скомпилировать его снова. Эта процедура даже выполнима? Какие вещи могут потерпеть неудачу?

Любой полезный совет будет здорово!

9
Перекомпиляция будет трудной задачей, она будет: 1) в основном нечитаемой (даже если вы используете символы Microsoft) и 2) вы не знаете, где она выполняет эту проверку, поэтому вы можете обойтись, если найдете переменную, присвоенную 500 или 0,5, но тогда вам все равно придется отслеживать путь, по которому он течет, и 3) вам все равно нужно перекомпилировать все это, что зачастую невозможно из-за плохой декомпиляции. К сожалению, отладка также невозможна, если у вас нет кабеля отладки и подключите компьютер к другому ... Tom Wijsman 12 лет назад 1
Я думаю, что было бы разумно просто оставить все как есть. Один персонаж каждые полсекунды не так уж и плох, и если он станет слишком быстрым, начнут появляться ошибки. cutrightjm 12 лет назад 0
Поскольку я не могу удобно редактировать свой комментарий к этому сообщению, это может помочь некоторым людям, знающим C # или другие языки, написать патч для этого: http://www.daniweb.com/hardware-and-software/microsoft-windows/ нитей / 4548 / использование-заместитель на экране-клавиатуры cutrightjm 12 лет назад 0
@fnst: Если вы действительно заинтересованы в скорости, рассмотрите [Dasher] (http://www.inference.phy.cam.ac.uk/dasher/). Я обрисую это в своем ответе ... Tom Wijsman 12 лет назад 0
@ekaj: насколько я могу судить, это просто встраивает приложение. Можете ли вы сказать нам, как это поможет? Tom Wijsman 12 лет назад 0
Можете ли вы использовать другое приложение, например [this] (http://hot-virtual-keyboard.com/multi-touch/), или оно должно быть osk.exe? Jeremy W 12 лет назад 0
У меня есть связанный вопрос http://stackoverflow.com/questions/14157885/mfc-on-screen-keyboard-when-focusing-editable-control, в частности проблема 3. sergiol 11 лет назад 0

4 ответа на вопрос

7
Tom Wijsman

Где в коде он находит наш ключ?

Используя Process Monitor, копаясь в для события ETL, считывающего, что трассировка стека значений дает нам:

"Frame","Module","Location","Address","Path" ... "3","ntdll.dll","NtQueryValueKey + 0xa","0x7fbce17344a","C:\Windows\SYSTEM32\ntdll.dll" "4","KERNELBASE.dll","LocalBaseRegQueryValue + 0x15d","0x7fbcb1a3e1d","C:\Windows\system32\KERNELBASE.dll" "5","KERNELBASE.dll","RegQueryValueExW + 0xe9","0x7fbcb1a3c19","C:\Windows\system32\KERNELBASE.dll" "6","ADVAPI32.dll","RegQueryValueExWStub + 0x1e","0x7fbcba412fe","C:\Windows\system32\ADVAPI32.dll" "7","osk.exe","OSKSettingsManager::GetOskSetting + 0xc7","0x7f72356057f","C:\Windows\System32\osk.exe" "8","osk.exe","OSKSettingsManager::Initialize + 0x6e","0x7f72355ffe2","C:\Windows\System32\osk.exe" "9","osk.exe","OSKSettingsManager::GetOSKSettingsManager + 0x64","0x7f72355fee4","C:\Windows\System32\osk.exe" "10","osk.exe","COskNativeHWNDHost::DetermineOSKWindowSizeAndLimits + 0x5a","0x7f72355d4fa","C:\Windows\System32\osk.exe" "11","osk.exe","COskNativeHWNDHost::Initialize + 0xaa","0x7f72355d28e","C:\Windows\System32\osk.exe" "12","osk.exe","PresentOSK + 0x112","0x7f723557882","C:\Windows\System32\osk.exe" "13","osk.exe","wWinMain + 0x356","0x7f723557f16","C:\Windows\System32\osk.exe" "14","osk.exe","operator new[] + 0x37a","0x7f723564b12","C:\Windows\System32\osk.exe" "15","KERNEL32.DLL","BaseThreadInitThunk + 0x1a","0x7fbcd24298e","C:\Windows\system32\KERNEL32.DLL" "16","ntdll.dll","RtlUserThreadStart + 0x1d","0x7fbce19e229","C:\Windows\SYSTEM32\ntdll.dll" 

Мы можем видеть, что OSKSettingsManager::GetOskSettingсчитывает значение.

Итак, как выглядит эта часть? Можем ли мы отладить это?

Рассматривая эту функцию с помощью WinDBG, он получает доступ к этому разделу реестра прямо перед этим 000007f7 23560517.

osk!OSKSettingsManager::GetOskSetting: ... 000007f7`2356050e ff15440bfeff call qword ptr [osk!_imp_RegOpenKeyExW (000007f7`23541058)] 000007f7`23560514 448bd8 mov r11d,eax 000007f7`23560517 85c0 test eax,eax 000007f7`23560519 751f jne osk!OSKSettingsManager::GetOskSetting+0x82 (000007f7`2356053a) 000007f7`2356051b 488b0b mov rcx,qword ptr [rbx] ... 

Теперь проблема в том, что когда я пытаюсь установить точку останова в этом месте, я больше ничего не могу набрать, потому что osk.exeдобавляется в драйверы ввода. Это легко увидеть, удерживая клавишу-модификатор, как Altна клавиатуре, и она загорается osk.exe.

Просматривая код для дополнений или вычитаний, я вижу только то, что происходит с 40шестнадцатеричным, который является 64десятичным. Так что это тоже ничего не связано с числом.

Это может быть в одной из четырех cmp(сравнить) инструкций, но для этого потребуется отладочная информация. Или это может произойти в целом с более высокой функцией, что потребует более тщательного изучения. Но без возможности отладки без потери возможностей ввода это очень сложно сделать ...

Похоже, что для поиска правильного места потребуется кабель отладки, поскольку компьютер, на котором вы отлаживаете, теряет свои возможности ввода или работает слишком медленно из-за накладных расходов на отладку. Поскольку у меня в настоящее время нет ноутбука с портом 1943 года, я не могу сделать это самостоятельно. Он мог бы сделать это, и да, он буквально заморозил бы вашу ОС. Отладка ОС вместо приложения - это весело ... ^^

Подождите, у нас есть доступ к символам! Можем ли мы найти оскорбительный код?

OSKSettingsManager::ClearTransferKey(void) OSKSettingsManager::GetOSKSettingsManager(OSKSettingsManager * *) OSKSettingsManager::GetOskSetting(ulong,ulong *) OSKSettingsManager::GetOskSetting(ulong,ulong *,int) OSKSettingsManager::Initialize(void) OSKSettingsManager::NotifyListeners(ulong,ulong) OSKSettingsManager::RegisterListener(void (*)(ulong,ulong)) OSKSettingsManager::SQMStartupSettings(void) OSKSettingsManager::SetOskSetting(ulong,ulong) OSKSettingsManager::SetOskSetting(ulong,ulong,int) OSKSettingsManager::_HandleUpdateAllListeners(void) OSKSettingsManager::_KeepSettingValueInBounds(ulong,ulong *,int) OSKSettingsManager::`scalar deleting destructor'(uint) 

Присмотревшись, вы заметите оскорбительную функцию:

OSKSettingsManager::_KeepSettingValueInBounds(ulong,ulong *,int) 

Если мы пройдемся по этой функции, то сначала увидим:

mov edi, edi push ebp mov ebp, esp mov eax, [ebp+arg_4] imul eax, 14h cmp dword_4B7598[eax], 0 jz short loc_41BC36  

Хорошо, это сравнивает что-то, а затем переходит в другое место. Что там?

pop ebp retn 8 

Таким образом, если условие решит, что оно должно перейти, оно просто выйдет из функции и ничего не изменит.

Итак, как нам сделать так, чтобы она всегда оставляла функцию?

Измените jzинструкцию на jmpинструкцию, которая всегда выполняет переход, вы можете найти ее с относительным смещением 41BC10. Если ваша программа рассчитывает разные смещения, вам нужно знать, что она использует 401000в качестве основы, поэтому вычитание дает нам абсолютное смещение 1AC10.

Обратите внимание, что изменение 74( JZ) в шестнадцатеричном редакторе на E9( JMP) не будет работать. Вы не можете сделать это в шестнадцатеричном редакторе, вам нужно что-то, что разбирает и повторно собирает код, но это не всегда легко найти (например, IDA Professional, за который люди фактически платят, не может произвести надлежащий код на c или исполняемый файл). OllyDBG, обычно используемая в сообществе патчей, не может даже открыть исполняемый файл.) И даже тогда, Microsoft может защищать свой исполняемый файл от несанкционированного доступа, потому что это может быть рассмотрено против EULA; удачи!

Мех! Это сложно, я просто хочу быстро набрать мышью / глазами / ...

Вы должны обязательно проверить Dasher, который намного быстрее, чем экранная клавиатура. Это просто работает, перемещая вашу мышь к буквам; Горизонтальное движение определяет скорость, а вертикальное движение выбирают буквы. Благодаря встроенному словарю он может даже определить размер наиболее вероятных букв, он также пытается извлечь уроки из вашего движения, чтобы скорость и буквы действительно привыкли к вашему использованию.

Изображение говорит более тысячи слов ...

Конечно, это довольно мало и не очень быстро, как в примере, но вы можете изменить его размер, чтобы он находился с правой стороны экрана, чтобы он не мешал вашему экрану. Это позволяет печатать так быстро, как вы можете ...

Вот хороший пример того, как прогнозы позволяют быстрее набирать любой язык:

Также обратите внимание, что буквы справа сортируются в определенном порядке, так что основное направление (вверх, в середине или вниз) выбирает между различными типами (строчные, прописные, цифры и знаки пунктуации); и затем в пределах такого основного направления ваше второстепенное направление будет выбирать между AZ, az, 0-9 и так далее. Я использовал это в прошлом и был действительно поражен тем, насколько свободно это по сравнению с другими конкурентами ...

Также обратите внимание, что Dasher имеет некоторую конфигурацию, так что вы можете настроить то, что вам не нравится.

@harrymc: Если вы читали `Using Process Monitor, копаясь в событии ETL, считывая, что трассировка стека значений дает нам:` вы бы знали, что я проверил трассировку стека для события ETL. Я полагаю, вы говорите здесь о своих собственных ответах? Из-за того, что вы отвечаете с большим количеством, вашим ответам не хватает качества. Подумайте об улучшении и / или удалении ваших ответов вместо размещения быстрых и грязных ответов или глупых комментариев, которые не направлены на улучшение вопросов и ответов; Вы можете догадаться, какой подход поможет сообществу больше всего ... Tom Wijsman 12 лет назад 0
@harrymc: (1) Где это говорит, что я * взламываю *? Я просто показываю отправную точку, я не ошибся и показал, что для продолжения работы необходимо дополнительное оборудование или домашнее задание. Качество в моем ответе, количество должно быть сделано читателем или когда я сталкиваюсь с удаленной установкой отладки. (2) Googling Process Monitor и WinDBG - не ракетостроение. (3) Спасибо за комплимент, возможно, я должен объяснить, как сборка работает в моем ответе тоже? Tom Wijsman 12 лет назад 1
@harrymc: Мой ответ - хорошая отправная точка. Ваша ошибка заключается в том, что вы не предоставили достаточно подробностей, о чем свидетельствуют ваш ответ и комментарии в этом вопросе. Вы просто сочли необходимым разместить еще один комментарий, который не имеет целью улучшить мой ответ или не говорит о том, что с ним не так, потребуется * вам * еще немного времени, чтобы опубликовать ответ, который показывает усилие, а не * слишком родовое *. Я не понимаю, как ваша `Декомпиляция помогает. После того, как вы обнаружите, вы должны исправить двоичный код. Это полезно, я бы предпочел сверхдлинные и домашние упражнения вместо того, чтобы почесать волосы ... Tom Wijsman 12 лет назад 0
@harrymc: Вы предполагаете, что это общего назначения; но, если бы вы проверили его ссылки и зависимости, вы бы увидели, что он не разрушает поведение после перезаписи собственной конфигурации, которая загружается исключительно из этого раздела реестра. Я проверил его ссылки и зависимости, поэтому я знаю использование. Вы тоже собираетесь удалить свой последний комментарий? ;) Tom Wijsman 12 лет назад 0
Если вы действительно взломали его, то вы всего в нескольких минутах от создания пропатченного оска. Почему бы не закончить работу и позволить судье плаката? harrymc 12 лет назад 0
@harrymc: Ваш комментарий показывает, что вы не читали. Почему бы не закончить свой ответ и не дать судье плаката? Tom Wijsman 12 лет назад 0
@ TomWijsman: Как заставить вызовы функций отображаться в формате «OSKSettingsManager :: Initialize + 0x6e», пожалуйста? Я имею в виду, чтобы увидеть имена функций. Даже после загрузки символов x64 и x86 из Microsoft я вижу записи в формате "osk.exe + 0xc1ec"! Я вижу это в Свойствах события (Окно)> Стек (вкладка)> Местоположение (столбец). Это место, где вы получили записи, которые вы разместили здесь? Я пытаюсь решить проблему 3 из http://stackoverflow.com/questions/14157885/mfc-on-screen-keyboard-when-focusing-editable-control Спасибо sergiol 11 лет назад 0
@sergiol: http://support.microsoft.com/kb/311503 `SRV * ваша локальная папка для символов * http: // msdl.microsoft.com / download / symbols` Tom Wijsman 11 лет назад 0
2
harrymc

Боюсь, что большинство декомпиляторов не дадут достаточно хорошего результата, который можно перекомпилировать.

Декомпиляция может помочь только точно определить область, которая HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodиспользуется, чтобы выяснить, где это значение считывается и где применяется ограничение в 500 мс.

После обнаружения вы должны исправить двоичный код, чтобы отключить тест и установить HoverPeriod меньшим. Исправление двоичного файла гораздо более осуществимо, чем перекомпиляция.

Возможно, вам придется повторить попытку, если файл osk.exe когда-либо будет заменен Центром обновления Windows (чего я не ожидаю).

[РЕДАКТИРОВАТЬ]

Чтобы помочь вам в дальнейшем, вот несколько слов об утилитах и ​​их использовании.

Вы можете использовать C-декомпилятор или дизассемблер. Более поздний тип может быть более полезным, хотя он требует некоторых небольших знаний о наборе инструкций Intel. Вам также понадобится хороший шестнадцатеричный редактор, и есть некоторые, которые рекламируют возможности дизассемблера (см. Ссылку ниже).

Проект Fenris объявляет себя «набором инструментов, подходящих для анализа кода, отладки, анализа протоколов, анализа, криминалистики, диагностики, аудита безопасности, исследования уязвимостей и многих других целей». Звучит хорошо и рекомендуется многими, но у меня нет опыта с этим.

Декомпилятор REC Studio пытается создать C-образное представление кода и данных, используемых для создания исполняемого файла.

Boomerang - это общий, открытый исходный код, восстанавливаемый декомпилятор программ машинного кода.

Еще много таких утилит можно найти в Google, или в:

wikibooks x86 Инструменты для разборки / анализа
wikibooks x86 Разборка / Разборщики и декомпиляторы
Открыть каталог: дизассемблеры

Предварительный шаг - разобрать оск. Результирующий листинг может быть объемным и требовать хорошего текстового редактора (обычно достаточно notepad ++).

Поиск строки «HoverPeriod» (без учета регистра). Если вам повезло, дизассемблер определил ее как строку, и вы можете найти ее как есть. Если нет, вам нужно будет искать его побайтово. В виде строки Unicode будет выглядеть, H,0,o,0,v,0...где буквы должны быть заменены их числовыми кодами.

Как только вы нашли строку «HoverPeriod», дизассемблер должен был разместить метку где-нибудь перед ней. Используйте имя этой сгенерированной метки, чтобы найти, где она используется, чтобы определить, где она получена из реестра и в какой глобальной переменной хранится результат.

Как только вы нашли переменную, которая содержит счетчик, найдите, где он используется. Что вы будете делать, зависит от формата кода, который вы найдете. Затем вы можете выбрать нужный вам патч.

Например, вы можете использовать шестнадцатеричный редактор для замены в osk.exe такой команды, как:

move AX,<HoverPeriod milliseconds count variable> 

в

mov AX,200 (your count of 200 milliseconds) 

Будьте осторожны с различными длинами команд, где, если новая команда короче, ее необходимо дополнить однобайтовыми инструкциями NOP (без операций) до длины старой инструкции.

Поиск команды для исправления в osk.exe может потребовать поиска, если смещения, которые дает дизассемблер, находятся в коде, а не в exe-файле. Если шестнадцатеричный редактор не поддерживает поиск на ассемблере, выполните дизассемблирование, перечисляя оригинальные байты инструкции, чтобы вы знали, какие двоичные байты искать. Избегайте поиска инструкций, которые содержат адреса, так как адреса могут быть перемещены в exe, поэтому ищите последовательность байтов рядом с такой инструкцией.

Вы можете создать новые байты патча прямо в шестнадцатеричном редакторе, если он поддерживает ассемблер. Или, если это не так, и вы не чувствуете себя комфортно с машинным кодом Intel, найдите ассемблер для компиляции вашего нового кода и используйте его список, чтобы получить скомпилированные байты для исправления.

Изменение значения не будет работать, если оно перезаписано более общей функцией. Изменение каждого значения, полученного из реестра, приведет к поломке приложения. Смотрите мой ответ для этой общей функции. В результате шестнадцатеричный редактор не будет работать, поэтому все сводится к поиску правильного (де) ассемблера (или [де] компилятора). Tom Wijsman 12 лет назад 0
1
minya

Могу ли я предложить использовать AutoIt для автоматизации нажатия?

Идея состояла бы в том, чтобы контролировать холостой ход мыши, когда курсор находится в экранном окне (например, в цикле управления, проверять с регулярным интервалом, изменился ли курсор), и автоматически щелкать (вызывать функцию SendClick) после, скажем, 100 мс бездействия.

Бьет обратный инжиниринг .exe.

+1 для превращения «Мне нужно, чтобы он щелкнул быстрее» в «Я позволил ему щелкать быстрее умным способом». Tom Wijsman 12 лет назад 0
0
Pwdr

Может быть, вам не нужно все перекомпилировать. В игровом мире принято использовать тренажеры, которые манипулируют значением в памяти при запуске программы. Если вы найдете минимальное значение в памяти (0,5) и запрограммируете что-то вроде загрузчика, чтобы уменьшить это число, это может сработать.

Это может сработать, только если значение находится в том же месте или значение Xth, которое имеет это значение. В любом случае, T Search и Quick Memory Editor - два приятных инструмента, с которыми можно попробовать это. Возможно, вы захотите искать `500` вместо этого, так как он загружает его, а не как float. Tom Wijsman 12 лет назад 0
При первой попытке выясняется, что `osk.exe` отсутствует в списке процессов. Это потому, что он запускается в контексте `winlogon`, так что он работает для всех пользователей, вы можете обойти это, запустив редактор памяти в контексте` winlogon`. Tom Wijsman 12 лет назад 0
См. Http://stackoverflow.com/questions/9868079/running-a-process-with-gui-on-windows-xp-logon-screen-net-pinvoke и http://stackoverflow.com/a/3143055/47064 для такого подхода проще всего заменить `osk.exe`, но это будет работать только в том случае, если вы создадите панель запуска, которая запускает как редактор памяти, так и резервную копию` osk.exe`. Но тогда вам придется учитывать, что загрузчик тоже должен это делать. Кажется, что это решение становится таким же трудным, как и разборка и сборка, `osk.exe` сложно ... :) Tom Wijsman 12 лет назад 0

Похожие вопросы