코드에서 어디에서 키를 찾습니까?
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
있습니다. 그래서 그것은 또한 숫자와 관련이 없습니다.
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에는 일부 구성이 있으므로 원하지 않는 것을 조정할 수 있습니다.