Ändern bestimmter Konfigurationswerte in der Bildschirmtastatur von Windows 7


9

Ich muss die Bildschirmtastatur von Windows 7 zum Tippen verwenden:

(Falls Sie es noch nicht verwendet haben, können Sie es erhalten über: Alle Programme -> Zubehör -> Einfacher Zugriff -> Bildschirmtastatur

oder einfach nach "osk.exe" suchen)

Bildschirmtastatur

Es bietet eine Funktion zum "Schweben" über die Tasten. Microsoft beschreibt es wie folgt:

Im Schwebemodus zeigen Sie mit einer Maus oder einem Joystick für einen vordefinierten Zeitraum auf eine Taste, und das ausgewählte Zeichen wird automatisch eingegeben.

Es gibt mein spezifisches Problem. Die vordefinierte Zeitspanne ist zu lang, um für mich nützlich zu sein. Die Mindestzeit beträgt 0,5 Sekunden (max. 3 Sekunden).

Gibt es eine Möglichkeit, diesen Wert auf etwas < 0,5 zu ändern ? Zum Beispiel über die Bearbeitung der Registrierung?

Bearbeiten: Der Eintrag HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodkann nicht niedriger als 500 ms eingestellt werden.

Bearbeiten (2): Ich denke, die einzige Möglichkeit, mein Problem zu beheben, besteht darin, die EXE-Datei zu dekompilieren (ich denke, sie ist in C geschrieben oder?) Und die Mindestzeit zu ändern. Dann muss ich es nochmal kompilieren. Ist dieses Verfahren überhaupt praktikabel? Welche Dinge könnten scheitern?

Jeder hilfreiche Tipp wäre toll!


1
Das Neukompilieren wird eine schwierige Sache sein. Es wird 1) meistens unlesbar sein (selbst wenn Sie die Symbole von Microsoft verwenden) und 2) Sie wissen nicht, wo diese Überprüfung durchgeführt wird, sodass Sie möglicherweise herumkommen, wenn Sie eine Variable finden, die 500 zugewiesen ist oder 0,5, aber dann müssen Sie immer noch den Pfad aufspüren, auf dem er fließt, und 3) Sie müssen immer noch das Ganze neu kompilieren, was aufgrund einer schlechten Dekompilierung oft nicht möglich ist. Leider ist das Debuggen auch nicht möglich, es sei denn, Sie haben ein Debug-Kabel und schließen Ihren Computer an ein anderes an ...
Tamara Wijsman

Ich denke, es wäre klug, es so zu lassen, wie es ist. Ein Charakter jede halbe Sekunde ist nicht so schlimm, und wenn es zu schnell wird, treten Fehler auf.
Cutrightjm

Da ich meinen Kommentar zu diesem Beitrag nicht bequem bearbeiten kann, kann dies einigen Leuten, die C # oder andere Sprachen kennen, helfen, einen Patch dafür zu schreiben: daniweb.com/hardware-and-software/microsoft-windows/threads/…
cutrightjm

@fnst: Wenn Sie wirklich an Geschwindigkeit interessiert sind, ziehen Sie Dasher in Betracht . Ich werde es in meiner Antwort skizzieren ...
Tamara Wijsman

@ekaj: Das bettet nur die Anwendung ein, soweit ich das beurteilen kann. Können Sie uns sagen, wie das helfen würde?
Tamara Wijsman

Antworten:


7

Wo im Code befindet sich unser Schlüssel?

Wenn Sie mit Process Monitor in das für das ETL-Ereignis einlesen, das diesen Wertestapel-Trace ausliest, erhalten Sie:

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

Wir können sehen, dass OSKSettingsManager::GetOskSettingder Wert ausgelesen wird.

Wie sieht dieser Teil aus? Können wir es debuggen?

Wenn Sie diese Funktion mit WinDBG untersuchen, greift sie direkt zuvor auf diesen Registrierungsschlüssel zu 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]
...

