Windows 7のスクリーンキーボードで特定の構成値を変更する


9

入力にはWindows 7のスクリーンキーボードを使用する必要があります。

(まだ使用していない場合は、すべてのプログラム -> アクセサリ -> アクセスのしやすさ -> スクリーンキーボードから入手できます。

または単に「osk.exe」を検索してください)

スクリーンキーボード

ボタンを「ホバリング」する機能を提供します。Microsoftは次のように説明しています。

ホバリングモードでは、マウスまたはジョイスティックを使用して事前に定義された期間キーをポイントすると、選択した文字が自動的に入力されます。

私の特定の問題があります。所定の時間は私のために有用であるには余りにも長いです。最小時間は0.5秒(最大3秒)です。

この値を0.5 未満変更する方法はありますか?たとえば、レジ​​ストリの編集を介して?

編集:エントリHKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodを500ミリ秒未満に設定することはできません。

編集(2):私の問題を修正する唯一の方法は、.exe(Cで書かれていると思いますか?)を逆コンパイルし、最小時間を変更することだと思います。その後、もう一度コンパイルする必要があります。この手順は実行可能ですか?どのようなことが失敗する可能性がありますか?

役に立つヒントは素晴らしいでしょう!


1
再コンパイルは難しいものになります。1)ほとんど読めません(Microsoftのシンボルを使用している場合でも)、2)そのチェックを行う場所がわからないため、500に割り当てられた変数を見つけた場合は回避できますまたは0.5ですが、それでもフローが流れるパスを追跡する必要があります。3)全体を再コンパイルする必要があります。デバッグケーブルを持っているし、別のものにあなたのコンピュータを接続しない限り、悲しいことに、デバッグが...も可能ではありません
タマラWijsman

そのままにしておくのが賢明だと思います。0.5秒ごとに1文字でもそれほど悪くはありません。また、速すぎるとミスが発生し始めます。
cutrightjm

この投稿に対するコメントを簡単に編集することはできないため、C#または他の言語を知っている一部の人がこのパッチを作成するのに役立つ場合があります。daniweb.com
and

@fnst:本当に速度に興味があるなら、Dasherを検討してください。私は...私の答えでそれを概説します
タマラWijsman

@ekaj:私の知る限り、これはアプリケーションを埋め込むだけです。それがどのように役立つか教えてください。
タマラWijsman

回答:


7

キーはコードのどこにありますか?

Process Monitorを使用して、その値スタックトレースを読み取るETLイベントの詳細を調べます。

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

OSKSettingsManager::GetOskSetting値を読み取ることがわかります。

それで、その部分はどのように見えますか?デバッグできますか?

WinDBGを使用してその関数を調べると、直前にそのレジストリキーにアクセスします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]
...

ここでの問題は、その場所でブレークポイントを設定しようとするosk.exeと、入力ドライバーに自分自身が追加されるため、何も入力できなくなることです。これはAlt、キーボードのように修飾キーを押すと簡単に確認できますosk.exe

加算または減算のコードに目を通すと、4016進数(6410 進数)で何かが起こるのが見えるだけです。したがって、それは数字に関連するものでもありません。

4つのcmp(比較)命令の1つに含まれている場合がありますが、デバッグ情報が必要になります。または、上位の関数全体で発生する可能性があり、より多くの調査が必要になります。しかし、入力機能を失うことなくデバッグする機能がないため、これは非常に難しいことです...

デバッグするコンピューターが入力機能を失うか、デバッグのオーバーヘッドのために速度が遅すぎるため、適切な場所を見つけるにはデバッグケーブルが必要になるようです。現在、1943ポートのラップトップを持っていないので、このデバッグを自分で行うことはできません。これが可能になり、はい、文字通りOSがフリーズします。アプリケーションの代わりにOSをデバッグするのは楽しい... ^^

待って、シンボルにアクセスできます!問題のコードを見つけることができますか?

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)

よく見ると、問題のある機能に気付くでしょう。

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

その関数を見ていくと、最初に次のことがわかります。

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        

さて、これは何かを比較し、別の場所にジャンプします。何がありますか?

pop     ebp
retn    8

そのため、条件がジャンプする必要があると判断した場合、関数をそのままにして、何も変更しません。

それでは、どのようにすれば常に関数から離れるのでしょうか?

命令を常にジャンプを実行するjz命令に変更するjmpと、相対オフセットで見つけることができます41BC10。プログラムが異なるオフセットを計算する場合、それが401000ベースとして使用することを知る必要があるので、減算は絶対オフセットを与え1AC10ます。

