Windows 7'nin Ekran Klavyesinde belirli yapılandırma değerlerini değiştirme


9

Yazmak için Windows 7 Ekran Klavyesi'ni kullanmalıyım:

(Henüz kullanmadıysanız, şu yolla alabilirsiniz: Tüm Programlar -> Aksesuarlar -> Erişim Kolaylığı -> Ekran Klavyesi

ya da "osk.exe" için arama yapın)

Ekran klavyesi

Düğmeler hakkında "fareyle üzerine gelme" özelliği sunar. Microsoft bunu şöyle açıklar:

Vurgulama modunda, önceden tanımlanmış bir süre boyunca bir tuşa işaret etmek için bir fare veya joystick kullanırsınız ve seçilen karakter otomatik olarak yazılır.

Benim özel sorunum var. Zamanın belirlenen periyot benim için yararlı olduğu çok uzun. Minimum süre 0,5 saniyedir (en fazla 3 saniye).

Bu değeri < 0,5 olan bir şeye değiştirmenin herhangi bir yolu var mı ? Örneğin, kayıt defterini düzenleyerek?

Düzenle: Giriş HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriod500 ms'den daha düşük bir değere ayarlanamaz.

Düzenleme (2): Benim sorunum düzeltmek için tek yolu, .exe (sanırım C, veya? İle yazılmış) koda ve minimum zamanı değiştirmek olduğunu düşünüyorum. Sonra tekrar derlemeliyim. Bu prosedür uygulanabilir mi? Hangi şeyler başarısız olabilir?

Herhangi bir yararlı ipucu harika olurdu!


1
Yeniden derleme zor bir şey olacak, 1) çoğunlukla okunamayacak (Microsoft'un Sembollerini kullansanız bile) ve 2) bu kontrolü nerede yaptığını bilmediğiniz için 500'e atanan bir değişken bulursanız etrafta dolaşabilirsiniz veya 0.5 ama yine de aktığı yolu izlemelisiniz ve 3) yine de her şeyi yeniden derlemelisiniz ki bu da kötü ayrıştırma nedeniyle çoğu zaman mümkün değildir. Maalesef, bir hata ayıklama kablonuz yoksa ve bilgisayarınızı başka bir kabloya
takmazsanız

Bence olduğu gibi bırakmak akıllıca olur. Her yarım saniyede bir karakter o kadar da kötü değil ve eğer çok hızlı olursa hatalar oluşmaya başlayacak.
cutrightjm


@fnst: Gerçekten hız ilgilenen varsa, dikkate Dasher .
Cevabımda

@ekaj: Bu uygulamayı anlatabildiğim kadarıyla gömüyor. Bunun nasıl yardımcı olacağını söyleyebilir misiniz?
Tamara Wijsman

Yanıtlar:


7

Kodumuzun neresinde anahtarımızı bulur?

Process Monitor'ü kullanarak, değer yığını izlemesinin bize verdiği ETL olayını incelemek bize şunları sağlar:

"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"

Bunun OSKSettingsManager::GetOskSettingdeğeri okuduğunu görebiliriz .

Peki, bu kısım neye benziyor? Hata ayıklayabilir miyiz?

WinDBG ile bu işleve bakıldığında, bu kayıt defteri anahtarına hemen erişir 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]
...

Şimdi, buradaki sorun, o konumda kesme noktası denediğimde artık hiçbir şey yazamadığım osk.exeiçin giriş sürücülerine kendini ekliyor. Bu, Altklavyenizdeki gibi bir değiştirici tuşunu basılı tutarak kolayca görülebilir , bu yanar osk.exe.

Toplama veya çıkarma koduna bakarak, sadece ondalık olan 40onaltılık bir şey olduğunu görüyorum 64. Yani bu sayı ile ilgili bir şey değil.

Dört cmp(karşılaştırma) talimattan birinde olabilir , ancak hata ayıklama bilgileri gerektirebilir. Ya da daha fazla araştırma gerektiren daha yüksek bir işlevde birlikte olabilir. Ancak, giriş yeteneklerini kaybetmeden hata ayıklama yeteneği olmadan, bu çok zor bir şeydir ...

Hata ayıkladığınız bilgisayar giriş özelliklerini kaybettiğinden veya hata ayıklama yükü nedeniyle çok yavaş olduğundan, doğru konumu bulmanın bir hata ayıklama kablosu gerektireceği anlaşılıyor. Şu anda 1943 bağlantı noktasına sahip bir dizüstü bilgisayarım olmadığından, bu hata ayıklamayı kendim yapamıyorum. Bunu yapabilir ve evet, işletim sisteminizi tam anlamıyla dondurur. Bir uygulama yerine bir işletim sisteminde hata ayıklamak eğlencelidir ... ^^