Das Problem hierbei ist, dass ich beim Versuch, an dieser Stelle einen Haltepunkt zu setzen, nichts mehr eingeben kann, da er sich osk.exeselbst zu den Eingabetreibern hinzufügt. Dies kann leicht erkannt werden, indem Sie eine Modifizierertaste wie Altauf Ihrer Tastatur gedrückt halten. Dadurch leuchtet sie auf osk.exe.

Wenn ich den Code nach Additionen oder Subtraktionen durchsuche, sehe ich nur, dass etwas mit 40hexadezimaler 64Dezimalzahl passiert . Das hat also auch nichts mit der Nummer zu tun.

Es könnte sich um eine der vier cmp(Vergleichs-) Anweisungen handeln, für die jedoch Debugging-Informationen erforderlich wären. Oder es könnte in einer höheren Funktion geschehen, was weitere Untersuchungen erfordern würde. Aber ohne die Fähigkeit, es zu debuggen, ohne die Eingabefähigkeiten zu verlieren, ist dies eine sehr schwierige Sache ...

Es scheint, dass für das Finden des richtigen Speicherorts ein Debug-Kabel erforderlich ist, da der Computer, auf dem Sie debuggen, seine Eingabefunktionen verliert oder aufgrund des Overheads beim Debuggen viel zu langsam ist. Da ich derzeit keinen Laptop mit einem Anschluss von 1943 habe, kann ich dieses Debugging nicht selbst durchführen. Es wäre in der Lage, dies zu tun, und ja, es würde Ihr Betriebssystem buchstäblich einfrieren. Das Debuggen eines Betriebssystems anstelle einer Anwendung macht Spaß ... ^^

Warten Sie, wir haben Zugriff auf die Symbole! Können wir den beleidigenden Code finden?

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)

Bei näherer Betrachtung werden Sie die störende Funktion bemerken:

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

Wenn wir durch diese Funktion gehen, sehen wir zuerst:

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        

Okay, das vergleicht etwas und springt dann zu einem anderen Ort. Was ist dort?

pop     ebp
retn    8

Wenn die Bedingung entscheidet, dass sie springen muss, verlässt sie einfach die Funktion und ändert nichts.

Wie schaffen wir es also, dass die Funktion immer verlassen wird?

Ändern Sie die jzAnweisung in eine jmpAnweisung, die immer den Sprung ausführt. Sie finden sie am relativen Versatz 41BC10. Wenn Ihr Programm unterschiedliche Offsets berechnet, müssen Sie wissen, dass es 401000als Grundlage verwendet wird, sodass wir durch Subtrahieren den absoluten Offset erhalten 1AC10.

Bitte beachten Sie, dass das Ändern von 74( JZ) im Hex-Editor in E9( JMP) nicht funktioniert. Sie können dies nicht in einem Hex-Editor tun. Sie benötigen etwas, das den Code zerlegt und wieder zusammensetzt, aber das ist nicht unbedingt leicht zu finden (z. B. IDA Professional, für das die Leute tatsächlich bezahlen, kann keinen richtigen C-Code oder eine ausführbare Datei erstellen. OllyDBG, das häufig in der Patch-Community verwendet wird, kann die ausführbare Datei nicht einmal öffnen.). Und dann könnte Microsoft sogar seine ausführbare Datei vor Manipulationen schützen, da dies gegen die EULA in Betracht gezogen werden könnte. also viel Glück!

Meh! Das ist schwer, ich möchte nur schnell mit meiner Maus / Augen / ...

Sie sollten sich unbedingt Dasher ansehen, das viel schneller ist als eine Bildschirmtastatur. Es funktioniert einfach, indem Sie Ihre Maus in Richtung Buchstaben bewegen. Die horizontale Bewegung bestimmt die Geschwindigkeit und die vertikale Bewegung wählt die Buchstaben aus. Mit einem eingebauten Wörterbuch können sogar die wahrscheinlichsten Buchstaben größer werden. Außerdem wird versucht, aus Ihrer Bewegung zu lernen, sodass die Geschwindigkeit und die Buchstaben wirklich an Ihre Verwendung gewöhnt sind.

Ein Bild sagt mehr als tausend Worte ...

