web-dev-qa-db-ja.com

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

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

(まだ使用していない場合は、次の方法で入手できます:すべてのプログラム->Accessories->コンピューターの簡単操作->オンスクリーンキーボード

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

On-Screen Keyboard

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

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

私の特定の問題があります。 事前定義された期間は長すぎて、私には役に立ちません。最小時間は0.5秒(最大3秒)です。

alterこの値を何か< 0.5にする方法はありますか? たとえば、レジ​​ストリを編集することによって?

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

編集(2):問題を解決する唯一の方法は、.exeを逆コンパイルして(Cで書かれていると思いますか?)、最小時間を変更することだと思います。それから私はそれを再びコンパイルしなければなりません。この手順は実行可能ですか?何が失敗する可能性がありますか?

役立つヒントがあれば素晴らしいです!

9
fnst

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

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で点灯します。

加算または減算のコードを調べると、4010進数である6416進数で何かが発生していることがわかります。ですから、それも数とは関係ありません。

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

ああ!これは難しいです、私はちょうど私のマウス/目/を使って速くタイプしたいです...

あなたは間違いなくチェックアウトする必要があります Dasher これはオンスクリーンキーボードよりもはるかに高速です。マウスを文字に向けて動かすだけで機能します。水平方向の動きが速度を決定し、垂直方向の動きが文字を選択します。辞書が組み込まれていると、最も可能性の高い文字のサイズを大きくすることもできます。また、速度と文字が実際に使用法に慣れるように、動きから学習しようとします。

画像は1000語以上を話します...

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

これは、予測によって任意の言語をより迅速に入力できるようにする方法の良い例です。

また、右側の文字は特定の順序で並べ替えられており、主な方向(上、中、下)がさまざまなタイプ(小文字、大文字、数字、句読点)から選択されることに注意してください。そして、そのような主方向の中で、あなたの副方向はA-Z、a-z、0-9などから選択します。私は過去にこれを使用しましたが、他の競合他社と比較してこれがどれほど流暢であるかに実際に驚いていました...

また、Dasherにはいくつかの構成があるため、気に入らないものを調整できる場合があることにも注意してください。

7
Tamara Wijsman

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

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

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

Osk.exeがWindowsUpdateに置き換えられた場合は、この作業を繰り返す必要があるかもしれません(これは実際には起こらないと思います)。

[編集]

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

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

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

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

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

グーグルで、または:で、さらに多くのそのようなユーティリティを見つけることができます。

ウィキブックスx86分解/分析ツール
wikibooks x86逆アセンブリ/逆アセンブラおよび逆コンパイラ
Open Directory:逆アセンブラ

準備段階は、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命令(操作なし)で埋める必要があります。

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

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

2
harrymc

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

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

.exeのリバースエンジニアリングに勝る。

1
minya

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

0
Pwdr