Où dans le code trouve-t-il notre clé?
En utilisant Process Monitor, creuser dans l'événement ETL en lisant cette trace de pile de valeurs nous donne:
"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"
Nous pouvons voir que OSKSettingsManager::GetOskSetting
lit la valeur.
Alors, à quoi ressemble cette portion? Pouvons-nous le déboguer?
En examinant cette fonction avec WinDBG, il accède à cette clé de registre juste avant 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]
...
Maintenant, le problème ici est que lorsque j'essaie de créer un point d'arrêt à cet emplacement, je ne peux plus taper quoi que ce soit car il osk.exe
s'ajoute aux pilotes d'entrée. Cela peut facilement être vu en maintenant une touche de modification comme Altsur votre clavier, cela l'illumine osk.exe
.
En parcourant le code pour les ajouts ou les soustractions, je ne vois que quelque chose se produire avec 40
hexadécimal qui est 64
décimal. Ce n'est donc rien non plus lié au nombre.
Il pourrait être dans l'une des quatre cmp
instructions (comparer), mais cela nécessiterait des informations de débogage. Ou cela pourrait se produire dans une fonction plus élevée, ce qui nécessiterait plus d'investigations. Mais sans la possibilité de le déboguer sans perdre les capacités d'entrée, c'est une chose très difficile à faire ...
Semble que trouver le bon emplacement nécessitera un câble de débogage car l'ordinateur sur lequel vous déboguez perd ses capacités d'entrée, ou est beaucoup trop lent en raison de la surcharge de débogage. Comme je n'ai pas actuellement d'ordinateur portable avec un port 1943, je ne peux pas faire ce débogage moi-même. Il pourrait le faire, et oui, il gèlerait littéralement votre système d'exploitation. Déboguer un OS au lieu d'une application est amusant ... ^^
Attendez, nous avons accès aux symboles! Pouvons-nous trouver le code incriminé?
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)
En y regardant de plus près, vous remarquerez la fonction incriminée:
OSKSettingsManager::_KeepSettingValueInBounds(ulong,ulong *,int)
Si nous parcourons cette fonction, nous voyons d'abord:
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
D'accord, cela compare quelque chose et passe ensuite à un autre emplacement. Qu'y a-t-il là?
pop ebp
retn 8
Donc, si la condition décide qu'elle doit sauter, elle quittera simplement la fonction et ne changera rien.
Alors, comment faire en sorte qu'il quitte toujours la fonction?
Transformez l' jz
instruction en une jmp
instruction qui fait toujours le saut, vous pouvez la trouver à un décalage relatif 41BC10
. Dans le cas où votre programme calcule des décalages différents, vous devez savoir qu'il utilise 401000
comme base, donc la soustraction nous donne le décalage absolu 1AC10
.
Veuillez noter que changer 74
( JZ
) dans l'éditeur hexadécimal en E9
( JMP
) ne fonctionnera pas. Vous ne pouvez pas le faire dans un éditeur hexadécimal, vous aurez besoin de quelque chose qui désassemble et réassemble le code, mais ce n'est pas nécessairement facile à trouver (par exemple, IDA Professional pour lequel les gens paient réellement, ne peut pas produire le bon code c ou un exécutable. OllyDBG, couramment utilisé dans la communauté des correctifs, ne peut même pas ouvrir l'exécutable.). Et même alors, Microsoft pourrait protéger son exécutable contre la falsification, car cela pourrait être considéré contre le CLUF; alors bonne chance!
Meh! C'est dur, je veux juste taper vite avec ma souris / mes yeux / ...
Vous devriez certainement vérifier Dasher qui est beaucoup plus rapide qu'un clavier à l'écran. Cela fonctionne simplement en déplaçant votre souris vers les lettres; le mouvement horizontal détermine la vitesse et le mouvement vertical sélectionne les lettres. Avec un dictionnaire intégré, il peut même dimensionner les lettres les plus susceptibles d'être plus grandes, il essaie également d'apprendre de votre mouvement de telle sorte que la vitesse et les lettres soient vraiment habituées à votre utilisation.
Une image en dit plus que mille mots ...
Bien sûr, c'est plutôt petit et pas vraiment rapide car c'est un exemple, mais vous pouvez le redimensionner pour qu'il soit sur le côté droit de votre écran afin qu'il n'interfère pas avec votre écran. Cela vous permet de taper aussi vite que possible ...
Voici un bon exemple de la façon dont les prédictions vous permettent de taper n'importe quelle langue plus rapidement:
Notez également que les lettres de droite sont triées dans un ordre spécifique, de sorte que la direction principale (haut, milieu ou bas) choisit entre les différents types (minuscules, majuscules, chiffres et ponctuation); puis dans une telle direction principale, votre direction secondaire choisira entre AZ, az, 0-9 et ainsi de suite. Je l'ai utilisé dans le passé et j'ai été étonné de voir à quel point cela est comparable à celui d'autres concurrents ...
Notez également que Dasher a une certaine configuration, vous pourrez donc peut-être ajuster quelque chose que vous n'aimez pas.