Dove trova il codice la nostra chiave?
Usando Process Monitor, scavando nel per l'evento ETL leggendo che la traccia dello stack di valori ci dà:
"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"
Possiamo vedere che OSKSettingsManager::GetOskSetting
legge il valore.
Quindi, che aspetto ha quella porzione? Possiamo eseguire il debug?
Esaminando quella funzione con WinDBG, accede subito a quella chiave di registro 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]
...
Ora, il problema qui è che quando provo a breakpoint in quella posizione non riesco più a digitare nulla perché si osk.exe
aggiunge ai driver di input. Questo può essere facilmente visto tenendo premuto un tasto modificatore come Altsulla tastiera, questo si illumina osk.exe
.
Guardando nel codice per aggiunte o sottrazioni, vedo solo qualcosa accadere con 40
esadecimali che è 64
decimale. Quindi anche questo non è correlato al numero.
Potrebbe essere in una delle quattro cmp
istruzioni (confronta), ma ciò richiederebbe informazioni di debug. Oppure potrebbe accadere in una funzione di livello superiore, il che richiederebbe ulteriori indagini. Ma senza la possibilità di eseguire il debug senza perdere le capacità di input, questa è una cosa molto difficile da fare ...
Sembra che trovare la posizione giusta richiederà un cavo di debug poiché il computer su cui si esegue il debug perde le sue capacità di input o è troppo lento a causa del sovraccarico del debug. Poiché al momento non ho un laptop con una porta del 1943, non riesco a eseguire questo debug da solo. Sarebbe in grado di farlo, e sì, bloccherebbe letteralmente il tuo sistema operativo. Il debug di un sistema operativo anziché di un'applicazione è divertente ... ^^
Aspetta, abbiamo accesso ai simboli! Possiamo trovare il codice offensivo?
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)
Dando un'occhiata più da vicino, noterai la funzione offensiva:
OSKSettingsManager::_KeepSettingValueInBounds(ulong,ulong *,int)
Se passiamo attraverso quella funzione vediamo prima:
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, questo confronta qualcosa e poi salta in un'altra posizione. Cosa c'è qui?
pop ebp
retn 8
Quindi, se la condizione decide che deve saltare, lascerà semplicemente la funzione e non cambierà nulla.
Quindi, come facciamo a lasciare sempre la funzione?
Cambia l' jz
istruzione in jmp
un'istruzione che fa sempre il salto, puoi trovarla all'offset relativo 41BC10
. Nel caso in cui il tuo programma calcoli offset diversi, devi sapere che usa 401000
come base, quindi la sottrazione ci dà l'offset assoluto 1AC10
.
Si noti che cambiando 74
( JZ
) nell'editor esadecimale in E9
( JMP
) non funzionerà. Non puoi farlo in un editor esadecimale, avrai bisogno di qualcosa che disassembla e riassembla il codice ma non è necessariamente facile da trovare (es. IDA Professional per il quale le persone effettivamente pagano, non è in grado di produrre un codice c adeguato o un eseguibile. OllyDBG, comunemente usato nella comunità delle patch, non può nemmeno aprire l'eseguibile.). E poi anche, Microsoft potrebbe proteggere il suo eseguibile da manomissioni, perché questo potrebbe essere considerato contro l'EULA; perciò buona fortuna!
Meh! È difficile, voglio solo digitare velocemente usando il mio mouse / occhi / ...
Dovresti assolutamente dare un'occhiata a Dasher, che è molto più veloce di una tastiera su schermo. Funziona semplicemente spostando il mouse verso le lettere; il movimento orizzontale determina la velocità e il movimento verticale seleziona le lettere. Con un dizionario incorporato può persino ridimensionare le lettere più probabili per essere più grandi, cerca anche di imparare dai tuoi movimenti in modo tale che la velocità e le lettere siano davvero abituate al tuo utilizzo.
Un'immagine parla più di mille parole ...
Naturalmente questo è piuttosto piccolo e non molto veloce in quanto è un esempio, ma potresti ridimensionarlo per essere sul lato destro dello schermo in modo che non interferisca con lo schermo. Ciò ti consente di digitare il più velocemente possibile ...
Ecco un buon esempio di come le previsioni ti consentono di digitare qualsiasi lingua più rapidamente:
Si noti inoltre che le lettere a destra sono ordinate in un ordine specifico, in modo tale che la direzione principale (su, metà o giù) scelga tra i diversi tipi (lettere minuscole, maiuscole, numeri e punteggiatura); e quindi all'interno di tale direzione maggiore, la direzione minore sceglierà tra AZ, az, 0-9 e così via. L'ho usato in passato e sono rimasto davvero sorpreso da quanto sia fluido rispetto ad altri concorrenti ...
Nota anche che Dasher ha una configurazione, quindi potresti essere in grado di regolare qualcosa che non ti piace.