Mengubah nilai konfigurasi tertentu di Papan Ketik Windows 7


9

Saya harus menggunakan Keyboard Di Layar Windows 7 untuk mengetik:

(Jika Anda belum menggunakannya, Anda bisa mendapatkannya melalui: Semua Program -> Aksesori -> Kemudahan Akses -> Keyboard Di Layar

atau cukup cari "osk.exe")

Keyboard di Layar

Ini menawarkan fitur untuk "mengarahkan" tentang tombol. Microsoft menjelaskannya sebagai berikut:

Dalam mode melayang, Anda menggunakan mouse atau joystick untuk menunjuk ke tombol untuk periode waktu yang telah ditentukan, dan karakter yang dipilih diketik secara otomatis.

Ada masalah khusus saya. The periode yang telah ditetapkan waktu terlalu lama untuk menjadi berguna bagi saya. Jumlah waktu minimum adalah 0,5 detik (maks. 3 detik).

Apakah ada cara untuk mengubah nilai ini menjadi sesuatu < 0,5? Misalnya melalui pengeditan registri?

Sunting: Entri HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodtidak dapat diatur lebih rendah dari 500 ms.

Sunting (2): Saya pikir satu-satunya cara untuk memperbaiki masalah saya, adalah dengan mendekompilasi .exe (saya kira itu ditulis dalam C, atau?) Dan mengubah waktu minimum. Maka saya harus mengkompilasinya lagi. Apakah prosedur ini bisa diterapkan? Hal-hal apa yang bisa gagal?

Setiap tip bermanfaat akan sangat bagus!


1
Kompilasi ulang akan menjadi hal yang sulit, itu akan menjadi 1) sebagian besar tidak dapat dibaca (bahkan jika Anda menggunakan Microsoft Symbols) dan 2) Anda tidak tahu di mana ia melakukan pengecekan sehingga Anda bisa berkeliling jika Anda menemukan variabel yang ditugaskan ke 500 atau 0,5 tetapi kemudian Anda masih harus melacak jalan di mana ia mengalir dan 3) Anda masih harus mendapatkan semuanya dikompilasi ulang yang sering kali tidak mungkin karena dekompilasi yang buruk. Sedihnya, debugging juga tidak mungkin kecuali Anda memiliki kabel debug dan memasang komputer Anda ke yang lain ...
Tamara Wijsman

Saya pikir akan bijaksana jika membiarkannya apa adanya. Satu karakter setiap setengah detik tidak terlalu buruk, dan jika terlalu cepat kesalahan akan mulai terjadi.
cutrightjm

Karena saya tidak dapat dengan mudah mengedit komentar saya pada posting ini, ini mungkin membantu beberapa orang yang tahu C # atau bahasa lain untuk menulis tambalan untuk ini: daniweb.com/hardware-and-software/microsoft-windows/threads/…
cutrightjm

@ pertama: Jika Anda benar-benar tertarik pada kecepatan, pertimbangkan Dasher . Saya akan menguraikannya dalam jawaban saya ...
Tamara Wijsman

@ekaj: Itu hanya menyematkan aplikasi, sejauh yang saya tahu. Bisakah Anda memberi tahu kami bagaimana itu akan membantu?
Tamara Wijsman

Jawaban:


7

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::GetOskSettingmembacakan 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.exemenambahkan 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 40heksadesimal yang 64desimal. 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 jzinstruksi menjadi jmpinstruksi yang selalu melakukan lompatan, Anda dapat menemukannya di offset relatif 41BC10. Jika program Anda menghitung offset berbeda, Anda perlu tahu bahwa itu digunakan 401000sebagai 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.


@harrymc: Jika Anda telah membaca Using Process Monitor, digging into the for the ETL event reading out that value stack trace gives us:Anda akan tahu bahwa saya memeriksa jejak stack untuk acara ETL. Saya kira Anda berbicara tentang jawaban Anda sendiri di sini? Karena menjawab dengan jumlah tinggi, jawaban Anda benar-benar kurang berkualitas. Pertimbangkan untuk meningkatkan dan / atau menghapus jawaban Anda alih-alih menempatkan jawaban cepat yang kotor atau komentar konyol yang tidak bermaksud untuk meningkatkan T&J; Anda bisa menebak pendekatan mana yang paling membantu komunitas ...
Tamara Wijsman