Natürlich ist dies eher klein und nicht sehr schnell, da es sich um ein Beispiel handelt, aber Sie können die Größe so ändern, dass es sich auf der rechten Seite Ihres Bildschirms befindet, sodass es Ihren Bildschirm nicht beeinträchtigt. So können Sie so schnell wie möglich tippen ...

Hier ist ein gutes Beispiel dafür, wie Sie mit den Vorhersagen eine Sprache schneller eingeben können:

Beachten Sie auch, dass die Buchstaben rechts in einer bestimmten Reihenfolge sortiert sind, sodass die Hauptrichtung (oben, in der Mitte oder unten) zwischen den verschiedenen Typen (Kleinbuchstaben, Großbuchstaben, Zahlen und Interpunktion) wählt. und dann wählt Ihre Nebenrichtung innerhalb einer solchen Hauptrichtung zwischen AZ, az, 0-9 und so weiter. Ich habe dies in der Vergangenheit verwendet und war tatsächlich erstaunt, wie fließend dies im Vergleich zu anderen Wettbewerbern ist ...

Beachten Sie auch, dass Dasher eine Konfiguration hat, sodass Sie möglicherweise etwas anpassen können, das Ihnen nicht gefällt.


@harrymc: Wenn Sie gelesen haben, hätten Using Process Monitor, digging into the for the ETL event reading out that value stack trace gives us:Sie gewusst, dass ich den Stack-Trace auf das ETL-Ereignis überprüft habe. Ich denke, Sie sprechen hier über Ihre eigenen Antworten? Aufgrund der hohen Antwortmenge fehlt Ihren Antworten ernsthaft die Qualität. Erwägen Sie, Ihre Antworten zu verbessern und / oder zu entfernen, anstatt schnelle und schmutzige Antworten oder dumme Kommentare zu platzieren, die nicht die Absicht haben, die Fragen und Antworten zu verbessern. Sie können sich vorstellen, welcher Ansatz der Community am meisten helfen wird ...
Tamara Wijsman

1
@harrymc: (1) Wo kommt es zu sagen , ich bin Knacken ? Ich zeige hier nur einen Ausgangspunkt, ich habe nicht versagt und ich habe gezeigt, dass zusätzliche Ausrüstung oder Hausaufgaben notwendig sind, um fortzufahren. Die Qualität ist in meiner Antwort, die Quantität muss vom Leser oder wenn ich auf ein Remote-Debugging-Setup stoße. (2) Googling Process Monitor und WinDBG sind keine Raketenwissenschaft. (3) Danke für das Kompliment, vielleicht sollte ich in meiner Antwort auch erklären, wie die Montage funktioniert?
Tamara Wijsman

@harrymc: Meine Antwort ist ein guter Ausgangspunkt. Ihr Fehler liegt darin, dass Sie nicht genügend Details angeben, wie sowohl Ihre Antwort als auch Ihre Kommentare in dieser Frage zeigen. Sie haben es gerade für notwendig gehalten, einen weiteren Kommentar abzugeben, der nicht die Absicht hat, meine Antwort zu verbessern, oder nicht sagt, was daran falsch ist. Sie werden etwas mehr Zeit brauchen, um eine Antwort zu erstellen, die Mühe zeigt, anstatt zu allgemein zu sein . Ich verstehe nicht, wie The decompilation help. Once located, you should patch the binary code.nützlich Ihre ist, ich würde lieber eine ultralange Übung zum Mitnehmen als ein Kratzen der Haare bevorzugen ...
Tamara Wijsman

@harrymc: Du nimmst an, dass es von allgemeinem Zweck ist; Wenn Sie jedoch die Referenzen und Abhängigkeiten überprüft hätten, hätten Sie festgestellt, dass das Verhalten nach dem Überschreiben der eigenen Konfiguration, die ausschließlich von diesem Registrierungsschlüssel geladen wird, nicht zerstört wird. Ich habe seine Referenzen und Abhängigkeiten überprüft, damit ich die Verwendungen kenne. Wirst du auch deinen letzten Kommentar löschen? ;)
Tamara Wijsman

