Alterando valores de configuração específicos no teclado virtual do Windows 7

9

Preciso usar o teclado virtual do Windows 7 para digitar:

(Caso ainda não o tenha usado, você pode obtê-lo através de: Todos os programas -> Acessórios -> Facilidade de acesso -> Teclado na tela

ou simplesmente pesquise "osk.exe")

Teclado na tela

Ele oferece um recurso para "pairar" sobre os botões. A Microsoft descreve o seguinte:

No modo de foco, use o mouse ou o joystick para apontar para uma tecla por um período predefinido e o caractere selecionado é digitado automaticamente.

Esse é o meu problema específico. O período de tempo predefinido é muito longo para ser útil para mim. O tempo mínimo é de 0,5 segundos (máximo de 3 segundos).

Existe alguma maneira de alterar esse valor para algo < 0,5? Por exemplo, através da edição do registro?

Editar: a entrada HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodnão pode ser definida como inferior a 500 ms.

Edit (2): Eu acho que a única maneira de corrigir o meu problema é descompilar o arquivo .exe (acho que está escrito em C ou?) E alterar o tempo mínimo. Então eu tenho que compilá-lo novamente. Este procedimento é viável? Que coisas poderiam falhar?

Qualquer dica útil seria ótima!

primeiro
fonte
1
A recompilação vai ser uma coisa difícil, será 1) principalmente ilegível (mesmo se você usar os símbolos da Microsoft) e 2) você não souber onde isso faz essa verificação, para que você possa se locomover se encontrar uma variável atribuída a 500 ou 0,5, mas ainda assim você precisa rastrear o caminho para onde ele flui e 3) você ainda precisa recompilar tudo, o que geralmente não é possível devido à má descompilação. Infelizmente, a depuração também não é possível a menos que tenha um cabo de depuração e anexar o seu computador para outro ...
Tamara Wijsman
Eu acho que seria sensato apenas deixar como está. Um personagem a cada meio segundo não é tão ruim e, se ficar muito rápido, erros começarão a ocorrer.
Cutrightjm 29/03/12
Como não consigo editar convenientemente meu comentário nesta publicação, isso pode ajudar algumas pessoas que conhecem C # ou outros idiomas a escrever um patch para isso: daniweb.com/hardware-and-software/microsoft-windows/threads/…
cutrightjm
@fnst: Se você realmente está interessado em velocidade, considere o Dasher . Vou descrevê-lo na minha resposta ...
Tamara Wijsman 29/03
@ekaj: Isso apenas incorpora o aplicativo, até onde eu sei. Você pode nos dizer como isso ajudaria?
Tamara Wijsman

Respostas:

7

Onde no código ele encontra nossa chave?

Usando o Process Monitor, pesquisar no evento ETL lendo esse rastreamento de 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::GetOskSettinglê o valor.

Então, como é essa parte? Podemos depurar?

Examinando essa função com o WinDBG, ele acessa a chave do registro logo antes 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 nesse local, não consigo mais digitar nada, porque se osk.exeadiciona aos drivers de entrada. Isso pode ser facilmente visto pressionando uma tecla modificadora, como Altno teclado, isso acende osk.exe.

Olhando através do código para adições ou subtrações, só vejo algo acontecer com 40hexadecimal, que é 64decimal. Então, isso também não está relacionado ao número.

Pode estar em uma das quatro cmpinstruções (comparar), mas isso exigiria informações de depuração. Ou isso poderia acontecer em uma função superior, o que exigiria mais investigação. Mas sem a capacidade de depurá-lo sem perder os recursos de entrada, isso é algo 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 é muito lento devido à sobrecarga da depuração. Como atualmente não tenho um laptop com uma porta de 1943, não consigo fazer isso depurando sozinho. Seria capaz de fazer isso e, sim, literalmente congelaria seu sistema operacional. Depurar um SO em vez de um aplicativo é divertido ... ^^

Espere, 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 percorrermos essa função, veremos primeiro:

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á?

pop     ebp
retn    8

Portanto, se a condição decidir que deve pular, ela deixará a função e não mudará nada.

Então, como fazemos com que ela sempre saia da função?

Mude a jzinstrução para uma jmpinstrução que sempre salte; você pode encontrá-la em deslocamento relativo 41BC10. Caso seu programa calcule deslocamentos diferentes, você precisa saber que ele usa 401000como base, para subtrair nos fornece o deslocamento absoluto 1AC10.

Observe que alterar 74( JZ) no editor hexadecimal para E9( JMP) não funcionará. Você não pode fazer isso em um editor hexadecimal, precisará de algo que desmonte e remonte o código, mas isso não é necessariamente fácil de encontrar (por exemplo, o IDA Professional pelo qual as pessoas realmente pagam, não podem produzir o código c ou um executável adequado. O OllyDBG, comumente usado na comunidade de patches, nem consegue abrir o executável.). E mesmo assim, a Microsoft pode estar protegendo seu executável contra adulteração, porque isso pode ser considerado contra o EULA; então boa sorte!

