Thay đổi giá trị cấu hình cụ thể trong Bàn phím trên màn hình của Windows 7


9

Tôi phải sử dụng Bàn phím trên màn hình của Windows 7 để gõ:

(Trong trường hợp bạn chưa sử dụng nó, bạn có thể tải qua: Tất cả chương trình -> Phụ kiện -> Dễ truy cập -> Bàn phím trên màn hình

hoặc chỉ đơn giản là tìm kiếm "osk.exe")

Bàn phím trên màn hình

Nó cung cấp một tính năng để "di chuột" về các nút. Microsoft mô tả nó như sau:

Trong chế độ di chuột, bạn sử dụng chuột hoặc cần điều khiển để trỏ đến một phím trong khoảng thời gian được xác định trước và ký tự được chọn sẽ được nhập tự động.

Có vấn đề cụ thể của tôi. Khoảng thời gian được xác định trước là quá dài để có ích cho tôi. Lượng thời gian tối thiểu là 0,5 giây (tối đa 3 giây).

Có cách nào để thay đổi giá trị này thành một cái gì đó < 0,5 không? Ví dụ thông qua chỉnh sửa sổ đăng ký?

Chỉnh sửa: Mục nhập HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodkhông thể được đặt thấp hơn 500 ms.

Chỉnh sửa (2): Tôi nghĩ cách duy nhất để khắc phục sự cố của tôi là dịch ngược .exe (tôi đoán nó được viết bằng C, hoặc?) Và thay đổi thời gian tối thiểu. Sau đó tôi phải biên dịch lại. Là thủ tục này thậm chí có thể thực hiện được? Điều gì có thể thất bại?

Bất kỳ lời khuyên hữu ích sẽ là tuyệt vời!


1
Biên dịch lại sẽ là một điều khó khăn, nó sẽ là 1) hầu như không thể đọc được (ngay cả khi bạn sử dụng Biểu tượng của Microsoft) và 2) bạn không biết nó sẽ kiểm tra ở đâu để bạn có thể tìm được nếu bạn tìm thấy một biến được gán cho 500 hoặc 0,5 nhưng sau đó bạn vẫn phải theo dõi con đường nơi nó chảy và 3) bạn vẫn phải lấy toàn bộ nội dung được biên dịch lại mà thường không thể thực hiện được do dịch ngược xấu. Đáng buồn thay, gỡ lỗi cũng không thể trừ khi bạn có cáp gỡ lỗi và gắn máy tính của bạn với một cái khác ...
Tamara Wijsman

Tôi nghĩ sẽ là khôn ngoan nếu cứ để nó như vậy. Một ký tự cứ sau nửa giây không phải là xấu, và nếu nó nhận được lỗi quá nhanh sẽ bắt đầu xảy ra.
cutrightjm

Vì tôi không thể thuận tiện chỉnh sửa nhận xét của mình về bài đăng này, điều này có thể giúp một số người biết C # hoặc các ngôn ngữ khác viết một bản vá cho điều này: daniweb.com/hardware-and-software/microsoft-windows/threads/ tựa
cutrightjm

@fnst: Nếu bạn thực sự quan tâm đến tốc độ, hãy xem xét Dasher . Tôi sẽ phác thảo nó trong câu trả lời của tôi ...
Tamara Wijsman

@ekaj: Điều đó chỉ cần nhúng ứng dụng, theo như tôi có thể nói. Bạn có thể cho chúng tôi biết làm thế nào sẽ giúp?
Tamara Wijsman

Câu trả lời:


7

Trường hợp trong mã nó tìm thấy khóa của chúng tôi?

Sử dụng Trình giám sát quy trình, đào sâu vào sự kiện ETL đọc ra dấu vết ngăn xếp giá trị mang lại cho chúng ta:

"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"

Chúng ta có thể thấy rằng OSKSettingsManager::GetOskSettingđọc ra giá trị.

Vì vậy, phần đó trông như thế nào? Chúng ta có thể gỡ lỗi không?

Nhìn vào chức năng đó với WinDBG, nó truy cập khóa đăng ký đó ngay trước đó 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]
...

