Alterar valores de configuración específicos en el teclado en pantalla de Windows 7

9

Tengo que usar el teclado en pantalla de Windows 7 para escribir:

(En caso de que aún no lo haya usado, puede obtenerlo a través de: Todos los programas -> Accesorios -> Facilidad de acceso -> Teclado en pantalla

o simplemente busque "osk.exe")

Teclado en pantalla

Ofrece una función para "desplazarse" sobre los botones. Microsoft lo describe de la siguiente manera:

En el modo de desplazamiento, utiliza un mouse o un joystick para señalar una tecla durante un período de tiempo predefinido, y el carácter seleccionado se escribe automáticamente.

Ahí está mi problema específico. El período de tiempo predefinido es demasiado largo para ser útil para mí. El tiempo mínimo es de 0,5 segundos (máximo 3 segundos).

¿Hay alguna forma de alterar este valor a algo < 0.5? Por ejemplo, mediante la edición del registro?

Editar: la entrada HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodno se puede establecer a menos de 500 ms.

Editar (2): creo que la única forma de solucionar mi problema es descompilar el archivo .exe (supongo que está escrito en C o?) Y cambiar el tiempo mínimo. Entonces tengo que compilarlo de nuevo. ¿Es este procedimiento incluso viable? ¿Qué cosas pueden fallar?

¡Cualquier consejo útil sería genial!

primero
fuente
1
Volver a compilar será algo difícil, será 1) mayormente ilegible (incluso si usa los símbolos de Microsoft) y 2) no sabe dónde lo hace, por lo que puede moverse si encuentra una variable asignada a 500 o 0.5, pero aún así tiene que rastrear el camino donde fluye y 3) todavía tiene que volver a compilar todo, lo que a menudo no es posible debido a una descompilación incorrecta. Lamentablemente, la depuración tampoco es posible a menos que tenga un cable de depuración y conecte su computadora a otra ...
Tamara Wijsman
Creo que sería prudente dejarlo como está. Un personaje cada medio segundo no es tan malo, y si se vuelve demasiado rápido comenzarán a ocurrir errores.
cutrightjm
Como no puedo editar cómodamente mi comentario en esta publicación, esto podría ayudar a algunas personas que conocen C # u otros lenguajes a escribir un parche para esto: daniweb.com/hardware-and-software/microsoft-windows/threads/…
cutrightjm
@fnst: Si realmente estás interesado en la velocidad, considera Dasher . Lo
Tamara Wijsman
@ekaj: Eso solo incorpora la aplicación, por lo que puedo decir. ¿Puedes decirnos cómo eso ayudaría?
Tamara Wijsman

Respuestas:

7

¿Dónde en el código encuentra nuestra clave?

Usando Process Monitor, profundizando en el evento ETL que lee el seguimiento de la pila de valores nos da:

"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::GetOskSettinglee el valor.

Entonces, ¿cómo se ve esa porción? ¿Podemos depurarlo?

Analizando esa función con WinDBG, accede a esa clave de registro justo 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]
...

Ahora, el problema aquí es que cuando intento establecer un punto de interrupción en esa ubicación ya no puedo escribir nada porque se osk.exeagrega a los controladores de entrada. Esto se puede ver fácilmente manteniendo presionada una tecla modificadora como Alten su teclado, esto lo enciende osk.exe.

Al mirar el código en busca de sumas o restas, solo veo que algo sucede con 40hexadecimal que es 64decimal. Entonces eso tampoco es nada relacionado con el número.

Puede estar en una de las cuatro cmpinstrucciones (comparar), pero eso requeriría información de depuración. O podría suceder en una función superior, lo que requeriría más investigación. Pero sin la capacidad de depurarlo sin perder capacidades de entrada, esto es algo muy difícil de hacer ...

Parece que encontrar la ubicación correcta requerirá un cable de depuración ya que la computadora en la que depura pierde sus capacidades de entrada, o es demasiado lenta debido a la sobrecarga de la depuración. Como actualmente no tengo una computadora portátil con un puerto de 1943, no puedo hacer esta depuración yo mismo. Sería capaz de hacer esto, y sí, literalmente congelaría su sistema operativo. Depurar un sistema operativo en lugar de una aplicación es divertido ... ^^