Bekleyin, sembollere erişimimiz var! Sorunlu kodu bulabilir miyiz?

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)

Daha yakından baktığınızda, rahatsız edici işlevi göreceksiniz:

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

Bu işlevden geçersek, önce şunu görürüz:

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        

Tamam, bu bir şeyi karşılaştırır ve sonra başka bir yere atlar. Orada ne var?

pop     ebp
retn    8

Bu nedenle, koşulun atlaması gerektiğine karar verirse, işlevi terk eder ve hiçbir şeyi değiştirmez.

Peki, her zaman işlevi bırakmasını nasıl sağlayabiliriz?

Talimatı her zaman atlamayı yapan jzbir jmptalimatla değiştirin, göreli ofsette bulabilirsiniz 41BC10. Programınızın ofsetleri farklı hesaplaması durumunda, 401000temel olarak kullandığını bilmeniz gerekir, böylece çıkarma bize mutlak ofseti verir 1AC10.

Bunu değiştirmenin unutmayın 74( JZHex editörü) E9( JMP) olacak değil işi. Bunu onaltılık bir editörde yapamazsınız, kodu parçalarına ayıran ve yeniden birleştiren bir şeye ihtiyacınız olacak, ancak bunun bulunması kolay olmayabilir (örneğin, insanların gerçekten ödediği IDA Professional, uygun c kodu veya yürütülebilir bir dosya oluşturamaz. Yama topluluğunda yaygın olarak kullanılan OllyDBG, yürütülebilir dosyayı bile açamaz.). Ve sonra bile, Microsoft yürütülebilir dosyasını kurcalamaya karşı koruyor olabilir, çünkü bu EULA'ya karşı düşünülebilir; iyi şanslar!

Meh! Bu zor, sadece faremi / gözlerimi kullanarak hızlı yazmak istiyorum ...

Bir Ekran Klavyesinden çok daha hızlı olan Dasher'i kesinlikle kontrol etmelisiniz . Sadece farenizi harflere doğru hareket ettirerek çalışır; yatay hareket hızı belirler ve dikey hareket harfleri seçer. Dahili bir sözlükle, en büyük harfleri daha büyük olacak şekilde boyutlandırabilir, ayrıca hızınızdan ve harflerin kullanımınıza gerçekten alışacak şekilde hareketinizden öğrenmeye çalışır.

Bir görüntü bin kelimeden fazla konuşuyor ...

Tabii ki bu oldukça küçük ve örnek olarak gerçekten hızlı değil, ancak ekranınızı sağ tarafta olmayacak şekilde yeniden boyutlandırabilirsiniz, böylece ekranınıza müdahale etmez. Bu mümkün olduğunca hızlı yazmanızı sağlar ...

Tahminlerin herhangi bir dili daha hızlı yazmanıza nasıl izin verdiğine dair iyi bir örnek:

Ayrıca sağdaki harflerin belli bir sıraya göre sıralandığını, böylece ana yönün (yukarı, orta veya aşağı) farklı türler (küçük harf, büyük harf, sayı ve noktalama işaretleri) arasında seçim yapmasını unutmayın; ve sonra böyle büyük bir yönde, küçük yönünüz AZ, az, 0-9 ve diğerleri arasında seçim yapar. Bunu geçmişte kullandım ve aslında bunun diğer rakiplerle ne kadar akıcı olduğunu görünce şaşırdım ...

Ayrıca Dasher'in bazı yapılandırmaya sahip olduğunu unutmayın, bu nedenle hoşunuza gitmeyen bir şeyi ayarlayabilirsiniz.


@harrymc: Eğer okuduysanız Using Process Monitor, digging into the for the ETL event reading out that value stack trace gives us:, yığın izini ETL olayı için kontrol ettiğimi bilirdiniz. Sanırım burada kendi cevaplarınız hakkında mı konuşuyorsunuz? Yüksek miktarda cevap verdiğiniz için, cevaplarınız ciddi bir şekilde kaliteden yoksundur. Soru ve cevapları iyileştirmek istemeyen hızlı ve kirli cevaplar veya aptalca yorumlar koymak yerine cevaplarınızı iyileştirmeyi ve / veya kaldırmayı düşünün; hangi yaklaşımın topluma en çok yardımcı olacağını tahmin edebilirsiniz ...
Tamara Wijsman

