Зміна конкретних значень конфігурації на екранній клавіатурі Windows 7


9

Мені потрібно використовувати екранну клавіатуру Windows 7 для введення тексту:

(Якщо ви ще не використовували його, ви можете отримати його за допомогою: Усі програми -> Аксесуари -> Простота доступу -> Екранна клавіатура

або просто шукайте "osk.exe")

Екранна клавіатура

Він пропонує функцію "наведенні" на кнопки. Microsoft описує це як наступне:

У режимі наведення курсора ви використовуєте мишу або джойстик, щоб вказати на клавішу за попередньо визначений період часу, і вибраний символ вводиться автоматично.

Є моя конкретна проблема. Зумовлений період часу занадто довго , щоб бути корисним для мене. Мінімальна кількість часу - 0,5 секунди (максимум 3 секунди).

Чи є спосіб змінити це значення на щось < 0,5? Наприклад, через редагування реєстру?

Редагувати: запис HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodне може бути меншим за 500 мс.

Правка (2): Я думаю, що єдиний спосіб вирішити свою проблему - це декомпілювати .exe (я думаю, це написано на C, або?) Та змінити мінімальний час. Тоді мені доведеться її знову скласти. Чи є ця процедура навіть працездатною? Які речі можуть провалитися?

Будь-яка корисна порада була б чудовою!


1
Перекомпіляція буде важкою справою, це буде 1) здебільшого нечитабельні (навіть якщо ви використовуєте Symbols Microsoft) та 2) ви не знаєте, де це перевірити, щоб ви могли обійти, якщо знайдете змінну, призначену 500 або 0,5, але тоді вам все одно доведеться простежити шлях, де він протікає, і 3) вам все одно доведеться перекомпілювати все, що часто неможливо через погану декомпіляцію. На жаль, налагодження також неможливе, якщо у вас відсутній кабель для налагодження та приєднайте комп'ютер до іншого ...
Tamara Wijsman

Я думаю, було б розумно просто залишити його таким, яким він є. Один символ кожні півсекунди не так вже й погано, і якщо вони стають занадто швидкими, почнуть виникати помилки.
cutrightjm

Оскільки я не можу зручно редагувати свій коментар до цієї публікації, це може допомогти деяким людям, які знають C # або інші мови, написати патч для цього: daniweb.com/hardware-and-software/microsoft-windows/threads/…
cutrightjm

@fnst: Якщо вас дійсно цікавить швидкість, подумайте про Dasher . Я викладу це у своїй відповіді ...
Тамара Війсман

@ekaj: Це просто вбудовує додаток, наскільки я можу сказати. Чи можете ви сказати нам, як це могло б допомогти?
Тамара Війсман

Відповіді:


7

Де в коді знаходиться наш ключ?

Використовуючи Монітор процесів, копаючись до події 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, за який реально платять люди, не може створити належний код коду чи виконуваний файл. OllyDBG, що часто використовується у спільноті патчів, навіть не може відкрити виконуваний файл.). І тоді навіть Microsoft може захищати свій виконуваний файл від підробок, оскільки це може бути розглянуто проти договору EULA; так, удачі!

Мех! Це важко, я просто хочу швидко набрати мишу / очі / ...

Ви обов'язково повинні перевірити Dasher, який швидше, ніж екранна клавіатура. Це просто працює, переміщуючи мишу в бік букв; горизонтальний рух визначає швидкість, а вертикальний рух вибирають літери. Завдяки вбудованому в нього словнику можна навіть розміром найбільш ймовірних букв бути більшим, він також намагається навчитися у вашому русі таким чином, що швидкість та літери дійсно звикли до вашого використання.

Образ говорить більше тисячі слів ...

Звичайно, це досить мало і не дуже швидко, як це є прикладом, але ви можете змінити розмір, щоб він знаходився в правій частині екрана, щоб він не заважав вашому екрану. Це дозволяє вводити так швидко, як ви можете ...

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

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

Також зауважте, що Dasher має певну конфігурацію, тож ви зможете налаштувати щось, що вам не подобається.


@harrymc: Якби ти прочитав, Using Process Monitor, digging into the for the ETL event reading out that value stack trace gives us:ти б знав, що я перевірив слід стека для події ETL. Я думаю, ви тут говорите про власні відповіді? Через те, що відповідати великою кількістю, вашим відповідям серйозно бракує певної якості. Подумайте про вдосконалення та / або видалення своїх відповідей, а не розміщення швидких брудних відповідей або дурних коментарів, які не мають наміру покращувати питання Q&A; Ви можете здогадатися, який підхід допоможе громаді найбільше ...
Tamara Wijsman

1
@harrymc: (1) Де це сказати , що я розтріскування ? Я просто показую тут вихідну точку, я не зазнав невдач, і я показав, що для просування вперед потрібно додаткове обладнання або домашні завдання. Якість відповідає моїй відповіді, кількість повинна бути виконана читачем або коли я натрапив на налаштування віддаленої налагодження. (2) Монітор процесів гуглінгу та WinDBG - це не ракетна наука. (3) Дякую за комплімент, можливо, я повинен пояснити, як працює збірка і в моїй відповіді?
Тамара Війсман