Wenn Sie es wirklich geknackt haben, sind Sie nur noch wenige Minuten von der Erstellung eines gepatchten Osk entfernt. Warum nicht den Job beenden und das Poster beurteilen lassen?
Harrymc

2

Ich befürchte, dass die meisten Dekompiler kein ausreichend gutes Ergebnis liefern, das neu kompiliert werden kann.

Die Dekompilierung kann nur dazu beitragen, den verwendeten Bereich genau zu bestimmen HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriod, um herauszufinden, wo dieser Wert gelesen wird und wo die 500-ms-Grenze erzwungen wird.

Nach dem Auffinden sollten Sie den Binärcode patchen, um den Test zu deaktivieren und zu erzwingen, dass HoverPeriod kleiner wird. Das Patchen der Binärdatei ist viel praktikabler als das Neukompilieren.

Möglicherweise müssen Sie die Bemühungen wiederholen, wenn osk.exe jemals durch Windows Update ersetzt wird (was ich nicht wirklich erwarte).

[BEARBEITEN]

Um Ihnen auf dem Weg mehr zu helfen, finden Sie hier einige Worte zu Dienstprogrammen und deren Verwendung.

Sie können entweder einen C-Dekompiler oder einen Disassembler verwenden. Der spätere Typ kann nützlicher sein, erfordert jedoch einige geringe Kenntnisse des Intel-Befehlssatzes. Sie benötigen außerdem einen guten Hex-Editor, und es gibt einige, die für Disassembler-Funktionen werben (siehe Link unten).

Das Projekt fenris bewirbt sich als "Suite von Tools, die für Code-Analyse, Debugging, Protokollanalyse, Reverse Engineering, Forensik, Diagnose, Sicherheitsüberprüfungen, Schwachstellenforschung und viele andere Zwecke geeignet sind". Klingt gut und wird von vielen empfohlen, aber ich habe keine Erfahrung damit.

REC Studio Decompiler versucht, eine C-ähnliche Darstellung des Codes und der Daten zu erstellen, die zum Erstellen der ausführbaren Datei verwendet werden.

Boomerang ist ein allgemeiner Open-Source-Dekompilierer für Maschinencode-Programme.

Viele weitere solcher Dienstprogramme können durch Googeln oder in:

wikibooks x86 Demontage- /
Analysetools wikibooks x86 Demontage- / Demontage- und Dekompilierer
Open Directory: Disassembler

Ein erster Schritt ist die Demontage von osk. Die resultierende Auflistung ist möglicherweise umfangreich und erfordert einen guten Texteditor (normalerweise reicht Notepad ++ aus).

Suchen Sie nach der Zeichenfolge "HoverPeriod" (Groß- und Kleinschreibung wird nicht berücksichtigt). Wenn Sie Glück haben, hat der Disassembler es als Zeichenfolge identifiziert und Sie können es so finden, wie es ist. Wenn nicht, müssen Sie Byte für Byte danach suchen. Als Unicode-Zeichenfolge sieht es so aus, als ob H,0,o,0,v,0...die Buchstaben durch ihre numerischen Codes ersetzt werden sollen.

Sobald Sie die Zeichenfolge "HoverPeriod" gefunden haben, sollte der Disassembler irgendwo davor eine Beschriftung platziert haben. Verwenden Sie den Namen dieses generierten Labels, um zu suchen, wo es verwendet wird, um festzustellen, wo es aus der Registrierung abgerufen wird und in welcher globalen Variablen das Ergebnis gespeichert ist.

Wenn Sie die Variable gefunden haben, die die Anzahl enthält, suchen Sie, wo sie verwendet wird. Was Sie tun, hängt vom Format des Codes ab, den Sie finden. Sie können sich dann für den gewünschten Patch entscheiden.

Beispielsweise möchten Sie möglicherweise den Hex-Editor verwenden, um in osk.exe einen Befehl wie den folgenden zu ersetzen:

move AX,<HoverPeriod milliseconds count variable>

in

mov AX,200       (your count of 200 milliseconds)

Seien Sie vorsichtig mit unterschiedlichen Befehlslängen. Wenn der neue Befehl kürzer ist, muss er mit Ein-Byte-NOP-Befehlen (keine Operation) auf die Länge des alten Befehls aufgefüllt werden.