16進エディタで()を74JZ)に変更しても機能しないことに注意してください。16進エディターでこれを行うことはできません。コードを逆アセンブルおよび再アセンブルするものが必要になりますが、見つけるのは必ずしも簡単ではありません(たとえば、実際にお金を払って適切なCコードまたは実行可能ファイルを生成できないIDA Professional)。パッチコミュニティで一般的に使用されているOllyDBGは、実行可能ファイルを開くことさえできません。さらに、Microsoftは実行可能ファイルを改ざんから保護している可能性があります。これは、EULAに反する可能性があるためです。とても幸運!E9JMP

えっ!これは難しいです。マウス/目/ ...

オンスクリーンキーボードよりもはるかに高速なDasherをぜひお試しください。マウスを文字に向かって動かすだけで機能します。水平移動は速度を決定し、垂直移動は文字を選択します。辞書が組み込まれているため、最も可能性の高い文字のサイズを大きくすることもできます。また、速度と文字が実際の使用に慣れるように、動きから学習しようとします。

画像は千語以上を話す...

もちろん、これは一例であるため、かなり小さく、実際には高速ではありませんが、画面の邪魔にならないように画面の右側にサイズを変更することができます。これにより、できるだけ早く入力できます...

以下は、予測によりどのように言語をより速く入力できるかを示す良い例です。

また、右側の文字は特定の順序でソートされており、主な方向(上、中、下)が異なるタイプ(小文字、大文字、数字、句読点)から選択されることに注意してください。そして、そのような大きな方向の中で、あなたの小さな方向はAZ、az、0-9などから選択します。私は過去にこれを使用しましたが、実際にこれが他の競合他社と比較してどれだけ流fluentであるかに驚いていました...

また、Dasherにはいくつかの構成があるため、気に入らないものを調整できる場合があります。


@harrymc:読んでいればUsing Process Monitor, digging into the for the ETL event reading out that value stack trace gives us:、ETLイベントのスタックトレースを確認したことがわかるでしょう。ここであなた自身の答えについて話していると思いますか?大量に回答するため、あなたの回答は真剣に質を欠いています。Q&Aを改善する意図のない素早い汚い回答や愚かなコメントを掲載する代わりに、回答を改善または削除することを検討してください。あなたは、ほとんどの...コミュニティを支援しようとしているアプローチを推測することができます
タマラWijsman

1
@harrymc:(1)どこで割れていると言うのですか?ここで出発点を示しているだけで、失敗することはなく、先に進むには追加の機器や宿題が必要であることを示しました。品質は私の答えにあり、量は読者が行う必要があります。または、リモートデバッグの設定に出くわすときです。(2)Googling Process MonitorとWinDBGは、ロケット科学ではありません。(3)賛辞のおかげで、おそらく私も答えでアセンブリがどのように機能するかを説明する必要がありますか?
タマラウィスマン

@harrymc:私の答えは良い出発点です。あなたの間違いは、この質問の答えとコメントの両方で示されるように、十分な詳細を提供しないことにあります。私の答えを改善する意図がないか、何が間違っているのかを伝えないコメントを追加する必要があることがわかりました。一般的すぎるのではなく、努力を示す答えを出すのにもう少し時間がかかります。私は、あなたがどのように表示されていない便利です、私はむしろ...超ロング、代わりに髪-スクラッチの手取り運動を好むThe decompilation help. Once located, you should patch the binary code.
タマラWijsman

@harrymc:あなたはそれが一般的な目的であると仮定しています。ただし、その参照と依存関係を確認した場合、レジストリキーからのみ読み込まれる独自の構成を上書きした後の動作が破壊されないことがわかりました。その参照と依存関係を確認したので、使用方法を知っています。最後のコメントも削除しますか?;)
Tamara Wijsman

本当にクラッキングした場合は、パッチを適用したオスクを作成するのに数分かかります。仕事を終えて、ポスターを審査させてみませんか?
harrymc

2

ほとんどの逆コンパイラでは、再コンパイルできる十分な結果が得られないのではないかと心配しています。

逆コンパイルはHKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriod、この値が読み取られる場所と500ミリ秒の制限が適用される場所を見つけるために、使用される領域を特定するのに役立ちます。

見つけたら、テストを無効にしてHoverPeriodをより小さくするために、バイナリコードにパッチを適用する必要があります。バイナリのパッチは、再コンパイルよりもはるかに実行可能です。

osk.exeがWindows Updateに置き換えられた場合は、この作業を繰り返す必要があるかもしれません(これは実際には起こりそうにありません)。

[編集]

途中であなたを助けるために、ここにユーティリティとその使用法に関するいくつかの言葉があります。

Cデコンパイラまたは逆アセンブラを使用できます。後者のタイプは、Intelの命令セットに関する多少の知識を必要としますが、より便利な場合があります。優れた16進エディターも必要です。逆アセンブラー機能を宣伝するものもあります(以下のリンクを参照)。

プロジェクトフェンリスは、「コード分析、デバッグ、プロトコル分析、リバースエンジニアリング、フォレンジック、診断、セキュリティ監査、脆弱性調査、その他の多くの目的に適したツールのスイート」として自身を宣伝しています。良さそうで、多くの人に推奨されていますが、私は経験がありません。