Meh! Isso é difícil, eu só quero digitar rápido usando o mouse / olhos / ...

Você deve definitivamente conferir o Dasher, que é muito mais rápido que um teclado na tela. Simplesmente funciona movendo o mouse em direção a letras; o movimento horizontal determina a velocidade e o movimento vertical seleciona as letras. Com um dicionário incorporado, ele pode até dimensionar as letras mais prováveis ​​de serem maiores, mas também tenta aprender com o seu movimento, de modo que a velocidade e as letras estejam realmente acostumadas ao seu uso.

Uma imagem fala mais que mil palavras ...

É claro que isso é pequeno e não é muito rápido, como exemplo, mas você pode redimensioná-lo para ficar no lado direito da tela, de modo que não interfira na tela. Isso permite que você digite o mais rápido possível ...

Aqui está um bom exemplo de como as previsões permitem que você digite qualquer idioma mais rapidamente:

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 cima ou para baixo) escolha entre os diferentes tipos (minúsculas, maiúsculas, números e pontuação); e, nessa direção principal, sua direção menor escolherá entre AZ, az, 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 possui alguma configuração; portanto, você pode ajustar algo que não gosta.

Tamara Wijsman
fonte
@harrymc: Se você leu Using Process Monitor, digging into the for the ETL event reading out that value stack trace gives us:, saberia que verifiquei o rastreamento de pilha para o evento ETL. Eu acho que você está falando sobre suas próprias respostas aqui? Por responder a uma quantidade alta, suas respostas carecem seriamente de alguma qualidade. Considere melhorar e / ou remover suas respostas em vez de colocar respostas rápidas e sujas ou comentários tolos que não pretendem melhorar as perguntas e respostas; você pode adivinhar qual abordagem vai ajudar a comunidade a mais ...
Tamara Wijsman
1
@harrymc: (1) Onde diz que estou rachando ? Estou apenas mostrando um ponto de partida aqui, não falhei e mostrei que é necessário equipamento extra ou lição de casa para prosseguir. A qualidade está na minha resposta, a quantidade precisa ser feita pelo leitor ou quando eu me deparo com uma instalação de depuração remota. (2) O Monitor de processos do Google e o WinDBG não são ciência do foguete. (3) Obrigado pelo elogio, talvez eu devesse explicar também como a montagem funciona na minha resposta?
Tamara Wijsman
@harrymc: Minha resposta é um bom ponto de partida. Seu erro está em não fornecer detalhes suficientes, como mostra sua resposta e comentários nesta pergunta. Você acabou de achar necessário colocar outro comentário que não tem a intenção de melhorar minha resposta ou não diz o que há de errado com isso; vai demorar um pouco mais para você colocar uma resposta que mostre esforço, em vez de ser genérica demais . Eu não vejo como o seu The decompilation help. Once located, you should patch the binary code.é útil, prefiro preferem ultra-longa e um exercício para levar para casa, em vez de riscar de cabelo ...
Tamara Wijsman
@harrymc: Você está assumindo que é de uso geral; mas, se você tivesse verificado suas referências e dependências, veria que ele não destrói nenhum comportamento que substituiu sua própria configuração, carregada apenas a partir dessa chave do Registro. Eu verifiquei suas referências e dependências, então eu sei os usos. Você também excluirá seu último comentário? ;)
Tamara Wijsman
Se você realmente o decifrou, está apenas a alguns minutos de criar um osk corrigido. Por que não terminar o trabalho e deixar o pôster julgar?
harrymc
2

Receio que a maioria dos descompiladores não produza um resultado bom o suficiente que possa ser recompilado.

A descompilação pode ajudar apenas a identificar a área HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodusada, para descobrir onde esse valor é lido e onde o limite de 500 ms é imposto.

Uma vez localizado, você deve corrigir o código binário para desativar o teste e fazer com que o HoverPeriod seja menor. A correção do binário é muito mais viável do que recompilar.

Pode ser necessário repetir o esforço se o osk.exe for substituído pelo Windows Update (o que realmente não espero que aconteça).

[EDITAR]

Para ajudá-lo mais no caminho, aqui estão algumas palavras sobre utilitários e seu uso.

Você pode usar um descompilador C ou um desmontador. O tipo posterior pode ser mais útil, embora exija pouco conhecimento do conjunto de instruções da Intel. Você também precisará de um bom editor hexadecimal e há alguns que anunciam recursos de desmontagem (veja o link abaixo).

O projeto fenris se anuncia como "conjunto de ferramentas adequadas para análise de código, depuração, análise de protocolo, engenharia reversa, forense, diagnóstico, auditorias de segurança, pesquisa de vulnerabilidades e muitos outros propósitos". Parece bom e recomendado por muitos, mas não tenho experiência com isso.

