Windows 7의 화상 키보드에서 특정 구성 값 변경


9

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

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

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

화상 키보드

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

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

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

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

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

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

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


1
재 컴파일은 어려운 일이 될 것입니다 .1) 대부분 읽을 수 없으며 (Microsoft의 Symbols를 사용하더라도) 2) 500을 할당 한 변수를 찾으면 돌아갈 수 있습니다. 또는 0.5 그러나 여전히 경로가 흐르는 경로를 추적해야하며 3) 여전히 전체 디 컴파일을 가져와야합니다. 디 컴파일이 잘못되어 종종 불가능합니다. 안타깝게도 디버그 케이블이없고 컴퓨터를 다른 케이블에 연결하지 않으면 디버깅도 불가능합니다.
Tamara Wijsman

나는 그대로 두는 것이 현명하다고 생각합니다. 0.5 초마다 하나의 문자가 그렇게 나쁘지는 않으며, 너무 빠르면 실수가 발생하기 시작합니다.
cutrightjm

이 게시물에 대한 내 의견을 편하게 편집 할 수 없으므로 C # 또는 다른 언어를 알고있는 사람들이이 패치를 작성하는 데 도움이 될 수 있습니다. daniweb.com/hardware-and-software/microsoft-windows/threads/…
cutrightjm

@ fnst : 속도에 정말로 관심이 있다면 Dasher를 고려하십시오 . 나는 내 대답에 그것을 설명 할 것입니다 ...
Tamara Wijsman

@ ekaj : 내가 말할 수있는 한 응용 프로그램을 포함합니다. 그것이 어떻게 도움이 될 수 있는지 알려 주시겠습니까?
Tamara 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 진수 만 발생하는 것을 볼 수 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에는 일부 구성이 있으므로 원하지 않는 것을 조정할 수 있습니다.


@ harrymc : 읽은 경우 Using Process Monitor, digging into the for the ETL event reading out that value stack trace gives us:ETL 이벤트의 스택 추적을 확인한 것입니다. 나는 당신이 당신의 자신의 대답에 대해 이야기하고 있다고 생각합니까? 많은 양의 답변으로 인해 답변의 품질이 심각하게 떨어집니다. Q & A를 개선 할 의도가없는 속삭이는 답변이나 바보 같은 의견을 제시하는 대신 답변을 개선 및 / 또는 제거하는 것이 좋습니다. 당신은 어떤 접근 방식이 지역 사회를 가장 도울 수 있을지 추측 할 수 있습니다.
Tamara Wijsman

1
@harrymc : (1) 크래킹 중이라고 말하는 곳은 어디 입니까? 나는 여기서 출발점을 보여주고 있으며, 실패하지 않았으며 앞으로 나아 가기 위해 추가 장비 나 숙제가 필요하다는 것을 보여주었습니다. 품질은 제 대답에 있습니다. 수량은 독자가 수행해야하거나 원격 디버깅 설정을 수행해야합니다. (2) 인터넷 검색 프로세스 모니터와 WinDBG는 로켓 과학이 아닙니다. (3) 칭찬에 감사드립니다. 아마도 어셈블리가 어떻게 작동하는지 설명해야합니까?
Tamara Wijsman

@ harrymc : 내 대답은 좋은 출발점입니다. 귀하의 실수는 귀하의 답변과이 질문에 대한 의견으로 표시된 것처럼 충분한 세부 사항을 제공하지 않는 데 있습니다. 내 대답을 향상시키지 않거나 잘못된 점을 말하지 않는 또 다른 의견을 제시해야한다는 것을 알았 습니다 . 너무 일반적인 것이 아니라 노력을 나타내는 답변을 작성하는 데 시간이 더 걸릴 입니다. 나는 당신 이 얼마나 유용한 지 모르겠습니다. 오히려 머리를 긁는 대신 초장 거리 운동을 선호합니다.The decompilation help. Once located, you should patch the binary code.
Tamara Wijsman

@ harrymc : 당신은 그것이 일반적인 목적이라고 가정하고 있습니다; 그러나 참조 및 종속성을 확인한 경우 해당 레지스트리 키에서만로드 된 자체 구성을 덮어 쓴 과거의 동작이 손상되지 않는 것을 알 수 있습니다. 참조와 종속성을 확인 했으므로 용도를 알고 있습니다. 마지막 댓글도 삭제 하시겠습니까? ;)
Tamara Wijsman

실제로 크랙 한 경우 몇 분만에 패치 된 osk를 만들 수 있습니다. 왜 일을 끝내고 포스터를 판단하게하지 않습니까?
harrymc

2

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

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


더 일반적인 함수로 덮어 쓰면 값을 변경할 수 없습니다. 레지스트리에서 얻는 모든 값을 변경하면 응용 프로그램이 중단됩니다. 이 일반적인 기능에 대한 내 대답을 참조하십시오. 16 진 편집기는 결과적으로 작동하지 않으므로 올바른 (디) 디셈 블러 (또는 [디] 컴파일러)를 찾는 것입니다.
Tamara Wijsman

1

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

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

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


"더 빠르게 클릭해야합니다"를 "똑똑한 방법으로 더 빠르게 클릭하게하십시오"로 바꾸려면 +1하십시오.
Tamara Wijsman

0

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


값이 같은 위치 또는 해당 값을 가진 X 번째 값에있는 경우에만 작동 할 수 있습니다. 어쨌든, T Search와 Quick Memory Editor는 이것을 시도하기에 좋은 도구입니다. 500플로트가 아닌로드하는 방식으로 대신 검색 할 수 있습니다 .
Tamara Wijsman

처음 시도 osk.exe하면 프로세스 목록에없는 것으로 나타납니다 . 이는 winlogon사용자간에 작동 하도록 컨텍스트에서 실행되기 때문에 컨텍스트에서 메모리 편집기를 실행하여이 문제를 해결할 수 winlogon있습니다.
Tamara Wijsman

이를 수행하는 방법 은 stackoverflow.com/questions/9868079/…stackoverflow.com/a/3143055/47064 를 참조하십시오 . 쉬운 방법은 교체하는 osk.exe것이지만 메모리 편집기와 백업 osk.exe. 그러나 로더도 그렇게해야한다는 것을 고려해야합니다. 이 솔루션은 분해와 조립만큼이나 어려워 보입니다 osk.exe... :)
Tamara Wijsman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.