Windows 7의 화상 키보드에서 특정 구성 값 변경 아직 사용하지 않은 : 모든 프로그램

입력하려면 Windows 7의 화상 키보드를 사용해야합니다.

(경우에 당신은 당신이를 통해 얻을 수 있습니다, 아직 사용하지 않은 : 모든 프로그램 -> 보조 프로그램 > – 접근의 용이성 -> 온 – 스크린 키보드

또는 단순히 “osk.exe”를 검색)

화상 키보드

버튼에 “호버링”하는 기능을 제공합니다. Microsoft는이를 다음과 같이 설명합니다.

호버링 모드에서는 마우스 또는 조이스틱을 사용하여 미리 정의 된 시간 동안 키를 가리키고 선택한 문자가 자동으로 입력됩니다.

내 특정 문제가 있습니다. 시간의 미리 정의 된 기간은 나에게 유용 너무 깁니다. 최소 시간은 0.5 초 (최대 3 초)입니다.

이 값을 < 0.5 로 변경할 수 있는 방법 이 있습니까? 예를 들어 레지스트리를 편집하여?

편집 : 항목 HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriod을 500ms보다 낮게 설정할 수 없습니다.

편집 (2) : 내 문제를 해결하는 유일한 방법은 .exe를 디 컴파일 (C로 작성 했습니까?)하고 최소 시간을 변경하는 것입니다. 그런 다음 다시 컴파일해야합니다. 이 절차는 가능합니까? 어떤 일이 실패 할 수 있습니까?

유용한 팁이 있으면 좋을 것입니다!



답변

코드에서 어디에서 키를 찾습니까?

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 진수 만 발생하는 것을 볼 수 64있습니다. 그래서 그것은 또한 숫자와 관련이 없습니다.

4 가지 cmp(비교) 명령 중 하나 일 수 있지만 디버깅 정보가 필요합니다. 또는 더 높은 기능으로 발생할 수 있으므로 더 많은 조사가 필요합니다. 그러나 입력 기능을 잃지 않고 디버깅 할 수 없다면 이것은 매우 어려운 일입니다 …

올바른 위치를 찾으려면 디버그하는 컴퓨터의 입력 기능이 손실되거나 디버깅 오버 헤드로 인해 너무 느리기 때문에 디버그 케이블이 필요합니다. 현재 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됩니다.

그 변화에 유의하시기 바랍니다 74( JZ에 16 진수 편집기에서) E9( JMP)하지 않습니다 일을. 16 진 편집기에서는이 작업을 수행 할 수 없으며 코드를 분해 및 재 조립해야하지만 찾기가 쉽지는 않습니다 (예 : 사람들이 실제로 비용을 지불하고 적절한 C 코드 또는 실행 파일을 생성 할 수없는 IDA Professional). 패치 커뮤니티에서 일반적으로 사용되는 OllyDBG는 실행 파일도 열 수 없습니다.). 그리고 심지어 Microsoft는 EULA에 대해 고려할 수 있기 때문에 실행 파일이 변조되지 않도록 보호하고있을 수 있습니다. 행운을 빌어 요!

메! 이것은 어렵습니다. 마우스 / 눈 /을 사용하여 빠르게 입력하고 싶습니다 …

화상 키보드보다 훨씬 빠른 Dasher 를 반드시 확인해야합니다 . 단순히 마우스를 글자쪽으로 움직여 작동합니다. 수평 이동은 속도를 결정하고 수직 이동은 문자를 선택합니다. 내장 된 사전을 사용하면 가장 큰 글자를 더 크게 만들 수 있으며 속도와 글자가 실제로 사용에 익숙해 지도록 운동에서 배우려고합니다.

이미지는 천 단어 이상을 말합니다 …

물론 이것은 작지만 실제로는 빠르지 않지만 화면의 오른쪽에 위치하여 화면을 방해하지 않도록 크기를 조정할 수 있습니다. 이것은 당신이 할 수있는 한 빨리 입력 할 수 있습니다 …

다음은 예측을 통해 언어를 더 빨리 입력 할 수있는 방법에 대한 좋은 예입니다.

또한 오른쪽의 문자는 특정 순서로 정렬되므로 주 방향 (위, 중간 또는 아래쪽)이 다른 유형 (소문자, 대문자, 숫자 및 문장 부호) 중에서 선택할 수 있습니다. 그런 주요 방향 내에서 작은 방향은 AZ, az, 0-9 등 중에서 선택합니다. 나는 이것을 과거에 사용했고 실제로 이것이 다른 경쟁자와 비교할 때 유창하게 놀랐습니다 …

