¿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::GetOskSetting
lee 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.exe
agrega 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 40
hexadecimal que es 64
decimal. Entonces eso tampoco es nada relacionado con el número.
Puede estar en una de las cuatro cmp
instrucciones (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 jz
instrucción a una jmp
instrucció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 401000
como 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.