¡Espera, tenemos acceso a los símbolos! ¿Podemos encontrar el código ofensivo?

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)

Mirando más de cerca, notará la función ofensiva:

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

Si pasamos por esa función, primero 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        

De acuerdo, esto compara algo y luego salta a otra ubicación. ¿Qué hay ahí?

pop     ebp
retn    8

Entonces, si la condición decide que debe saltar, simplemente abandonará la función y no cambiará nada.

Entonces, ¿cómo hacemos que siempre salga de la función?

Cambie la jzinstrucción a una jmpinstrucción que siempre haga el salto, puede encontrarla en un desplazamiento relativo 41BC10. En caso de que su programa calcule compensaciones diferentes, debe saber que las utiliza 401000como base, de modo que restar nos da la compensación absoluta 1AC10.

Tenga en cuenta que cambiar 74( JZ) en el editor hexadecimal a E9( JMP) no funcionará. No puede hacer esto en un editor hexadecimal, necesitará algo que desmonte y vuelva a ensamblar el código, pero que no sea necesariamente fácil de encontrar (por ejemplo, IDA Professional por el que las personas realmente pagan, no puede producir el código c adecuado o un ejecutable. OllyDBG, comúnmente utilizado en la comunidad de parches, ni siquiera puede abrir el ejecutable). Y luego, incluso, Microsoft podría estar protegiendo su ejecutable contra la manipulación, porque esto podría considerarse contra el EULA; ¡buena suerte!

Meh Esto es difícil, solo quiero escribir rápido usando mi mouse / ojos / ...

Definitivamente deberías echar un vistazo a Dasher, que es mucho más rápido que un teclado en pantalla. Simplemente funciona moviendo el mouse hacia las letras; El movimiento horizontal determina la velocidad y el movimiento vertical selecciona las letras. Con un diccionario incorporado, incluso puede dimensionar las letras más probables para que sean más grandes, también trata de aprender de su movimiento de modo que la velocidad y las letras estén realmente acostumbradas a su uso.

Una imagen habla más que mil palabras ...

Por supuesto, esto es bastante pequeño y no muy rápido, ya que es un ejemplo, pero puede cambiar su tamaño para que esté en el lado derecho de su pantalla de modo que no interfiera con su pantalla. Esto le permite escribir lo más rápido que pueda ...

Aquí hay un buen ejemplo de cómo las predicciones le permiten escribir cualquier idioma más rápidamente:

También tenga en cuenta que las letras a la derecha están ordenadas en un orden específico, de modo que la dirección principal (arriba, media o abajo) elige entre los diferentes tipos (minúsculas, mayúsculas, números y puntuación); y luego dentro de esa dirección principal, su dirección menor elegirá entre AZ, az, 0-9, etc. Lo he usado en el pasado y realmente me sorprendió lo fluido que es en comparación con otros competidores ...

También tenga en cuenta que Dasher tiene alguna configuración, por lo que es posible que pueda ajustar algo que no le gusta.