Bây giờ, vấn đề ở đây là khi tôi cố gắng dừng điểm tại vị trí đó, tôi không còn có thể gõ bất cứ thứ gì vì osk.exetự thêm vào trình điều khiển đầu vào. Điều này có thể dễ dàng được nhìn thấy bằng cách giữ một phím bổ trợ như Alttrên bàn phím của bạn, nó sẽ sáng lên osk.exe.

Nhìn qua mã để thêm hoặc trừ, tôi chỉ thấy điều gì đó xảy ra với 40thập lục phân là 64số thập phân. Vì vậy, điều đó cũng không có gì liên quan đến số lượng.

Nó có thể là một trong bốn cmphướng dẫn (so sánh), nhưng điều đó sẽ yêu cầu thông tin gỡ lỗi. Hoặc nó có thể xảy ra trong một chức năng cao hơn hoàn toàn, sẽ cần điều tra nhiều hơn. Nhưng không có khả năng gỡ lỗi mà không mất khả năng nhập liệu, đây là một việc rất khó thực hiện ...

Có vẻ như việc tìm đúng vị trí sẽ yêu cầu cáp gỡ lỗi vì máy tính mà bạn gỡ lỗi bị mất khả năng nhập liệu hoặc quá chậm do quá trình gỡ lỗi. Vì hiện tại tôi không có máy tính xách tay có cổng 1943, tôi không thể tự mình sửa lỗi này. Nó sẽ có thể làm điều này, và vâng, nó sẽ đóng băng hệ điều hành của bạn. Gỡ lỗi một hệ điều hành thay vì một ứng dụng rất thú vị ... ^^

Chờ đã, chúng ta có quyền truy cập vào các biểu tượng! Chúng tôi có thể tìm thấy mã vi phạm?

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)

Nhìn kỹ hơn, bạn sẽ nhận thấy chức năng vi phạm:

OSKSettingsManager::_KeepSettingValueInBounds(ulong,ulong *,int)

Nếu chúng ta đi qua chức năng đó, trước tiên chúng ta sẽ thấy:

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        

Được rồi, điều này so sánh một cái gì đó và sau đó nhảy đến một vị trí khác. Có gì ở đó

pop     ebp
retn    8

Vì vậy, nếu điều kiện quyết định rằng nó phải nhảy, nó sẽ chỉ rời khỏi chức năng và không thay đổi bất cứ điều gì.

Vì vậy, làm thế nào để chúng ta làm cho nó luôn luôn rời khỏi chức năng?

Thay đổi jzhướng dẫn thành một jmphướng dẫn luôn luôn thực hiện bước nhảy, bạn có thể tìm thấy nó ở độ lệch tương đối 41BC10. Trong trường hợp chương trình của bạn tính toán bù đắp khác nhau, bạn cần biết rằng nó sử dụng 401000làm cơ sở để việc trừ đi mang lại cho chúng tôi sự bù đắp tuyệt đối 1AC10.

Xin lưu ý rằng việc thay đổi 74( JZ) trong trình soạn thảo hex thành E9( JMP) sẽ không hoạt động. Bạn không thể làm điều này trong trình soạn thảo hex, bạn sẽ cần một cái gì đó có thể tháo rời và lắp lại mã nhưng điều đó không nhất thiết phải tìm thấy (ví dụ: IDA Professional mà mọi người thực sự trả tiền, không thể tạo mã c phù hợp hoặc có thể thực thi được. OllyDBG, thường được sử dụng trong cộng đồng vá lỗi, thậm chí không thể mở tệp thực thi.). Và thậm chí, Microsoft có thể bảo vệ khả năng thực thi của mình trước sự giả mạo, bởi vì điều này có thể được xem xét chống lại EULA; vậy thì chúc may mắn!

Meh! Điều này thật khó, tôi chỉ muốn gõ nhanh bằng chuột / mắt / ...

Bạn chắc chắn nên kiểm tra Dasher nhanh hơn Bàn phím trên màn hình. Nó chỉ đơn giản hoạt động bằng cách di chuyển chuột của bạn về phía các chữ cái; chuyển động ngang xác định tốc độ và chuyển động dọc chọn các chữ cái. Với một từ điển được xây dựng, nó thậm chí có thể kích thước các chữ cái có khả năng lớn hơn, nó cũng cố gắng học hỏi từ chuyển động của bạn sao cho tốc độ và các chữ cái thực sự quen với việc sử dụng của bạn.

