Zmiana określonych wartości konfiguracji w klawiaturze ekranowej systemu Windows 7

9

Do pisania muszę używać klawiatury ekranowej systemu Windows 7:

(Jeśli jeszcze go nie używałeś, możesz uzyskać: Wszystkie programy -> Akcesoria -> Łatwość dostępu -> Klawiatura ekranowa

lub po prostu wyszukaj „osk.exe”)

Klawiatura ekranowa

Oferuje funkcję „najechania” przyciskami. Microsoft opisuje to jako:

W trybie najechania myszą lub joystickiem wskazujesz klawisz na zdefiniowany wcześniej czas, a wybrany znak jest wpisywany automatycznie.

Jest mój konkretny problem. Z góry określony czas jest zbyt długi, aby był dla mnie użyteczny. Minimalny czas wynosi 0,5 sekundy (maks. 3 sekundy).

Czy jest jakiś sposób na zmianę tej wartości na coś < 0,5? Na przykład poprzez edycję rejestru?

Edycja: Wpisu HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodnie można ustawić na mniej niż 500 ms.

Edycja (2): Myślę, że jedynym sposobem na rozwiązanie mojego problemu jest dekompilacja pliku .exe (chyba napisany w C lub?) I zmiana minimalnego czasu. Potem muszę go skompilować ponownie. Czy ta procedura jest w ogóle wykonalna? Co może zawieść?

Każda pomocna wskazówka byłaby świetna!

pierwszy
źródło
1
Ponowna kompilacja będzie trudna, będzie 1) w większości nieczytelna (nawet jeśli używasz symboli Microsoftu) i 2) nie wiesz, gdzie to sprawdza, więc możesz się obejść, jeśli znajdziesz zmienną przypisaną do 500 lub 0,5, ale nadal musisz wyśledzić ścieżkę, w której płynie, i 3) nadal musisz skompilować całość, co często nie jest możliwe z powodu złej dekompilacji. Niestety debugowanie również nie jest możliwe, chyba że masz kabel debugujący i podłączasz komputer do innego ...
Tamara Wijsman
Myślę, że rozsądnie byłoby zostawić to bez zmian. Jedna postać na pół sekundy nie jest taka zła, a jeśli będzie za szybko, zaczną się pojawiać błędy.
cutrightjm
Ponieważ nie mogę wygodnie edytować mojego komentarza do tego postu, może to pomóc niektórym osobom znającym
cutrightjm
@fnst: Jeśli naprawdę interesuje Cię szybkość, rozważ Dashera . Przedstawię to w mojej odpowiedzi ...
Tamara Wijsman
@ekaj: To tylko osadza aplikację, o ile mogę powiedzieć. Czy możesz nam powiedzieć, jak to by pomogło?
Tamara Wijsman

Odpowiedzi:

7

Gdzie w kodzie znajduje się nasz klucz?

Korzystając z Monitora procesów, zagłębianie się w zdarzenie ETL odczytujące ślad stosu wartości daje nam:

"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"

Widzimy, że OSKSettingsManager::GetOskSettingodczytuje wartość.

Jak więc wygląda ta część? Czy możemy to debugować?

Patrząc na tę funkcję w WinDBG, uzyskuje dostęp do tego klucza rejestru już wcześniej 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]
...

Problem polega na tym, że kiedy próbuję dokonać punktu przerwania w tej lokalizacji, nie mogę już nic pisać, ponieważ osk.exedodaje się do sterowników wejściowych. Można to łatwo zauważyć, przytrzymując klawisz modyfikujący Altna klawiaturze, co powoduje jego podświetlenie osk.exe.

Przeglądając kod dodawania lub odejmowania, widzę tylko, że coś się dzieje z wartością 40szesnastkową, która jest 64dziesiętna. To też nie ma nic wspólnego z liczbą.

Może to być jedna z czterech cmpinstrukcji (porównaj), ale wymagałoby to informacji o debugowaniu. Może się to zdarzyć w przypadku funkcji wyższego poziomu, co wymagałoby więcej badań. Ale bez możliwości debugowania bez utraty możliwości wprowadzania danych jest to bardzo trudne ...

Wydaje się, że znalezienie właściwej lokalizacji będzie wymagało kabla debugowania, ponieważ komputer, na którym debugujesz, traci możliwości wprowadzania danych lub jest zbyt wolny z powodu obciążenia związanego z debugowaniem. Ponieważ obecnie nie mam laptopa z portem z 1943 r., Nie jestem w stanie samodzielnie przeprowadzić debugowania. Byłby w stanie to zrobić i tak, dosłownie zawiesiłby twój system operacyjny. Debugowanie systemu operacyjnego zamiast aplikacji jest fajne ... ^^