Tamara Wijsman
fuente
@harrymc: Si has leído, habrías Using Process Monitor, digging into the for the ETL event reading out that value stack trace gives us:sabido que verifiqué el seguimiento de la pila para el evento ETL. ¿Supongo que estás hablando de tus propias respuestas aquí? Debido a que responde con una gran cantidad, sus respuestas realmente carecen de cierta calidad. Considere mejorar y / o eliminar sus respuestas en lugar de colocar respuestas rápidas y sucias o comentarios tontos que no tienen la intención de mejorar las preguntas y respuestas; puedes adivinar qué enfoque ayudará más a la comunidad ...
Tamara Wijsman
1
@harrymc: (1) ¿Dónde dice que me estoy rompiendo ? Solo estoy mostrando un punto de partida aquí, no he fallado y he demostrado que se necesita equipo adicional o tarea para avanzar. La calidad está en mi respuesta, la cantidad debe ser realizada por el lector o cuando me encuentro con una configuración de depuración remota. (2) Googling Process Monitor y WinDBG no son ciencia espacial. (3) Gracias por el cumplido, ¿quizás debería explicar cómo funciona el ensamblaje en mi respuesta también?
Tamara Wijsman
@harrymc: Mi respuesta es un buen punto de partida. Su error radica en no proporcionar suficientes detalles, como lo demuestran tanto su respuesta como sus comentarios en esta pregunta. Acabas de encontrar la necesidad de colocar otro comentario que no intente mejorar mi respuesta o que no diga qué está mal, te tomará más tiempo poner una respuesta que muestre esfuerzo en lugar de ser demasiado genérico . No veo cómo The decompilation help. Once located, you should patch the binary code.es útil, preferiría un ejercicio ultra largo y para llevar a casa en lugar de rascarse el cabello ...
Tamara Wijsman
@harrymc: Estás asumiendo que es de propósito general; pero, si hubiera verificado sus referencias y dependencias, habría visto que no destruye ningún comportamiento después de sobrescribir su propia configuración, que se carga únicamente desde esa clave de registro. He comprobado sus referencias y dependencias, así que sé los usos. ¿Vas a borrar tu último comentario también? ;)
Tamara Wijsman
Si realmente lo has descifrado, entonces estás a solo unos minutos de crear un osk parcheado. ¿Por qué no terminar el trabajo y dejar que el cartel juzgue?
harrymc
2

Me temo que la mayoría de los descompiladores no producirán un resultado lo suficientemente bueno que se pueda volver a compilar.

La descompilación solo puede ayudar a determinar el área que HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodse utiliza, para descubrir dónde se lee este valor y dónde se aplica el límite de 500 ms.

Una vez ubicado, debe parchear el código binario para deshabilitar la prueba y hacer que HoverPeriod sea más pequeño. Parchear el binario es mucho más factible que recompilar.

Es posible que deba repetir el esfuerzo si osk.exe alguna vez se reemplaza por Windows Update (que realmente no espero que suceda).

[EDITAR]

Para ayudarlo más en el camino, aquí hay algunas palabras sobre utilidades y su uso.

Puede usar un descompilador C o un desensamblador. El tipo posterior puede ser más útil, aunque requiere un pequeño conocimiento del conjunto de instrucciones de Intel. También necesitará un buen editor hexadecimal, y hay algunos que anuncian capacidades de desensamblador (consulte el enlace a continuación).

El proyecto Fenris se anuncia a sí mismo como "un conjunto de herramientas adecuadas para el análisis de código, depuración, análisis de protocolo, ingeniería inversa, análisis forense, diagnóstico, auditorías de seguridad, investigación de vulnerabilidades y muchos otros propósitos". Suena bien y recomendado por muchos, pero no tengo experiencia con eso.

REC Studio Decompiler intenta producir una representación tipo C del código y los datos utilizados para construir el archivo ejecutable.

Boomerang es un descompilador general, de código abierto, retargetable de programas de código de máquina.

Se pueden encontrar muchas más de estas utilidades buscando en Google o en:

wikibooks x86 Desmontaje / Herramientas de análisis
wikibooks x86 Desmontaje / Desmontadores y descompiladores
Directorio abierto: Desmontadores

Un paso preliminar es desmontar osk. El listado resultante puede ser voluminoso y requerir un buen editor de texto (normalmente, Notepad ++ es suficiente).

Busque la cadena "HoverPeriod" (no distingue entre mayúsculas y minúsculas). Si tiene suerte, el desensamblador lo ha identificado como una cadena y puede encontrarlo tal como está. De lo contrario, deberá buscarlo byte a byte. Como una cadena Unicode, se verá H,0,o,0,v,0...donde las letras deben ser reemplazadas por sus códigos numéricos.