O REC Studio Decompiler tenta produzir uma representação semelhante ao C do código e dados usados ​​para criar o arquivo executável.

O Boomerang é um decompilador geral, de código aberto e não segmentável, de programas de código de máquina.

Muitos outros utilitários podem ser encontrados no Google, ou em:

Ferramentas de análise / desmontagem do
wikibooks x86 wikibooks Desmontagem / desmontagem e descompilação do wikibooks x86
Open Directory: Desmontadores

Uma etapa preliminar é desmontar o osk. A listagem resultante pode ser volumosa e exigir um bom editor de texto (normalmente o bloco de notas ++ é suficiente).

Procure a sequência "HoverPeriod" (sem distinção entre maiúsculas e minúsculas). Se você tiver sorte, o desmontador identificou-o como uma string e você pode encontrá-lo como está. Caso contrário, será necessário procurá-lo byte a byte. Como uma string Unicode, parecerá H,0,o,0,v,0...onde as letras devem ser substituídas por seus códigos numéricos.

Depois de encontrar a string "HoverPeriod", o desmontador deve ter colocado um rótulo em algum lugar antes dela. Use o nome desse rótulo gerado para procurar onde é usado, para identificar onde é recuperado do registro e em qual variável global é o resultado armazenado.

Depois de localizar a variável que contém a contagem, procure onde ela é usada. O que você fará depende do formato do código que você encontrará. Você pode então decidir sobre o patch que deseja.

Por exemplo, convém usar o editor hexadecimal para substituir no osk.exe um comando como:

move AX,<HoverPeriod milliseconds count variable>

para dentro

mov AX,200       (your count of 200 milliseconds)

Tenha cuidado com diferentes comprimentos de comando, pois se o novo comando for mais curto, ele precisará ser preenchido com instruções NOP de um byte (sem operação) com o comprimento da instrução antiga.

Localizar o comando para corrigir o arquivo osk.exe pode exigir uma pesquisa se as compensações fornecidas pelo desmontador estão no código e não no arquivo exe. Se o editor hexadecimal não suportar a pesquisa de assembler, faça a desmontagem ao listar os bytes de instruções originais para saber quais bytes binários procurar. Evite procurar instruções que contenham endereços, pois os endereços podem ser realocados no exe; portanto, procure uma sequência de bytes próxima a essa instrução.

Você pode criar os novos bytes de patch diretamente no editor hexadecimal, se ele suportar o assembler. Ou, se isso não acontecer e você não se sentir à vontade com o código de máquina Intel, encontre um montador para compilar seu novo código e use sua listagem para obter os bytes compilados a serem utilizados para aplicação de patches.

harrymc
fonte
Alterar o valor não funcionará, pois ele é substituído por uma função mais genérica. Alterar todos os valores que obtém do registro interromperá o aplicativo. Veja minha resposta para esta função genérica. Como um editor hexadecimal não funcionará como resultado, é necessário encontrar o (des) assembler (ou o [de] compilador) correto.
Tamara Wijsman
1

Posso sugerir o uso do AutoIt para automatizar o clique?

A idéia seria monitorar a ociosidade do mouse quando o cursor estiver dentro da janela da tela (por exemplo, em um loop de controle, verificando regularmente se o cursor mudou de posição) e clicar automaticamente (função de chamada SendClick) após, digamos, 100 ms de inatividade.

Bate engenharia reversa um .exe.

minya
fonte
+1 para transformar "Eu preciso clicar mais rápido" em "Eu deixo clicar mais rápido da maneira inteligente".
Tamara Wijsman
0

Talvez você não precise recompilar tudo. No mundo do jogo, é comum o uso de treinadores, que manipulam um valor na memória quando o programa está sendo executado. Se você encontrar o valor mínimo na memória (0,5) e programar algo como um carregador para diminuir esse número, ele poderá funcionar.

Pwdr
fonte
Isso pode funcionar, apenas se o valor estiver no mesmo local ou o décimo valor que tiver esse valor. De qualquer forma, o T Search e o Quick Memory Editor são duas boas ferramentas para tentar fazer isso. Você pode procurar em 500vez disso, pois é assim que ele é carregado, não como um flutuador.
Tamara Wijsman
Na primeira tentativa, parece que osk.exenão está na lista de processos. Isso ocorre porque ele é iniciado no contexto e winlogon, assim, funciona entre os usuários. Você pode contornar isso iniciando o editor de memória winlogontambém.
Tamara Wijsman
Consulte stackoverflow.com/questions/9868079/… e stackoverflow.com/a/3143055/47064 para obter uma abordagem para fazer isso; a abordagem fácil é substituir, osk.exemas isso só funcionaria se você criar um iniciador que inicie o editor de memória e o backup osk.exe. Mas então você teria que considerar que um carregador também precisaria fazer isso. Parece que esta solução está ficando tão difícil como desmontagem e montagem, osk.exeé difícil ... :)
Tamara Wijsman