Một hình ảnh nói hơn một ngàn từ ...

Tất nhiên, điều này khá nhỏ và không thực sự nhanh như một ví dụ, nhưng bạn có thể thay đổi kích thước của nó ở bên phải màn hình để nó không cản trở màn hình của bạn. Điều này cho phép bạn gõ nhanh nhất có thể ...

Dưới đây là một ví dụ hay về cách dự đoán cho phép bạn nhập bất kỳ ngôn ngữ nào nhanh hơn:

Cũng lưu ý rằng các chữ cái ở bên phải được sắp xếp theo thứ tự cụ thể, sao cho hướng chính (lên, giữa hoặc xuống) chọn giữa các loại khác nhau (chữ thường, chữ hoa, số và dấu chấm câu); và sau đó trong hướng chính như vậy, hướng nhỏ của bạn sẽ chọn giữa AZ, az, 0-9, v.v. Tôi đã sử dụng điều này trong quá khứ và thực sự ngạc nhiên bởi mức độ thông thạo này so với các đối thủ khác ...

Cũng lưu ý rằng Dasher có một số cấu hình, vì vậy bạn có thể điều chỉnh thứ gì đó bạn không thích.


@harrymc: Nếu bạn đã đọc, Using Process Monitor, digging into the for the ETL event reading out that value stack trace gives us:bạn sẽ biết rằng tôi đã kiểm tra dấu vết ngăn xếp cho sự kiện ETL. Tôi đoán bạn đang nói về câu trả lời của riêng bạn ở đây? Bởi vì trả lời với số lượng lớn, câu trả lời của bạn thực sự thiếu một số chất lượng. Cân nhắc cải thiện và / hoặc xóa câu trả lời của bạn thay vì đặt những câu trả lời bẩn thỉu hoặc những bình luận ngớ ngẩn không có ý định cải thiện Q & A; bạn có thể đoán phương pháp nào sẽ giúp cộng đồng nhiều nhất ...
Tamara Wijsman

1
@harrymc: (1) Nó nói tôi đang bẻ khóa ở đâu? Tôi chỉ cho thấy một điểm khởi đầu ở đây, tôi đã không thất bại và tôi đã chỉ ra rằng thiết bị bổ sung hoặc bài tập về nhà là cần thiết để tiến lên. Chất lượng là trong câu trả lời của tôi, số lượng phải được thực hiện bởi người đọc hoặc khi tôi bắt gặp một thiết lập gỡ lỗi từ xa. (2) Trình theo dõi quá trình của Google và WinDBG không phải là khoa học tên lửa. (3) Cảm ơn lời khen, có lẽ tôi cũng nên giải thích cách lắp ráp hoạt động trong câu trả lời của mình?
Tamara Wijsman

@harrymc: Câu trả lời của tôi là một điểm khởi đầu tốt. Lỗi của bạn nằm ở việc không cung cấp đủ chi tiết, như thể hiện bằng cả câu trả lời và nhận xét của bạn trong câu hỏi này. Bạn chỉ tìm thấy nó cần thiết để đặt thêm một bình luận rằng không có ý định cải thiện câu trả lời của tôi hay không nói gì là sai với nó, nó sẽ đưa bạn một thời gian nữa để đưa lên một câu trả lời rằng chương trình nỗ lực thay vì là quá chung chung . Tôi không thấy tác dụng của bạn The decompilation help. Once located, you should patch the binary code.hữu ích như thế nào , tôi thích tập thể dục siêu dài và tập thể dục tại nhà thay vì gãi tóc ...
Tamara Wijsman

@harrymc: Bạn đang cho rằng đó là mục đích chung; nhưng, nếu bạn đã kiểm tra các tham chiếu và phụ thuộc của nó, bạn sẽ thấy rằng nó không phá hủy bất kỳ hành vi nào ghi đè lên cấu hình của chính nó, được tải chỉ từ khóa đăng ký đó. Tôi đã kiểm tra các tài liệu tham khảo và phụ thuộc của nó, vì vậy tôi biết việc sử dụng. Bạn sẽ xóa bình luận cuối cùng của bạn? ;)
Tamara Wijsman

