キーはコードのどこにありますか?
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
。
加算または減算のコードに目を通すと、40
16進数(64
10 進数)で何かが起こるのが見えるだけです。したがって、それは数字に関連するものでもありません。
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進エディタで()を74
(JZ
)に変更しても機能しないことに注意してください。16進エディターでこれを行うことはできません。コードを逆アセンブルおよび再アセンブルするものが必要になりますが、見つけるのは必ずしも簡単ではありません(たとえば、実際にお金を払って適切なCコードまたは実行可能ファイルを生成できないIDA Professional)。パッチコミュニティで一般的に使用されているOllyDBGは、実行可能ファイルを開くことさえできません。さらに、Microsoftは実行可能ファイルを改ざんから保護している可能性があります。これは、EULAに反する可能性があるためです。とても幸運!E9
JMP
えっ!これは難しいです。マウス/目/ ...
オンスクリーンキーボードよりもはるかに高速なDasherをぜひお試しください。マウスを文字に向かって動かすだけで機能します。水平移動は速度を決定し、垂直移動は文字を選択します。辞書が組み込まれているため、最も可能性の高い文字のサイズを大きくすることもできます。また、速度と文字が実際の使用に慣れるように、動きから学習しようとします。
画像は千語以上を話す...
もちろん、これは一例であるため、かなり小さく、実際には高速ではありませんが、画面の邪魔にならないように画面の右側にサイズを変更することができます。これにより、できるだけ早く入力できます...
以下は、予測によりどのように言語をより速く入力できるかを示す良い例です。
また、右側の文字は特定の順序でソートされており、主な方向(上、中、下)が異なるタイプ(小文字、大文字、数字、句読点)から選択されることに注意してください。そして、そのような大きな方向の中で、あなたの小さな方向はAZ、az、0-9などから選択します。私は過去にこれを使用しましたが、実際にこれが他の競合他社と比較してどれだけ流fluentであるかに驚いていました...
また、Dasherにはいくつかの構成があるため、気に入らないものを調整できる場合があります。