또한 Dasher에는 일부 구성이 있으므로 원하지 않는 것을 조정할 수 있습니다.


답변

대부분의 디 컴파일러가 재 컴파일 할 수있는 충분한 결과를 얻지 못할 까봐 걱정됩니다.

디 컴파일은 HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriod이 값을 읽는 위치와 500ms 제한이 적용되는 위치를 찾기 위해 사용되는 영역을 정확히 찾아내는 데 도움 이됩니다.

일단 발견되면 테스트를 비활성화하고 HoverPeriod를 더 작게 적용하기 위해 이진 코드를 패치해야합니다. 바이너리를 패치하는 것은 재 컴파일보다 훨씬 가능합니다.

osk.exe가 Windows Update (실제로 일어날 것으로 예상되지 않음)로 교체되면 노력을 반복해야 할 수도 있습니다.

[편집하다]

더 많은 정보를 얻을 수 있도록 다음은 유틸리티 및 사용법에 대한 몇 가지 단어입니다.

C- 디 컴파일러 또는 디스어셈블러를 사용할 수 있습니다. 후자의 유형은 인텔 명령어 세트에 대한 약간의 지식이 필요하지만 더 유용 할 수 있습니다. 또한 좋은 16 진 편집기가 필요하며 디스어셈블러 기능을 광고하는 것도 있습니다 (아래 링크 참조).

프로젝트 펜리스 는 “코드 분석, 디버깅, 프로토콜 분석, 리버스 엔지니어링, 법의학, 진단, 보안 감사, 취약성 조사 및 기타 여러 목적에 적합한 도구 모음”으로 자신을 광고합니다. 많은 사람들이 좋아하고 추천하는 것처럼 들리지만 경험이 없습니다.

REC Studio Decompiler 는 실행 파일을 빌드하는 데 사용되는 코드 및 데이터의 C와 유사한 표현을 생성하려고 시도합니다.

부메랑 은 머신 코드 프로그램의 일반적인 오픈 소스 리 타겟팅 디 컴파일러입니다.

더 많은 유틸리티는 인터넷 검색 또는 다음에서 찾을 수 있습니다.

wikibooks x86 분해 / 분석 도구
wikibooks x86 분해 / 분해기 및 디 컴파일러
Open Directory : Disassemblers

예비 단계는 osk를 분해하는 것입니다. 결과 목록은 방대한 양일 수 있으며 훌륭한 텍스트 편집기가 필요합니다 (일반적으로 notepad ++이면 충분합니다).

“HoverPeriod”문자열을 검색하십시오 (대소 문자 구분). 운이 좋으면 디스어셈블러가 문자열로 식별하여 그대로 찾을 수 있습니다. 그렇지 않은 경우 바이트 단위로 검색해야합니다. 유니 코드 문자열 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 진 편집기가 어셈블러 검색을 지원하지 않는 경우 원래 명령 바이트를 나열하는 동안 디스 어셈블리를 수행하여 검색 할 2 진 바이트를 알 수 있습니다. exe에서 주소가 재배치 될 수 있으므로 주소가 포함 된 명령어를 검색하지 마십시오. 따라서 명령어와 가까운 바이트 시퀀스를 검색하십시오.

16 진 편집기에서 어셈블러를 지원하는 경우 직접 새 패치 바이트를 작성할 수 있습니다. 그렇지 않은 경우 인텔 기계 코드에 익숙하지 않은 경우 새 코드를 컴파일 할 어셈블러를 찾고 해당 목록을 사용하여 패치에 사용할 컴파일 된 바이트를 가져 오십시오.


답변

클릭을 자동화하기 위해 AutoIt 을 사용하는 것이 좋습니다 .

아이디어는 커서가 화면 창 내에있을 때 (예 : 제어 루프에서 커서가 위치를 변경했는지 여부를 정기적으로 확인) 마우스 클릭 후 100ms 후에 자동 클릭 (SendClick 호출)을하는 것입니다. 비 활동의.

.exe의 리버스 엔지니어링을 능가합니다.


답변

어쩌면 모든 것을 다시 컴파일 할 필요는 없습니다. 게임 세계에서는 프로그램이 실행될 때 메모리의 값을 조작하는 트레이너를 사용하는 것이 일반적입니다. 메모리 (0.5)에서 최소값을 찾고 로더와 같은 숫자를 작게 프로그래밍하면 작동 할 수 있습니다.