REC Studio Decompilerは、実行可能ファイルのビルドに使用されるコードとデータのCのような表現を生成しようとします。

Boomerangは、一般的なオープンソースのマシンコードプログラムのリターゲット可能な逆コンパイラです。

このようなユーティリティは、グーグルまたは次の場所で見つけることができます。

wikibooks x86分解/解析ツール
wikibooks x86分解/逆アセンブラーおよび逆コンパイラー
オープンディレクトリ:逆アセンブラー

準備段階では、oskを分解します。結果のリストは膨大な量になる可能性があり、適切なテキストエディターが必要になる場合があります(通常はnotepad ++で十分です)。

文字列「HoverPeriod」を検索します(大文字と小文字は区別されません)。運が良ければ、逆アセンブラはそれを文字列として識別し、そのまま見つけることができます。そうでない場合は、バイト単位で検索する必要があります。Unicode文字列として、H,0,o,0,v,0...文字を数値コードで置き換える場所のように見えます。

「HoverPeriod」という文字列を見つけたら、逆アセンブラはその前のどこかにラベルを配置する必要があります。この生成されたラベルの名前を使用して、それが使用されている場所を検索し、レジストリから取得された場所と、結果が格納されるグローバル変数を特定します。

カウントを保持する変数を見つけたら、それが使用されている場所を検索します。実行する処理は、検索するコードの形式によって異なります。その後、必要なパッチを決定できます。

たとえば、16進エディタを使用して、osk.exeで次のようなコマンドを置き換えることができます。

move AX,<HoverPeriod milliseconds count variable>

mov AX,200       (your count of 200 milliseconds)

コマンド長が異なる場合は注意してください。新しいコマンドが短い場合は、1バイトのNOP命令(操作なし)で古い命令の長さまでパディングアウトする必要があります。

逆アセンブラーが提供するオフセットがexeファイルではなくコード内にある場合、osk.exeでパッチを適用するコマンドを見つけるには検索が必要になる場合があります。16進エディタがアセンブラ検索をサポートしていない場合は、元の命令バイトを一覧表示しながら逆アセンブリを実行して、検索するバイナリバイトを確認します。アドレスはexe内で再配置される可能性があるため、アドレスを含む命令の検索は避け、そのような命令に近いバイトシーケンスを検索してください。

アセンブラをサポートしている場合は、16進エディタで直接新しいパッチバイトを作成できます。または、Intelマシンコードに慣れていない場合は、アセンブラを探して新しいコードをコンパイルし、そのリストを使用してコンパイル済みバイトを取得し、パッチを適用します。


値を変更しても、より汎用的な関数によって上書きされるため、機能しません。レジストリから取得するすべての値を変更すると、アプリケーションが破損します。この汎用関数に関する私の答えをご覧ください。16進エディターは結果として機能しないため、正しい(デ)アセンブラー(または[デ]コンパイラー)を見つけることになります。
タマラWijsman

1

AutoItを使用してクリックを自動化することをお勧めしますか?

カーソルが画面上のウィンドウ内にあるときにマウスのアイドリングを監視し(例:制御ループで、カーソルが位置を変更したかどうかを定期的にチェックする)、たとえば100ms後に自動クリック(関数SendClickを呼び出し)非アクティブの。

.exeのリバースエンジニアリングよりも優れています。


「より速くクリックする必要がある」を「スマートな方法でより速くクリックできるようにする」に変えるための+1。
タマラウィスマン

0

たぶん、すべてを再コンパイルする必要はありません。ゲームの世界では、プログラムの実行中にメモリ内の値を操作するトレーナーを使用するのが一般的です。メモリ内の最小値(0.5)を見つけ、ローダーのようなものをプログラムしてその数を小さくすれば、動作する可能性があります。


値が同じ場所にあるか、その値を持つX番目の値にある場合にのみ、動作する可能性があります。いずれにせよ、T SearchとQuick Memory Editorは、これを試すのに便利な2つのツールです。500代わりに検索することをお勧めします。フロートとしてではなく、それを読み込む方法です。
タマラWijsman

最初の試行でosk.exeは、プロセスリストにないようです。これは、winlogonユーザー間で機能するようにコンテキストで起動されるためwinlogonです。コンテキストでメモリエディターを起動することでも回避できます。
タマラウィスマン

これを行う方法については、stackoverflow.com / questions / 9868079 / およびstackoverflow.com/a/3143055/47064を参照してください。簡単な方法は交換することですosk.exeが、メモリエディターとバックアップされたosk.exe。しかし、その後、ローダーもそれを行う必要があることを考慮する必要があります。この解決策は、分解および組み立てと同じくらい難しくなっているようにosk.exe
思え
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.