Una vez que haya encontrado la cadena "HoverPeriod", el desensamblador debería haber colocado una etiqueta en algún lugar antes. Use el nombre de esta etiqueta generada para buscar dónde se usa, para identificar dónde se recupera del registro y en qué variable global se almacena el resultado.

Una vez que haya localizado la variable que contiene el conteo, busque dónde se usa. Lo que hará dependerá del formato del código que encontrará. Luego puede decidir el parche que desee.

Por ejemplo, es posible que desee utilizar el editor hexadecimal para reemplazar en osk.exe un comando como:

move AX,<HoverPeriod milliseconds count variable>

dentro

mov AX,200       (your count of 200 milliseconds)

Tenga cuidado con las diferentes longitudes de comando, donde si el nuevo comando es más corto, deberá rellenarse con instrucciones NOP de un byte (sin operación) a la longitud de la instrucción anterior.

La localización del comando para parchar en osk.exe puede requerir buscar si las compensaciones que proporciona el desensamblador están en el código y no en el archivo exe. Si el editor hexadecimal no admite la búsqueda de ensamblador, realice el desmontaje mientras enumera los bytes de instrucciones originales para que sepa qué bytes binarios buscar. Evite buscar instrucciones que contengan direcciones, ya que las direcciones pueden reubicarse en el archivo exe, por lo tanto, busque una secuencia de bytes cercana a dicha instrucción.

Puede crear los nuevos bytes de parche directamente en el editor hexadecimal si es compatible con el ensamblador. O si no lo hace y no se siente cómodo con el código de máquina Intel, busque un ensamblador para compilar su nuevo código y use su listado para obtener los bytes compilados que se usarán para parchear.

harrymc
fuente
Cambiar el valor no funcionará dado que se sobrescribe con una función más genérica. Cambiar cada valor que obtiene del registro interrumpirá la aplicación. Vea mi respuesta para esta función genérica. Como resultado, un editor hexadecimal no funcionará, por lo que se trata de encontrar el (de) ensamblador (o [compilador]) correcto.
Tamara Wijsman
1

¿Puedo sugerir usar AutoIt para automatizar el clic?

La idea sería monitorear el ralentí del mouse cuando el cursor está dentro de la ventana en pantalla (por ejemplo, en un bucle de control, verificando a intervalos regulares si el cursor ha cambiado de posición) y hacer clic automáticamente (llamar a la función SendClick) después de, por ejemplo, 100 ms de inactividad

Supera ingeniería inversa un .exe.

minya
fuente
+1 para convertir "Necesito que haga clic más rápido" en "Lo dejo hacer clic más rápido de manera inteligente".
Tamara Wijsman
0

Quizás no tenga que recompilar todo. En el mundo del juego es común usar entrenadores, que manipulan un valor en la memoria cuando el programa se está ejecutando. Si encuentra el valor mínimo en la memoria (0.5) y programa algo como un cargador para reducir ese número, podría funcionar.

Pwdr
fuente
Eso podría funcionar, solo si el valor está en la misma ubicación o el valor X que tiene ese valor. En cualquier caso, T Search y Quick Memory Editor son dos buenas herramientas para probar esto. Es posible que desee buscar en su 500lugar, ya que así es como lo carga, no como flotante.
Tamara Wijsman
Al primer intento, parece que osk.exeno está en la lista de procesos. Esto se debe a que se inicia en el contexto de winlogontal manera que funciona en todos los usuarios, puede evitar esto iniciando el editor de memoria también en el contexto winlogon.
Tamara Wijsman
Consulte stackoverflow.com/questions/9868079/… y stackoverflow.com/a/3143055/47064 para obtener un enfoque para hacerlo, el enfoque fácil es reemplazarlo, osk.exepero eso solo funcionaría si crea un iniciador que inicie tanto el editor de memoria como La copia de seguridad osk.exe. Pero entonces tendrías que considerar que un cargador también necesitaría hacer eso. Parece que esta solución se está volviendo tan difícil como desarmar y ensamblar, osk.exees difícil ... :)
Tamara Wijsman