1
@harrymc: (1) Nerede ı am diyor çatlama ? Burada sadece bir başlangıç ​​noktası gösteriyorum, başarısız olmadım ve ilerlemek için fazladan ekipman veya ödev gerektiğini gösterdim. Kalite benim cevabımda, miktar okuyucu tarafından veya uzaktan hata ayıklama kurulumuyla karşılaştığımda yapılmalıdır. (2) Google Süreci İzleme Monitörü ve WinDBG roket bilimi değildir. (3) İltifat için teşekkürler, belki cevabımda da meclisin nasıl çalıştığını açıklamalıyım?
Tamara Wijsman

@harrymc: Cevabım iyi bir başlangıç ​​noktası. Hatanız, hem bu sorudaki cevabınız hem de yorumlarınızda gösterildiği gibi yeterli ayrıntı vermemekte yatar. Cevabımı geliştirmek niyetinde olmayan ya da neyin yanlış olduğunu söylemeyen başka bir yorum daha koymayı gerekli buldunuz , çok genel olmak yerine çaba gösteren bir cevap koymak için biraz daha zaman alacak . Ne kadar The decompilation help. Once located, you should patch the binary code.yararlı olduğunu görmüyorum , saç çizmek yerine ultra uzun ve eve götürme egzersizini tercih ederim ...
Tamara Wijsman

@harrymc: Genel amaçlı olduğunu düşünüyorsunuz; ancak, referanslarını ve bağımlılıklarını kontrol etseydiniz, yalnızca bu kayıt defteri anahtarından yüklenen kendi yapılandırmasının üzerine yazılan herhangi bir davranışı yok etmediğini görürdünüz. Referanslarını ve bağımlılıklarını kontrol ettim, bu yüzden kullanımlarını biliyorum. Son yorumunuzu da silecek misiniz? ;)
Tamara Wijsman

Eğer gerçekten çatladıysanız, yamalı bir osk oluşturmaktan sadece birkaç dakika uzaktasınız. Neden işi bitirip posterin yargılamasına izin vermiyorsun?
harrymc

2

Korkarım ki çoğu dekompler yeniden derlenebilecek kadar iyi bir sonuç vermeyecektir.

Ayrıştırma, yalnızca HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodbu değerin nerede okunduğunu ve 500 ms sınırının nerede uygulandığını bulmak için kullanılan alanı saptamaya yardımcı olabilir .

Yerleştirildikten sonra, testi devre dışı bırakmak ve HoverPeriod'un daha küçük olmasını sağlamak için ikili kodu yamalamanız gerekir. İkili düzeltme eki yeniden derlemeden çok daha uygundur.

Osk.exe hiç Windows Update ile değiştirildiyse bu işlemi tekrarlamanız gerekebilir (ki gerçekten olmasını beklemiyorum).

[DÜZENLE]

Yolda daha fazla yardımcı olmak için, yardımcı programlar ve kullanımları hakkında bazı kelimeler.

Bir C-dekomiler veya bir sökücü kullanabilirsiniz. Intel yönerge kümesi hakkında biraz bilgi sahibi olmasına rağmen, daha sonraki tür daha kullanışlı olabilir. Ayrıca iyi bir hex editörüne ihtiyacınız olacak ve sökme yeteneklerinin reklamını yapan bazı şeyler var (aşağıdaki bağlantıya bakın).

Project Fenris, kendisini "kod analizi, hata ayıklama, protokol analizi, tersine mühendislik, adli tıp, teşhis, güvenlik denetimleri, güvenlik açığı araştırması ve diğer birçok amaç için uygun araçlar grubu" olarak tanıtır. Kulağa iyi geliyor ve pek çok kişi tarafından tavsiye ediliyor, ama onunla hiç deneyimim yok.

REC Studio Decompiler , yürütülebilir dosyayı oluşturmak için kullanılan kod ve verilerin C benzeri bir gösterimini oluşturmaya çalışır.

Boomerang , makine kod programlarının genel, açık kaynaklı, geciktirilebilir bir dekompresörüdür.

Bu tür yardımcı programların birçoğu googling ile veya içinde bulunabilir:

wikibooks x86 Sökme / Analiz Araçları
wikibooks x86 Sökme / Sökme ve Açma Makineleri
Açık Dizin: Sökme

Bir ön adım osk'i sökmektir. Ortaya çıkan liste hacimli olabilir ve iyi bir metin editörü gerektirebilir (normalde notepad ++ yeterlidir).

"HoverPeriod" dizesini arayın (büyük / küçük harfe duyarsız). Eğer şanslıysanız, sökücü onu bir dize olarak tanımlamıştır ve olduğu gibi bulabilirsiniz. Değilse, bayt bayt aramanız gerekir. Bir Unicode dizesi olarak H,0,o,0,v,0..., harflerin sayısal kodlarıyla nerede değiştirileceği gibi görünecektir .