Nếu bạn đã thực sự bẻ khóa nó, thì bạn chỉ cần vài phút để tạo ra một osk vá. Tại sao không hoàn thành công việc và để cho người đánh giá poster?
harrymc

2

Tôi sợ rằng hầu hết các trình dịch ngược sẽ không tạo ra kết quả đủ tốt để có thể biên dịch lại.

Việc dịch ngược chỉ có thể giúp xác định chính xác khu vực HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriodđược sử dụng, để tìm ra nơi giá trị này được đọc và nơi giới hạn 500 ms được thi hành.

Khi đã được định vị, bạn nên vá mã nhị phân để vô hiệu hóa kiểm tra và thực thi HoverPeriod nhỏ hơn. Vá nhị phân là khả thi hơn nhiều so với biên dịch lại.

Bạn có thể cần phải lặp lại nỗ lực nếu osk.exe bị thay thế bởi Windows Update (điều mà tôi không thực sự mong đợi xảy ra).

[BIÊN TẬP]

Để giúp bạn nhiều hơn trên đường đi, đây là một số từ về tiện ích và cách sử dụng chúng.

Bạn có thể sử dụng trình dịch ngược C hoặc trình dịch ngược. Loại sau này có thể hữu ích hơn, mặc dù nó đòi hỏi một số kiến ​​thức nhỏ về tập lệnh của Intel. Bạn cũng sẽ cần một trình soạn thảo hex tốt, và có một số quảng cáo khả năng trình dịch ngược (xem liên kết bên dưới).

dự án fenris tự quảng cáo là "bộ công cụ phù hợp để phân tích mã, gỡ lỗi, phân tích giao thức, kỹ thuật đảo ngược, pháp y, chẩn đoán, kiểm toán bảo mật, nghiên cứu lỗ hổng và nhiều mục đích khác". Âm thanh tốt và được nhiều người khuyên dùng, nhưng tôi không có kinh nghiệm với nó.

REC Studio Decompiler cố gắng tạo ra một đại diện giống như mã C và dữ liệu được sử dụng để xây dựng tệp thực thi.

Boomerang là một trình dịch ngược chung, mã nguồn mở, có thể nhắm mục tiêu lại của các chương trình mã máy.

Nhiều tiện ích như vậy có thể được tìm thấy bằng cách googling hoặc trong:

wikibooks x86 Công cụ phân tích / phân tích
wikibooks x86 Công cụ tháo gỡ / tháo gỡ và dịch ngược thư
mục mở: Disassemblers

Bước đầu tiên là tháo rời osk. Danh sách kết quả có thể rất lớn và yêu cầu trình soạn thảo văn bản tốt (thông thường notepad ++ là đủ).

Tìm kiếm chuỗi "HoverPeriod" (không phân biệt chữ hoa chữ thường). Nếu bạn may mắn, trình phân tách đã xác định nó là một chuỗi và bạn có thể tìm thấy nó như hiện tại. Nếu không, bạn sẽ cần tìm kiếm theo từng byte. Là một chuỗi Unicode, nó sẽ trông giống như H,0,o,0,v,0...nơi các chữ cái sẽ được thay thế bằng mã số của chúng.

Khi bạn đã tìm thấy chuỗi "HoverPeriod", trình dịch ngược sẽ đặt một nhãn ở đâu đó trước nó. Sử dụng tên của nhãn được tạo này để tìm kiếm nơi nó được sử dụng, để xác định nơi nó được truy xuất từ ​​sổ đăng ký và trong đó biến toàn cục là kết quả được lưu trữ.

Khi bạn đã xác định được biến giữ số đếm, hãy tìm kiếm nơi nó được sử dụng. Những gì bạn sẽ làm phụ thuộc vào định dạng của mã mà bạn sẽ tìm thấy. Sau đó bạn có thể quyết định các bản vá bạn muốn.

Ví dụ: bạn có thể muốn sử dụng trình soạn thảo hex để thay thế trong osk.exe một lệnh như:

move AX,<HoverPeriod milliseconds count variable>

vào

mov AX,200       (your count of 200 milliseconds)

Cẩn thận với các độ dài lệnh khác nhau, trong đó nếu lệnh mới ngắn hơn, nó sẽ cần được đệm bằng các lệnh NOP một byte (không hoạt động) với độ dài của lệnh cũ.

