Onde no código ele encontra nossa chave?
Usando o Process Monitor, acessando o evento ETL, esse rastreio da pilha de valores nos fornece:
"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"
Podemos ver que OSKSettingsManager::GetOskSetting
lê o valor.
Então, como é essa parte? Podemos depurar isso?
Examinando essa função com o WinDBG, ela acessa essa chave do registro logo antes de 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]
...
Agora, o problema aqui é que, quando tento interromper esse local, não consigo mais digitar nada porque osk.exe
se adiciona aos drivers de entrada. Isso pode ser facilmente visto segurando uma tecla modificadora como Alt no teclado, isso acende em osk.exe
.
Examinando o código para adições ou subtrações, vejo apenas algo acontecer com 40
hexadecimal, que é 64
decimal. Então, isso também não é nada relacionado ao número.
Pode estar em uma das quatro instruções cmp
(compare), mas isso exigiria informações de depuração. Ou poderia acontecer em uma função mais alta, o que exigiria mais investigação. Mas sem a capacidade de depurá-lo sem perder as capacidades de entrada, isso é muito difícil de fazer ...
Parece que encontrar o local correto exigirá um cabo de depuração, pois o computador no qual você depura perde seus recursos de entrada ou está muito lento devido à sobrecarga da depuração. Como atualmente não tenho um laptop com porta 1943, não posso depurar isso sozinho. Ele seria capaz de fazer isso e, literalmente, congelaria seu sistema operacional. Depurar um sistema operacional em vez de um aplicativo é divertido ... ^^
Espere, nós temos acesso aos símbolos! Podemos encontrar o código incorreto?
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)
Olhando mais de perto, você notará a função ofensiva:
OSKSettingsManager::_KeepSettingValueInBounds(ulong,ulong *,int)
Se passarmos por essa função, primeiro vemos:
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, isso compara algo e depois pula para outro local. O que há aí?
pop ebp
retn 8
Então, se a condição decidir que deve pular, apenas sairá da função e não mudará nada.
Então, como fazemos sempre deixar a função?
Altere a instrução jz
para uma instrução jmp
que sempre faz o salto, você pode encontrá-lo no deslocamento relativo 41BC10
. Caso seu programa calcule deslocamentos diferentes, você precisa saber que ele usa 401000
como base, portanto, a subtração nos dá o deslocamento absoluto 1AC10
.
Por favor, note que a mudança 74
( JZ
) no editor hexadecimal para E9
( JMP
) não funcionará. Você não pode fazer isso em um editor hexadecimal, você precisará de algo que desmonta e remonta o código, mas isso não é necessariamente fácil de encontrar (por exemplo, IDA Professional que as pessoas realmente pagam, não pode produzir código c ou executável. O OllyDBG, comumente usado na comunidade de patches, não pode nem abrir o executável. E então, até mesmo, a Microsoft poderia estar protegendo seu executável contra adulterações, porque isso poderia ser considerado contra o EULA; então boa sorte!
Meh! Isso é difícil, eu só quero digitar rápido usando meu mouse / olhos / ...
Você deve definitivamente verificar Dasher que é muito mais rápido do que um teclado virtual. Simplesmente funciona movendo o mouse para as letras; movimento horizontal determina a velocidade e movimento vertical selecione as letras. Com um dicionário embutido pode até dimensionar as letras mais prováveis para serem maiores, ele também tenta aprender com seus movimentos de forma que a velocidade e as letras estejam realmente acostumadas com o seu uso.
Umaimagemfalamaisdemilpalavras...
Éclaroqueissoéumpoucopequenoenãomuitorápido,jáqueéumexemplo,masvocêpoderedimensioná-loparaficardoladodireitodatela,demodoqueelenãointerfiranasuatela.Issopermitequevocêdigiteomaisrápidopossível...
Esteéumbomexemplodecomoasprevisõespermitemquevocêdigitequalqueridiomamaisrapidamente:
Observe também que as letras à direita são classificadas em uma ordem específica, de modo que a direção principal (para cima, para o meio ou para baixo) escolhe entre os diferentes tipos (minúsculas, maiúsculas, números e pontuação); e então dentro de tal direção maior, sua direção menor escolherá entre A-Z, a-z, 0-9 e assim por diante. Eu usei isso no passado e fiquei realmente impressionado com o quão fluente isso é comparado a outros concorrentes ...
Observe também que o Dasher tem alguma configuração, então você pode ajustar algo que não gosta.