"HoverPeriod" dizesini bulduktan sonra, sökücünün önüne bir etiket koymuş olması gerekir. Nerede kullanıldığını aramak, kayıt defterinden nereden alınacağını ve hangi global değişkenin saklandığı sonucunu belirlemek için bu oluşturulan etiketin adını kullanın.

Sayıyı tutan değişkeni bulduktan sonra, nerede kullanıldığını arayın. Ne yapacağınız bulacağınız kodun biçimine bağlıdır. Daha sonra istediğiniz yamaya karar verebilirsiniz.

Örneğin, osk.exe dosyasında aşağıdaki gibi bir komutu değiştirmek için hex düzenleyicisini kullanmak isteyebilirsiniz:

move AX,<HoverPeriod milliseconds count variable>

içine

mov AX,200       (your count of 200 milliseconds)

Farklı komut uzunluklarına dikkat edin; yeni komut daha kısaysa, eski komutun uzunluğuna kadar bir baytlık NOP komutlarıyla (işlem yapılmadan) doldurulması gerekir.

Osk.exe içinde düzeltme eki komutunu bulmak için, disassembler'ın sağladığı uzaklıkların exe dosyasında değil kodda olup olmadığı araştırılmalıdır. Onaltılık düzenleyici montajcı aramayı desteklemiyorsa, orijinal talimat baytlarını listelerken sökme işlemini yapın, böylece hangi ikili baytın aranacağını bilirsiniz. Adresler içeren talimatları aramaktan kaçının, çünkü adresler exe'de yeniden konumlandırılabilir, bu nedenle böyle bir talimatın yakınında bir bayt dizisi arayın.

Montajcıyı destekliyorsa, yeni yama baytlarını doğrudan onaltılı düzenleyicide oluşturabilirsiniz. Ya da yoksa ve Intel makine koduyla kendinizi rahat hissetmiyorsanız, yeni kodunuzu derlemek için bir montajcı bulun ve yama için kullanmak üzere derlenen baytları almak için listesini kullanın.


Değerin değiştirilmesi, daha genel bir işlev tarafından üzerine yazıldığı sürece çalışmaz. Kayıt defterinden aldığı her değeri değiştirmek uygulamayı bozacaktır. Bu genel işlev için cevabıma bakın. Sonuç olarak bir hex düzenleyici çalışmaz, bu yüzden doğru (de) derleyiciyi (veya [de] derleyicisini) bulmak için gelir.
Tamara Wijsman

1

Tıklamayı otomatikleştirmek için AutoIt kullanmanızı önerebilir miyim ?

Fikir, imleç ekran penceresinin içindeyken (örneğin bir kontrol döngüsünde, imlecin konumunun değişip değişmediğini düzenli aralıklarla kontrol etmek için) fare rölantisini izlemek ve örneğin 100 ms sonra otomatik tıklama (SendClick işlevini çağır) hareketsizlik.

Bir .exe ters mühendislik yener.


"Daha hızlı tıklatmam gerekiyor" ifadesini "Akıllı şekilde daha hızlı tıklamasına izin ver" i çevirmek için +1.
Tamara Wijsman

0

Belki de her şeyi yeniden derlemek zorunda değilsiniz. Oyun dünyasında, program çalışırken bellekte bir değeri değiştiren eğitmenler kullanmak yaygındır. Bellekteki minimum değeri (0.5) bulursanız ve bu sayıyı daha küçük yapmak için yükleyici gibi bir şey programlarsanız, işe yarayabilir.


Bu, yalnızca değer aynı konumda veya bu değere sahip Xth değerinde olduğunda işe yarayabilir. Her durumda, T Arama ve Hızlı Bellek Düzenleyici bunu denemek için iki güzel araçtır. Bunun 500yerine bir şamandıra olarak değil, onu nasıl yüklediğinden aramak isteyebilirsiniz .
Tamara Wijsman

İlk denemede, osk.exeişlem listesinde olmayan bir şey görünür . Bunun nedeni, winlogonkullanıcılar arasında çalışacak şekilde bağlamda başlatılmasıdır, bu bağlamda bellek düzenleyicisini de bağlamında başlatabilirsiniz winlogon.
Tamara Wijsman

Bunu yapmak için bir yaklaşım için stackoverflow.com/questions/9868079/… ve stackoverflow.com/a/3143055/47064 adresine bakın , kolay yaklaşım değiştirmektir, osk.exeancak bu yalnızca hem bellek düzenleyicisini başlatan bir başlatıcı oluşturursanız hem de yedeklenir osk.exe. Ama sonra bir yükleyicinin de bunu yapması gerektiğini düşünmelisiniz. Bu çözümün sökülmesi ve montajı kadar zorlaştığı osk.exe
anlaşılıyor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.