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::GetOskSetting
der 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.exe
selbst 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 40
hexadezimaler 64
Dezimalzahl 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 jz
Anweisung in eine jmp
Anweisung, 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 401000
als 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.