Um den Befehl zum Patchen in osk.exe zu finden, muss möglicherweise gesucht werden, ob die vom Disassembler angegebenen Offsets im Code und nicht in der exe-Datei enthalten sind. Wenn der Hex-Editor die Assembler-Suche nicht unterstützt, führen Sie die Disassemblierung durch, während Sie die ursprünglichen Anweisungsbytes auflisten, damit Sie wissen, nach welchen Binärbytes Sie suchen müssen. Vermeiden Sie die Suche nach Anweisungen, die Adressen enthalten, da Adressen möglicherweise in der exe verschoben werden. Suchen Sie daher lieber nach einer Folge von Bytes in der Nähe einer solchen Anweisung.

Sie können die neuen Patch-Bytes entweder direkt im Hex-Editor erstellen, wenn dieser Assembler unterstützt. Wenn dies nicht der Fall ist und Sie sich mit Intel-Maschinencode nicht wohl fühlen, suchen Sie einen Assembler, um Ihren neuen Code zu kompilieren, und verwenden Sie seine Liste, um die kompilierten Bytes zum Patchen zu erhalten.


Das Ändern des Werts funktioniert nicht, da er von einer allgemeineren Funktion überschrieben wird. Wenn Sie jeden Wert ändern, den es aus der Registrierung erhält, wird die Anwendung beschädigt. Siehe meine Antwort für diese generische Funktion. Ein Hex-Editor funktioniert daher nicht, daher kommt es darauf an, den richtigen (De-) Assembler (oder [De-] Compiler) zu finden.
Tamara Wijsman

1

Darf ich vorschlagen, AutoIt zu verwenden, um das Klicken zu automatisieren?

Die Idee wäre, den Mausleerlauf zu überwachen, wenn sich der Cursor im Bildschirmfenster befindet (z. B. in einem Regelkreis, in regelmäßigen Abständen prüfen, ob sich die Position des Cursors geändert hat) und nach beispielsweise 100 ms automatisch zu klicken (Funktion SendClick aufrufen) der Inaktivität.

Beats Reverse Engineering einer .exe.


+1 für die Umwandlung von "Ich brauche es, um schneller zu klicken" in "Ich lasse es auf intelligente Weise schneller klicken".
Tamara Wijsman

0

Vielleicht müssen Sie nicht alles neu kompilieren. In der Spielwelt ist es üblich, Trainer zu verwenden, die einen Wert im Speicher manipulieren, wenn das Programm ausgeführt wird. Wenn Sie den Mindestwert im Speicher (0,5) finden und so etwas wie einen Loader programmieren, um diese Zahl zu verkleinern, könnte dies funktionieren.


Dies funktioniert möglicherweise nur, wenn sich der Wert an derselben Stelle befindet oder der X. Wert, der diesen Wert hat. In jedem Fall sind T Search und Quick Memory Editor zwei nützliche Tools, mit denen Sie dies ausprobieren können. Vielleicht möchten Sie 500stattdessen suchen, da es auf diese Weise geladen wird und nicht als Float.
Tamara Wijsman

Beim ersten Versuch scheint es, dass osk.exenicht in der Prozessliste enthalten ist. Dies liegt daran, dass es im Kontext gestartet wird, winlogonsodass es benutzerübergreifend funktioniert. Sie können dies umgehen, indem Sie den Speichereditor auch im Kontext von starten winlogon.
Tamara Wijsman

Einen Ansatz hierzu finden Sie unter stackoverflow.com/questions/9868079/… und stackoverflow.com/a/3143055/47064. Der einfache Ansatz besteht darin, ihn zu ersetzen. Dies funktioniertosk.exe jedoch nur, wenn Sie einen Launcher erstellen, der sowohl den Speichereditor als auch startet die gesichert osk.exe. Aber dann müsste man bedenken, dass ein Lader das auch tun müsste. Scheint, dass diese Lösung so schwer wird wie das Zerlegen und Zusammenbauen, osk.exeist schwer ... :)
Tamara Wijsman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.