1
@harrymc: (1) Di mana katanya saya retak ? Saya hanya menunjukkan titik awal di sini, saya tidak gagal dan saya telah menunjukkan bahwa peralatan atau pekerjaan rumah tambahan diperlukan untuk melanjutkan. Kualitasnya ada dalam jawaban saya, kuantitasnya harus dilakukan oleh pembaca atau ketika saya menemukan pengaturan debugging jarak jauh. (2) Monitor Proses Googling dan WinDBG bukanlah ilmu roket. (3) Terima kasih atas pujiannya, mungkin saya harus menjelaskan cara kerja majelis dalam jawaban saya juga?
Tamara Wijsman

@harrymc: Jawaban saya adalah titik awal yang baik. Kesalahan Anda terletak pada tidak memberikan detail yang cukup, seperti yang ditunjukkan oleh jawaban dan komentar Anda dalam pertanyaan ini. Anda baru saja merasa perlu untuk menempatkan komentar lain yang tidak bermaksud meningkatkan jawaban saya atau tidak mengatakan apa yang salah dengan itu, itu akan membawa Anda lebih banyak waktu untuk memberikan jawaban yang menunjukkan usaha alih-alih terlalu umum . Saya tidak melihat bagaimana Anda The decompilation help. Once located, you should patch the binary code.berguna, saya lebih suka latihan yang sangat panjang dan dibawa pulang daripada menggaruk rambut ...
Tamara Wijsman

@harrymc: Anda menganggap itu untuk tujuan umum; tetapi, jika Anda akan memeriksa referensi dan dependensinya Anda akan melihat bahwa itu tidak merusak perilaku apa pun yang lalu menimpa konfigurasi sendiri, yang dimuat hanya dari kunci registri. Saya telah memeriksa referensi dan dependensinya, jadi saya tahu kegunaannya. Apakah Anda akan menghapus komentar terakhir Anda juga? ;)
Tamara Wijsman

Jika Anda benar-benar memecahkannya, maka Anda hanya perlu beberapa menit untuk membuat osk yang ditambal. Mengapa tidak menyelesaikan pekerjaan dan membiarkan poster menilai?
harrymc

2

Saya khawatir sebagian besar pengurai tidak akan menghasilkan hasil yang cukup baik yang dapat dikompilasi ulang.

Dekompilasi hanya dapat membantu menentukan area yang HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPerioddigunakan, untuk mengetahui di mana nilai ini dibaca dan di mana batas 500 ms ditegakkan.

Setelah ditemukan, Anda harus menambal kode biner untuk menonaktifkan tes dan menegakkan HoverPeriod menjadi lebih kecil. Menambal biner jauh lebih layak daripada mengkompilasi ulang.

Anda mungkin perlu mengulangi upaya ini jika osk.exe pernah diganti oleh Pembaruan Windows (yang saya tidak benar-benar harapkan terjadi).

[EDIT]

Untuk membantu Anda lebih lanjut dalam perjalanan, berikut adalah beberapa kata tentang utilitas dan penggunaannya.

Anda bisa menggunakan dekompiler C atau disassembler. Jenis yang lebih baru mungkin lebih bermanfaat, meskipun memerlukan sedikit pengetahuan tentang set instruksi Intel. Anda juga akan memerlukan hex editor yang baik, dan ada beberapa yang mengiklankan kemampuan disassembler (lihat tautan di bawah).

proyek fenris mengiklankan dirinya sebagai "seperangkat alat yang cocok untuk analisis kode, debugging, analisis protokol, rekayasa terbalik, forensik, diagnostik, audit keamanan, penelitian kerentanan dan banyak tujuan lain". Kedengarannya bagus dan direkomendasikan oleh banyak orang, tetapi saya tidak memiliki pengalaman dengannya.

REC Studio Decompiler berupaya menghasilkan representasi kode-C seperti dan data yang digunakan untuk membangun file yang dapat dieksekusi.

Boomerang adalah dekompiler program kode mesin yang umum, open source, dan dapat ditargetkan ulang.

Banyak lagi utilitas semacam itu dapat ditemukan dengan googling, atau di:

wikibooks x86 Disassembly / Alat Analisis
wikibooks x86 Disassembly / Disassembler dan Decompiler
Direktori Terbuka: Disassembler

Langkah awal adalah membongkar osk. Daftar yang dihasilkan mungkin banyak dan memerlukan editor teks yang baik (biasanya notepad ++ sudah cukup).

Cari string "HoverPeriod" (case-sensitive). Jika Anda beruntung, disassembler telah mengidentifikasinya sebagai string dan Anda dapat menemukannya apa adanya. Jika tidak, Anda harus mencarinya byte-by-byte. Sebagai string Unicode akan terlihat seperti di H,0,o,0,v,0...mana huruf harus diganti dengan kode numerik mereka.