@harrymc: Моя відповідь є гарною відправною точкою. Ваша помилка полягає в тому, що ви не надаєте достатньо детальних даних, про що свідчить і ваша відповідь, і коментарі в цьому запитанні. Щойно ви вважаєте за потрібне розмістити ще один коментар, який не має наміру покращити мою відповідь або не розповісти, що з цим не так, знадобиться ще трохи часу, щоб викласти відповідь, яка показує зусилля, а не надто загальна . Я не бачу, наскільки The decompilation help. Once located, you should patch the binary code.це корисно, я вважаю за краще ультра-довгі та домашні вправи замість
вичісування

@harrymc: Ви припускаєте, що це загальне призначення; але, якби ви перевірили його посилання та залежності, ви б побачили, що це не руйнує жодну поведінку, що перезаписала власну конфігурацію, що завантажується виключно з цього ключа реєстру. Я перевірив його посилання та залежності, тому знаю використання. Ви також збираєтесь видалити останній коментар? ;)
Тамара Війсман

Якщо ви насправді зламали, то вам знадобиться лише декілька хвилин від створення виправленого оска. Чому б не закінчити роботу і не дати посаді судити?
harrymc

2

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

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

Опинившись, ви повинні виправити двійковий код, щоб вимкнути тест і змусити HoverPeriod бути меншим. Виправлення бінарного файлу набагато доцільніше, ніж перекомпіляція.

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

[EDIT]

Щоб допомогти вам більше в цьому шляху, ось кілька слів про утиліти та їх використання.

Можна використовувати C-декомпілятор або розбиральник. Пізніший тип може виявитися кориснішим, хоча він вимагає невеликих знань щодо набору інструкцій Intel. Вам також знадобиться хороший шестигранний редактор, і є деякі, які рекламують можливості демонтажника (див. Посилання нижче).

Проект fenris рекламує себе як "набір інструментів, придатних для аналізу коду, налагодження, аналізу протоколів, зворотної інженерії, криміналістики, діагностики, аудиту безпеки, дослідження вразливості та багатьох інших цілей". Звучить добре і рекомендується багатьма, але я не маю цього досвіду.

REC Studio Decompiler намагається створити C-подібне подання коду та даних, що використовуються для створення виконавчого файлу.

Бумеранг є загальним відкритим кодом, декапілятор програм машинного коду з відкритим кодом.

Ще багато таких утиліт можна знайти в Google, або в:

wikibooks x86 розбирання / інструменти аналізу
wikibooks x86 демонтаж / розбирачі та декомпілятори
Відкрити каталог: розбиральники

Попередній крок - розібрати оск. Отриманий список може бути об’ємним і вимагає хорошого редактора тексту (зазвичай достатньо блокнота ++).

Шукайте рядок "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, знайдіть асемблера, щоб скласти новий код і скористайтеся його списком, щоб отримати складені байти, які потрібно використовувати для виправлення.


Зміна значення не буде працювати, враховуючи, що воно перезаписане більш загальною функцією. Зміна кожного значення, отриманого з реєстру, порушить додаток. Дивіться мою відповідь на цю загальну функцію. Шестнадцятковий редактор не працюватиме в результаті, тому зводиться до пошуку потрібного (де) асемблера (або [de] компілятора).
Тамара Війсман

1

Чи можу я запропонувати використовувати AutoIt для автоматизації натискання?

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

Біє зворотну інженерію .exe.


+1 для перетворення "Мені потрібно, щоб швидше натиснути" на "Я дозволяю йому клацнути швидше розумним шляхом".
Тамара Війсман

0

Можливо, вам не доведеться все перекомпілювати. У світі ігор звичайно використовувати тренери, які маніпулюють значеннями в пам'яті під час роботи програми. Якщо ви знайдете мінімальне значення в пам'яті (0,5) і запрограмуєте щось на зразок завантажувача, щоб зменшити це число, воно може працювати.


Це може спрацювати, лише якщо значення знаходиться в одному місці або X-му значенні, яке має це значення. У будь-якому випадку, пошук T і редактор швидкої пам’яті - це два приємних інструменти, щоб спробувати це. Ви можете 500замість цього шукати, оскільки саме так воно завантажується, а не як поплавок.
Тамара Війсман

Після першої спроби виявляється, що osk.exeїї немає в списку процесів. Це відбувається тому, що він запускається в контексті winlogon, щоб він працював для користувачів, ви можете обійти це, запустивши редактор пам'яті і в контексті winlogon.
Тамара Війсман

Дивіться stackoverflow.com/questions/9868079/… та stackoverflow.com/a/3143055/47064 для підходу до цього, простий підхід - це заміна, osk.exeале це спрацює лише в тому випадку, якщо ви створите запуск, який запускає і редактор пам'яті, і підкріплений osk.exe. Але тоді вам доведеться врахувати, що для цього потрібен і навантажувач. Здається, це рішення стає таким же важким, як розбирання та збирання, osk.exeважко ... :)
Tamara Wijsman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.