Di mana dalam kode itu menemukan kunci kami?
Menggunakan Process Monitor, menggali untuk acara ETL membaca bahwa jejak tumpukan nilai memberi kita:
"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"
Kita bisa melihat yang OSKSettingsManager::GetOskSetting
membacakan nilainya.
Jadi, seperti apa bagian itu? Bisakah kita debug itu?
Melihat ke fungsi itu dengan WinDBG, ia mengakses kunci registri itu sebelumnya 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]
...
Sekarang, masalahnya di sini adalah ketika saya mencoba untuk breakpoint di lokasi itu saya tidak bisa lagi mengetik apa pun karena osk.exe
menambahkan sendiri ke driver input. Ini dapat dengan mudah dilihat dengan menahan tombol pengubah seperti Altpada keyboard Anda, ini menyalakannya osk.exe
.
Melihat melalui kode untuk penambahan atau pengurangan, saya hanya melihat sesuatu terjadi dengan 40
heksadesimal yang 64
desimal. Jadi itu juga tidak ada hubungannya dengan angka.
Mungkin dalam salah satu dari empat cmp
(bandingkan) instruksi, tetapi itu akan membutuhkan informasi debug. Atau itu bisa terjadi pada fungsi yang lebih tinggi sama sekali, yang akan membutuhkan penyelidikan lebih lanjut. Tetapi tanpa kemampuan untuk debug tanpa kehilangan kemampuan input, ini adalah hal yang sangat sulit untuk dilakukan ...
Tampaknya menemukan lokasi yang tepat akan memerlukan kabel debug karena komputer tempat Anda debug kehilangan kemampuan inputnya, atau terlalu lambat karena overhead debugging. Karena saya saat ini tidak memiliki laptop dengan port 1943, saya tidak dapat melakukan debugging ini sendiri. Itu akan dapat melakukan ini, dan ya, itu benar-benar akan membekukan OS Anda. Mendebug OS bukan aplikasi itu menyenangkan ... ^^
Tunggu, kami memiliki akses ke simbol! Bisakah kita menemukan kode yang menyinggung?
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)
Melihat lebih dekat, Anda akan melihat fungsi yang menyinggung:
OSKSettingsManager::_KeepSettingValueInBounds(ulong,ulong *,int)
Jika kita berjalan melalui fungsi itu pertama-tama kita melihat:
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
Oke, ini membandingkan sesuatu dan kemudian melompat ke lokasi lain. Ada apa disana?
pop ebp
retn 8
Jadi, jika kondisinya memutuskan bahwa ia harus melompat, ia hanya akan meninggalkan fungsinya dan tidak mengubah apa pun.
Jadi, bagaimana kita membuatnya selalu meninggalkan fungsinya?
Ubah jz
instruksi menjadi jmp
instruksi yang selalu melakukan lompatan, Anda dapat menemukannya di offset relatif 41BC10
. Jika program Anda menghitung offset berbeda, Anda perlu tahu bahwa itu digunakan 401000
sebagai dasar sehingga mengurangi memberi kita offset absolut 1AC10
.
Harap perhatikan bahwa mengubah 74
( JZ
) di hex editor ke E9
( JMP
) tidak akan berfungsi. Anda tidak dapat melakukan ini dalam hex editor, Anda akan membutuhkan sesuatu yang membongkar dan menyusun kembali kode tetapi itu tidak selalu mudah ditemukan (mis. IDA Professional yang orang bayar sebenarnya, tidak dapat menghasilkan kode c yang tepat atau dapat dieksekusi. OllyDBG, yang biasa digunakan dalam komunitas patch, bahkan tidak bisa membuka executable.). Dan bahkan kemudian, Microsoft mungkin melindungi executable-nya dari gangguan, karena ini dapat dianggap melawan EULA; jadi, semoga berhasil!
Ah! Ini sulit, saya hanya ingin mengetik cepat menggunakan mouse / mata / ...
Anda pasti harus memeriksa Dasher yang jauh lebih cepat daripada Keyboard di Layar. Ini hanya bekerja dengan menggerakkan mouse Anda ke arah huruf; gerakan horizontal menentukan kecepatan dan gerakan vertikal memilih huruf. Dengan kamus yang terpasang di dalamnya, bahkan ukuran surat yang paling besar kemungkinan akan lebih besar, ia juga mencoba belajar dari gerakan Anda sehingga kecepatan dan huruf benar-benar terbiasa dengan penggunaan Anda.
Sebuah gambar berbicara lebih dari seribu kata ...
Tentu saja ini agak kecil dan tidak terlalu cepat sebagai contoh, tetapi Anda dapat mengubah ukurannya agar berada di sisi kanan layar Anda sehingga tidak mengganggu layar Anda. Ini memungkinkan Anda mengetik secepat mungkin ...
Berikut adalah contoh yang bagus tentang bagaimana prediksi memungkinkan Anda mengetikkan bahasa apa pun dengan lebih cepat:
Juga perhatikan bahwa huruf-huruf di sebelah kanan diurutkan dalam urutan tertentu, sehingga arah utama (atas, tengah atau bawah) memilih antara jenis yang berbeda (huruf kecil, huruf besar, angka dan tanda baca); dan kemudian dalam arah utama seperti itu, arah minor Anda akan memilih antara AZ, az, 0-9 dan seterusnya. Saya telah menggunakan ini di masa lalu dan benar-benar kagum dengan betapa fasihnya ini dibandingkan dengan pesaing lain ...
Perhatikan juga bahwa Dasher memiliki beberapa konfigurasi, jadi Anda mungkin dapat menyesuaikan sesuatu yang tidak Anda sukai.