Де в коді знаходиться наш ключ?
Використовуючи Монітор процесів, копаючись до події 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
шістнадцятковою цифрою, яка є 64
десятковою. Тож це теж нічого не пов’язане з номером.
Це може бути в одній з чотирьох cmp
(порівняти) інструкцій, але для цього потрібна інформація про налагодження. Або це може статися взагалі у вищій функції, що вимагає більшого розслідування. Але без можливості налагодити це, не втрачаючи можливостей введення, це дуже важко зробити ...
Здається, що для пошуку потрібного місця знадобиться налагоджувальний кабель, оскільки комп'ютер, на якому ви налагоджуєте, втрачає свої вхідні можливості або занадто повільний через накладні налагодження. Оскільки в даний момент у мене немає ноутбука з портом 1943 року, я не можу зробити це налагодження самостійно. Це можна було б зробити, і так, це буквально заморозило б вашу ОС. Налагодження ОС замість програми - це цікаво ... ^^
Зачекайте, ми маємо доступ до символів! Чи можемо ми знайти кривдний код?
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
.
Зауважте, що зміна 74
( JZ
) в шестигранному редакторі на E9
( JMP
) не буде працювати. Ви не можете цього зробити в шестигранному редакторі, вам знадобиться щось, що розбирає і повторно збирає код, але це не обов’язково легко знайти (наприклад, IDA Professional, за який реально платять люди, не може створити належний код коду чи виконуваний файл. OllyDBG, що часто використовується у спільноті патчів, навіть не може відкрити виконуваний файл.). І тоді навіть Microsoft може захищати свій виконуваний файл від підробок, оскільки це може бути розглянуто проти договору EULA; так, удачі!
Мех! Це важко, я просто хочу швидко набрати мишу / очі / ...
Ви обов'язково повинні перевірити Dasher, який швидше, ніж екранна клавіатура. Це просто працює, переміщуючи мишу в бік букв; горизонтальний рух визначає швидкість, а вертикальний рух вибирають літери. Завдяки вбудованому в нього словнику можна навіть розміром найбільш ймовірних букв бути більшим, він також намагається навчитися у вашому русі таким чином, що швидкість та літери дійсно звикли до вашого використання.

Образ говорить більше тисячі слів ...
Звичайно, це досить мало і не дуже швидко, як це є прикладом, але ви можете змінити розмір, щоб він знаходився в правій частині екрана, щоб він не заважав вашому екрану. Це дозволяє вводити так швидко, як ви можете ...
Ось хороший приклад того, як прогнози дозволяють вводити будь-яку мову швидше:

Також зауважте, що літери праворуч сортуються у певному порядку, таким чином, що основний напрямок (вгору, в середині чи вниз) вибирає між різними типами (малі, великі, великі, цифри та пунктуація); і тоді в такому головному напрямку ваш другорядний напрямок вибере між AZ, az, 0-9 тощо. Я використовував це в минулому і насправді був вражений тим, наскільки це вільно порівняно з іншими конкурентами ...
Також зауважте, що Dasher має певну конфігурацію, тож ви зможете налаштувати щось, що вам не подобається.