Setelah Anda menemukan string "HoverPeriod", disassembler harus meletakkan label di suatu tempat sebelumnya. Gunakan nama label yang dihasilkan ini untuk mencari di mana ia digunakan, untuk mengidentifikasi di mana ia diambil dari registri dan di mana variabel global adalah hasilnya disimpan.

Setelah Anda menemukan variabel yang menyimpan hitungan, cari tempat variabel itu digunakan. Apa yang akan Anda lakukan tergantung pada format kode yang akan Anda temukan. Anda kemudian dapat memutuskan tambalan yang Anda inginkan.

Misalnya, Anda mungkin ingin menggunakan hex editor untuk menggantikan perintah osk.exe seperti:

move AX,<HoverPeriod milliseconds count variable>

ke

mov AX,200       (your count of 200 milliseconds)

Hati-hati dengan panjang perintah yang berbeda, di mana jika perintah baru lebih pendek maka perlu diisi dengan instruksi NOP satu byte (tidak ada operasi) dengan panjang instruksi lama.

Menemukan perintah untuk menambal di osk.exe mungkin memerlukan pencarian jika offset yang diberikan disassembler ada dalam kode dan bukan di file exe. Jika hex editor tidak mendukung pencarian assembler, lakukan pembongkaran sambil mendaftar byte instruksi asli sehingga Anda akan tahu byte biner mana yang harus dicari. Hindari mencari instruksi yang berisi alamat, karena alamat mungkin dipindahkan di exe, jadi cari urutan byte dekat dengan instruksi tersebut.

Anda dapat membuat patch byte baru secara langsung di hex editor jika mendukung assembler. Atau jika tidak dan Anda merasa tidak nyaman dengan kode mesin Intel, cari assembler untuk mengkompilasi kode baru Anda dan gunakan listing untuk mendapatkan byte yang dikompilasi untuk digunakan untuk patching.


Mengubah nilai tidak akan berhasil karena ditimpa oleh fungsi yang lebih umum. Mengubah setiap nilai yang didapat dari registri akan merusak aplikasi. Lihat jawaban saya untuk fungsi umum ini. Editor hex tidak akan berfungsi sebagai hasilnya, jadi turun untuk menemukan assembler (de) yang tepat (atau [de] compiler).
Tamara Wijsman

1

Bolehkah saya menyarankan menggunakan AutoIt untuk mengotomatiskan klik?

Idenya adalah untuk memantau idling mouse ketika kursor berada di dalam jendela di layar (misalnya dalam loop kontrol, memeriksa pada interval reguler apakah kursor telah berubah posisi) dan klik otomatis (fungsi panggil SendClick) setelah, katakanlah, 100 ms tidak aktif.

Mengalahkan rekayasa terbalik .exe.


+1 untuk mengubah "Saya perlu mengklik lebih cepat" menjadi "Saya membiarkannya mengklik lebih cepat dengan cara yang cerdas".
Tamara Wijsman

0

Mungkin Anda tidak perlu mengkompilasi ulang semuanya. Dalam dunia permainan, pelatih biasa digunakan, yang memanipulasi nilai dalam memori saat program berjalan. Jika Anda menemukan nilai minimum dalam memori (0,5) dan memprogram sesuatu seperti loader untuk membuat angka itu lebih kecil, itu bisa berfungsi.


Itu mungkin berhasil, hanya jika nilainya ada di lokasi yang sama atau nilai Xth yang memiliki nilai itu. Bagaimanapun, T Search dan Quick Memory Editor adalah dua alat yang bagus untuk mencoba ini. Anda mungkin ingin mencari 500bukan karena itu cara memuatnya, bukan sebagai pelampung.
Tamara Wijsman

Setelah percobaan pertama, tampaknya osk.exetidak ada dalam daftar proses. Ini karena diluncurkan dalam konteks winlogonsehingga berfungsi lintas pengguna, Anda dapat menyiasatinya dengan meluncurkan editor memori dalam konteks winlogonjuga.
Tamara Wijsman

Lihat stackoverflow.com/questions/9868079/… dan stackoverflow.com/a/3143055/47064 untuk pendekatan melakukan hal ini, pendekatan yang mudah adalah mengganti osk.exetetapi itu hanya akan berfungsi jika Anda membuat peluncur yang meluncurkan editor memori dan yang didukung osk.exe. Tetapi Anda harus mempertimbangkan bahwa loader juga perlu melakukan itu. Tampaknya solusi ini semakin sulit seperti pembongkaran dan perakitan, osk.exesulit ... :)
Tamara Wijsman
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.