Czekaj, mamy dostęp do symboli! Czy możemy znaleźć obrażający kod?

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)

Przy bliższym przyjrzeniu zauważysz funkcję obrażającą:

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

Jeśli przejdziemy przez tę funkcję, najpierw zobaczymy:

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        

Ok, to coś porównuje, a następnie przeskakuje w inne miejsce. Co tam jest?

pop     ebp
retn    8

Więc jeśli warunek zdecyduje, że musi skoczyć, po prostu opuści funkcję i niczego nie zmieni.

Jak więc sprawić, że zawsze opuszcza funkcję?

Zmień jzinstrukcję na jmpinstrukcję, która zawsze wykonuje skok, można ją znaleźć z względnym przesunięciem 41BC10. Jeśli Twój program oblicza różne przesunięcia, musisz wiedzieć, że używa ich 401000jako podstawy, więc odjęcie daje nam absolutne przesunięcie 1AC10.

Pamiętaj, że zmiana 74( JZ) w edytorze szesnastkowym na E9( JMP) nie będzie działać. Nie możesz tego zrobić w edytorze szesnastkowym, potrzebujesz czegoś, co deasembluje i ponownie składa kod, ale niekoniecznie jest łatwe do znalezienia (np. IDA Professional, za które ludzie faktycznie płacą, nie może wytworzyć odpowiedniego kodu c lub pliku wykonywalnego. OllyDBG, często używany w społeczności łatek, nie może nawet otworzyć pliku wykonywalnego.). A nawet Microsoft może chronić swój plik wykonywalny przed manipulacją, ponieważ można to rozważyć w kontekście umowy EULA; więc powodzenia!

Meh! To trudne, chcę tylko szybko pisać za pomocą myszy / oczu / ...

Zdecydowanie powinieneś sprawdzić Dasher, który jest znacznie szybszy niż klawiatura ekranowa. Po prostu działa, przesuwając mysz w kierunku liter; ruch poziomy określa prędkość, a ruch pionowy wybierz litery. Dzięki wbudowanemu słownikowi można nawet dopasować wielkość liter, które mogą być większe, stara się także uczyć na podstawie ruchu, tak aby szybkość i litery były naprawdę przyzwyczajone do użycia.

Obraz mówi więcej niż tysiąc słów ...

Oczywiście jest to raczej niewielkie i niezbyt szybkie, ponieważ jest to przykład, ale można zmienić jego rozmiar, aby znajdował się po prawej stronie ekranu, aby nie zakłócał ekranu. Dzięki temu możesz pisać tak szybko, jak to możliwe ...

Oto dobry przykład tego, jak podpowiedzi pozwalają szybciej pisać dowolny język:

Należy również pamiętać, że litery po prawej stronie są sortowane w określonej kolejności, tak że główny kierunek (góra, środek lub dół) wybiera pomiędzy różnymi typami (małe litery, wielkie litery, cyfry i znaki interpunkcyjne); a następnie w tak dużym kierunku, twój mniejszy kierunek wybierze między AZ, az, 0-9 i tak dalej. Korzystałem z tego w przeszłości i byłem naprawdę zaskoczony, jak płynnie jest to porównywane z innymi konkurentami ...

Pamiętaj też, że Dasher ma pewną konfigurację, więc możesz dostosować coś, co ci się nie podoba.