Định vị lệnh để vá trong osk.exe có thể yêu cầu tìm kiếm nếu phần bù mà trình phân tách đưa ra nằm trong mã chứ không phải trong tệp exe. Nếu trình soạn thảo hex không hỗ trợ tìm kiếm trình biên dịch chương trình, hãy thực hiện thao tác tháo gỡ trong khi liệt kê các byte lệnh gốc để bạn sẽ biết nên tìm kiếm byte nhị phân nào. Tránh tìm kiếm các hướng dẫn có chứa địa chỉ, vì các địa chỉ có thể được định vị lại trong exe, thay vào đó hãy tìm kiếm một chuỗi các byte gần với một hướng dẫn như vậy.

Bạn có thể tạo các byte vá mới trực tiếp trong trình soạn thảo hex nếu nó hỗ trợ trình biên dịch chương trình. Hoặc nếu không và bạn không cảm thấy thoải mái với mã máy Intel, hãy tìm một trình biên dịch để biên dịch mã mới của bạn và sử dụng danh sách của nó để lấy các byte được biên dịch để sử dụng để vá.


Thay đổi giá trị sẽ không hoạt động nếu nó được ghi đè bởi một hàm chung hơn. Thay đổi mọi giá trị mà nó nhận được từ sổ đăng ký sẽ phá vỡ ứng dụng. Xem câu trả lời của tôi cho chức năng chung này. Kết quả là một trình soạn thảo hex sẽ không hoạt động, do đó, nó đi xuống để tìm trình biên dịch (de) trình biên dịch đúng (de]).
Tamara Wijsman

1

Tôi có thể đề nghị sử dụng AutoIt để tự động nhấp không?

Ý tưởng sẽ là theo dõi chuột chạy không tải khi con trỏ ở trong cửa sổ trên màn hình (ví dụ: trong vòng điều khiển, kiểm tra tại một khoảng thời gian thông thường xem con trỏ có thay đổi vị trí không) và tự động nhấp (chức năng gọi SendClick) sau, giả sử, 100ms không hoạt động.

Beats kỹ thuật đảo ngược một .exe.


+1 để biến "Tôi cần nó nhấp nhanh hơn" thành "Tôi để nó nhấp nhanh hơn theo cách thông minh".
Tamara Wijsman

0

Có lẽ bạn không phải biên dịch lại mọi thứ. Trong thế giới trò chơi, người ta thường sử dụng các trình huấn luyện, thao tác một giá trị trong bộ nhớ khi chương trình đang chạy. Nếu bạn tìm thấy giá trị tối thiểu trong bộ nhớ (0,5) và lập trình một cái gì đó giống như trình tải để làm cho số đó nhỏ hơn, nó có thể hoạt động.


Điều đó có thể hoạt động, chỉ khi giá trị ở cùng một vị trí hoặc giá trị Xth có giá trị đó. Trong mọi trường hợp, T Search và Quick Memory Editor là hai công cụ tuyệt vời để thử điều này. 500Thay vào đó, bạn có thể muốn tìm kiếm vì đó là cách nó tải nó vào chứ không phải là một hình nổi.
Tamara Wijsman

Khi thử lần đầu, có vẻ như osk.exekhông có trong danh sách quy trình. Điều này là do nó được khởi chạy trong ngữ cảnh winlogonđể nó hoạt động trên nhiều người dùng, bạn có thể khắc phục điều này bằng cách khởi chạy trình chỉnh sửa bộ nhớ trong ngữ cảnh winlogon.
Tamara Wijsman

Xem stackoverflow.com/questions/9868079/...stackoverflow.com/a/3143055/47064 cho một cách tiếp cận để làm điều này, cách tiếp cận dễ dàng là để thay thế osk.exenhưng điều đó công việc sẽ chỉ nếu bạn tạo một launcher mà ra mắt cả hai trình biên tập và bộ nhớ các sao lưu osk.exe. Nhưng sau đó, bạn phải xem xét rằng một trình tải cũng sẽ cần phải làm điều đó. Có vẻ như giải pháp này trở nên khó khăn như tháo gỡ và lắp ráp, osk.exethật khó ... :)
Tamara Wijsman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.