Tamara Wijsman
źródło
@harrymc: Jeśli przeczytałeś Using Process Monitor, digging into the for the ETL event reading out that value stack trace gives us:, wiedziałbyś, że sprawdziłem ślad stosu dla zdarzenia ETL. Chyba mówisz tu o swoich odpowiedziach? Z powodu dużej ilości odpowiedzi twoje odpowiedzi poważnie nie mają pewnej jakości. Rozważ ulepszenie i / lub usunięcie swoich odpowiedzi zamiast umieszczania szybkich i brudnych odpowiedzi lub głupich komentarzy, które nie mają na celu poprawy pytań i odpowiedzi; możesz zgadnąć, które podejście najbardziej pomoże społeczności ...
Tamara Wijsman,
1
@harrymc: (1) W przypadku gdy ma to powiedzieć, że jestem pękanie ? Po prostu pokazuję tutaj punkt wyjścia, nie zawiodłem i pokazałem, że dodatkowe wyposażenie lub praca domowa są konieczne, aby przejść dalej. Jakość jest w mojej odpowiedzi, ilość musi zostać wykonana przez czytelnika lub gdy napotkam zdalną konfigurację debugowania. (2) Googling Process Monitor i WinDBG nie są nauką o rakietach. (3) Dzięki za komplement, może powinienem również wyjaśnić, jak działa montaż w mojej odpowiedzi?
Tamara Wijsman
@harrymc: Moja odpowiedź jest dobrym punktem wyjścia. Twój błąd polega na niedostarczeniu wystarczających szczegółów, co pokazuje zarówno odpowiedź, jak i komentarze w tym pytaniu. Właśnie odkryłeś, że konieczne jest umieszczenie kolejnego komentarza, który nie ma na celu ulepszenia mojej odpowiedzi lub nie mówi, co jest z nią nie tak, zajmie ci to trochę więcej czasu, zanim odpowiesz wysiłkiem, zamiast być zbyt ogólnym . Nie wiem, jak się The decompilation help. Once located, you should patch the binary code.przydaje, wolałbym raczej długie ćwiczenia na wynos zamiast drapania włosów ...
Tamara Wijsman,
@harrymc: Zakładasz, że jest to cel ogólny; ale gdybyś sprawdził jego odwołania i zależności, zobaczyłbyś, że nie niszczy żadnego zachowania w przeszłości, zastępując własną konfigurację, która jest ładowana wyłącznie z tego klucza rejestru. Sprawdziłem jego referencje i zależności, więc znam zastosowania. Czy zamierzasz również usunąć swój ostatni komentarz? ;)
Tamara Wijsman
Jeśli naprawdę go złamałeś, to tylko kilka minut dzieli Cię od stworzenia załatanego oska. Dlaczego nie dokończyć dzieła i pozwolić, aby plakat go osądził?
harrymc
2

Obawiam się, że większość dekompilatorów nie da wystarczająco dobrego wyniku, który można ponownie skompilować.

Dekompilacja może jedynie pomóc w określeniu HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodużywanego obszaru , aby dowiedzieć się, gdzie ta wartość jest odczytywana i gdzie jest przestrzegany limit 500 ms.

Po zlokalizowaniu należy łatać kod binarny, aby wyłączyć test i zmusić HoverPeriod do zmniejszenia. Patchowanie pliku binarnego jest znacznie bardziej wykonalne niż ponowna kompilacja.

Może być konieczne powtórzenie wysiłku, jeśli plik osk.exe zostanie kiedykolwiek zastąpiony przez usługę Windows Update (czego tak naprawdę nie oczekuję).

[EDYTOWAĆ]

Aby ci pomóc w drodze, oto kilka słów o narzędziach i ich użyciu.

Możesz użyć dekompilatora C lub dezasemblera. Późniejszy typ może być bardziej przydatny, chociaż wymaga niewielkiej wiedzy na temat zestawu instrukcji Intel. Będziesz także potrzebował dobrego edytora szesnastkowego, a niektóre z nich reklamują możliwości deasemblera (patrz link poniżej).

projekt fenris reklamuje się jako „zestaw narzędzi odpowiednich do analizy kodu, debugowania, analizy protokołów, inżynierii wstecznej, kryminalistyki, diagnostyki, audytów bezpieczeństwa, badań podatności i wielu innych celów”. Brzmi dobrze i jest polecany przez wielu, ale nie mam z tym doświadczenia.

REC Studio Decompiler próbuje stworzyć reprezentację C kodu i danych użytych do zbudowania pliku wykonywalnego.

Boomerang to ogólny dekompilator programów maszynowych o otwartym kodzie źródłowym.

Wiele innych takich narzędzi można znaleźć w Google lub w:

wikibooks x86 Narzędzia do demontażu / analizy
wikibooks x86 Demontaż / deasemblery i dekompilatory
Open Directory: Disassemblers

Wstępnym krokiem jest zdemontowanie oska. Wynikowa lista może być obszerna i wymagać dobrego edytora tekstu (zwykle wystarczy notatnik ++).

Wyszukaj ciąg „HoverPeriod” (bez rozróżniania wielkości liter). Jeśli masz szczęście, deasembler zidentyfikował go jako ciąg znaków i możesz go znaleźć w obecnej postaci. Jeśli nie, musisz wyszukać bajt po bajcie. Jako ciąg znaków Unicode będzie wyglądał, jak H,0,o,0,v,0...litery powinny być zastąpione ich kodami numerycznymi.

Po znalezieniu ciągu „HoverPeriod” deasembler powinien umieścić gdzieś przed nim etykietę. Użyj nazwy tej wygenerowanej etykiety, aby wyszukać, gdzie jest używana, aby określić, gdzie jest pobierana z rejestru i w której zmiennej globalnej przechowywany jest wynik.

Po zlokalizowaniu zmiennej, która zawiera liczbę, wyszukaj, gdzie jest używana. To, co zrobisz, zależy od formatu kodu, który znajdziesz. Następnie możesz zdecydować, którą łatkę chcesz.

Na przykład możesz użyć edytora szesnastkowego, aby zastąpić w osk.exe polecenie, takie jak:

move AX,<HoverPeriod milliseconds count variable>

w

mov AX,200       (your count of 200 milliseconds)

Uważaj na różne długości poleceń, ponieważ jeśli nowe polecenie jest krótsze, będzie musiało zostać uzupełnione jednobajtowymi instrukcjami NOP (brak operacji) do długości starej instrukcji.

Lokalizowanie polecenia łatania w osk.exe może wymagać wyszukiwania, jeśli przesunięcia, które daje deasembler, znajdują się w kodzie, a nie w pliku exe. Jeśli edytor szesnastkowy nie obsługuje wyszukiwania w asemblerze, wykonaj demontaż, wymieniając oryginalne bajty instrukcji, abyś wiedział, które bajty binarne mają szukać. Unikaj wyszukiwania instrukcji zawierających adresy, ponieważ adresy mogą być relokowane w pliku exe, więc raczej szukaj sekwencji bajtów w pobliżu takiej instrukcji.

Możesz utworzyć nowe bajty łaty bezpośrednio w edytorze szesnastkowym, jeśli obsługuje on asembler. A jeśli tak nie jest i nie czujesz się komfortowo z kodem maszynowym Intela, znajdź asembler do skompilowania nowego kodu i użyj jego listy, aby uzyskać skompilowane bajty do łatania.

harrymc
źródło
Zmiana wartości nie zadziała, ponieważ została zastąpiona bardziej ogólną funkcją. Zmiana każdej wartości pobieranej z rejestru spowoduje uszkodzenie aplikacji. Zobacz moją odpowiedź dotyczącą tej ogólnej funkcji. W rezultacie edytor szesnastkowy nie będzie działał, więc sprowadza się do znalezienia właściwego (de) asemblera (lub [de] kompilatora).
Tamara Wijsman
1

Czy mogę zasugerować użycie AutoIt do automatyzacji klikania?

Pomysł polegałby na monitorowaniu biegu jałowego myszy, gdy kursor znajduje się w oknie ekranowym (np. W pętli sterowania, sprawdzanie w regularnych odstępach czasu, czy kursor zmienił pozycję) i automatycznym kliknięciu (funkcja wywołania SendClick) po, powiedzmy, 100ms bezczynności.

Uderza w inżynierii wstecznej.

minya
źródło
+1 za przekształcenie „Potrzebuję, aby klikał szybciej” w „Pozwolę mu klikać szybciej w inteligentny sposób”.
Tamara Wijsman,
0

Może nie musisz wszystko kompilować ponownie. W świecie gry często używa się trenerów, które manipulują wartością w pamięci podczas działania programu. Jeśli znajdziesz minimalną wartość w pamięci (0,5) i zaprogramujesz program ładujący, aby zmniejszyć tę liczbę, może to zadziałać.

Pwdr
źródło
To może działać, tylko jeśli wartość znajduje się w tej samej lokalizacji lub X wartość, która ma tę wartość. W każdym razie T Search i Quick Memory Editor to dwa fajne narzędzia do wypróbowania tego. Zamiast tego możesz szukać, 500ponieważ właśnie tak to ładuje, a nie jako zmiennoprzecinkowe.
Tamara Wijsman
Przy pierwszej próbie wydaje się, że osk.exenie ma jej na liście procesów. Wynika to z faktu, że jest uruchamiany w kontekście w winlogontaki sposób, że działa na różnych użytkownikach, można to obejść, uruchamiając edytor pamięci również w kontekście winlogon.
Tamara Wijsman
Zobacz podejście stackoverflow.com/questions/9868079/... i stackoverflow.com/a/3143055/47064 , łatwym podejściem jest zastąpienie, osk.exeale zadziałałoby tylko, jeśli utworzysz program uruchamiający, który uruchamia zarówno edytor pamięci, jak i kopia zapasowa osk.exe. Ale wtedy musisz wziąć pod uwagę, że moduł ładujący również musiałby to zrobić. Wydaje się, że to rozwiązanie staje się tak trudne, jak demontaż i montaż, osk.exejest trudne ... :)
Tamara Wijsman