更改Windows 7屏幕键盘中的特定配置值


9

我必须使用Windows 7的屏幕键盘输入:

(如果您尚未使用它,则可以通过以下方式获得它:所有程序 -> 附件 -> 易于访问 -> 屏幕键盘

或直接搜索“ osk.exe”)

屏幕键盘

它提供了“悬停”按钮的功能。Microsoft将其描述如下:

在悬停模式下,您可以使用鼠标或操纵杆在预定的时间段内指向键,然后自动键入所选字符。

这是我的具体问题。在预定时间段过长,对我来说非常有用。最短时间为0.5秒(最多3秒)。

有什么办法可以将此值更改< 0.5?例如通过编辑注册表?

编辑:HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriod不能将条目设置为低于500毫秒。

编辑(2):我认为解决问题的唯一方法是反编译.exe(我猜它是用C编写的,或者?)并更改最短时间。然后,我必须再次编译它。此程序是否可行?什么事情可能失败?

任何有用的提示都很棒!


1
重新编译将是一件困难的事情,它将是1)大部分不可读(即使您使用Microsoft的Symbols)和2)您不知道它在哪里进行检查,因此如果找到分配给500的变量,您可能会遇到麻烦或0.5,但是仍然必须跟踪其流动的路径,并且3)您仍然必须重新编译整个程序,这通常由于反编译不好而无法实现。可悲的是,除非您有一条调试电缆并将计算机连接到另一台计算机,否则调试也是不可能的
Tamara Wijsman 2012年

我认为将其保持原样是明智的。每半秒钟一个字符还不错,如果速度太快,错误就会开始发生。
cutrightjm 2012年

既然不能方便地在这个博客上编辑我的意见,这可能帮助一些人谁知道C#或其他语言来写这个补丁:daniweb.com/hardware-and-software/microsoft-windows/threads/...
cutrightjm

@fnst:如果您真的对速度感兴趣,请考虑使用Dasher。我会在回答中概述它...
Tamara Wijsman 2012年

@ekaj:据我所知,这只是嵌入了应用程序。您能告诉我们那有什么帮助吗?
塔玛拉·威斯曼

Answers:


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

查看代码中的加法或减法,我只看到40十六进制(64十进制)发生了一些事情。因此,这也与数字无关。

它可能在四个cmp(比较)指令之一中,但这将需要调试信息。或者它可能完全在更高级别的功能中发生,这需要更多的研究。但是如果没有调试能力而又不失去输入能力,这是一件非常困难的事情……

似乎找到正确的位置将需要一条调试电缆,因为要调试的计算机失去了其输入功能,或者由于调试的开销而变得太慢。由于我目前没有带1943端口的笔记本电脑,因此我无法自己进行调试。它将能够做到这一点,是的,它将从字面上冻结您的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

请注意,变更74JZ)在十六进制编辑器E9JMP)将无法工作。您无法在十六进制编辑器中执行此操作,您将需要对代码进行反汇编和重新汇编,但是并不一定易于查找(例如,人们实际付费的IDA Professional,无法生成适当的C代码或可执行文件。补丁社区中常用的OllyDBG甚至无法打开可执行文件。)甚至,Microsoft可能正在保护其可执行文件不被篡改,因为这可能会被视为违反EULA。所以,祝你好运!

Me!这很难,我只想用鼠标/眼睛/ ...快速键入。

您绝对应该检查一下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事件的堆栈跟踪。我猜您在这里谈论自己的答案吗?由于回答数量很多,您的回答严重缺乏质量。考虑改善和/或删除您的答案,而不要放置不打算改善问答的快速,肮脏的答案或愚蠢的评论;您可以猜测哪种方法将最有效地帮助社区...
Tamara Wijsman 2012年

1
@harrymc:(1)它说我在哪里破解?我只是在这里显示一个起点,我并没有失败,并且我证明了继续前进需要额外的设备或家庭作业。质量就在我的答案中,数量必须由读者来完成,或者当我遇到远程调试设置时。(2)Googling Process Monitor和WinDBG并不是火箭科学。(3)感谢您的赞美,也许我也应该在答案中解释汇编的工作原理吗?
Tamara Wijsman 2012年

@harrymc:我的回答是一个很好的起点。您的错误在于未提供足够的详细信息,如该问题的答案和评论所显示。您刚刚发现有必要再提出另一条不打算改善我的答案或不告诉自己问题出在哪里的评论,这将使花费更多时间来提出一个显示努力的答案,而不是过于笼统。我看不出您The decompilation help. Once located, you should patch the binary code.的用处如何,我宁愿进行超长而带回家的锻炼,而不要抓挠头发……
Tamara Wijsman 2012年

@harrymc:您假设它是通用的;但是,如果您检查了它的引用和依赖关系,您会发现它不会覆盖其自己的配置(仅从该注册表项加载),而不会破坏其任何行为。我已经检查了它的引用和依赖性,所以我知道其用途。您也要删除最后一条评论吗?;)
Tamara Wijsman 2012年

如果您真的破解了它,那么离创建修补的osk只需几分钟的路程。为什么不完成这项工作,让海报评委呢?
harrymc 2012年

2

恐怕大多数反编译器都不会产生可以重新编译的足够好的结果。

反编译只能帮助查明所HKEY_CURRENT_USER\Software\Microsoft\Osk\HoverPeriod使用的区域,以便找出在何处读取该值以及在何处执行500 ms限制。

找到后,您应该修补二进制代码,以禁用测试并强制HoverPeriod较小。修补二进制文件比重新编译更为可行。

如果osk.exe曾经被Windows Update取代(我不太希望发生这种情况),则可能需要重复努力。

[编辑]

为了进一步帮助您,以下是有关实用程序及其用法的一些话。

您可以使用C反编译器或反汇编程序。后一种类型可能更有用,尽管它需要一些有关Intel指令集的知识。您还将需要一个好的十六进制编辑器,并且其中一些广告宣传反汇编程序功能(请参见下面的链接)。

fenris项目广告宣传自己为“适用于代码分析,调试,协议分析,逆向工程,取证,诊断,安全审计,漏洞研究和许多其他目的的工具套件”。听起来不错,很多人推荐,但我没有经验。

REC Studio Decompiler尝试生成用于构建可执行文件的代码和数据的类似C的表示形式。

Boomerang是一种通用的,开源的,可重定位的机器代码程序反编译器。

可以通过以下方式找到更多此类实用程序:

Wikibooks x86拆卸/分析工具
Wikibooks x86拆卸/反汇编和反编译
Open Directory:Disassemblers

初步步骤是拆卸osk。结果列表可能很庞大,并且需要一个好的文本编辑器(通常使用notepad ++就足够了)。

搜索字符串“ HoverPeriod”(不区分大小写)。如果幸运的话,反汇编程序已将其标识为字符串,您可以按原样查找它。如果不是,则需要逐字节搜索它。作为Unicode字符串,看起来H,0,o,0,v,0...应该用字母的数字代码替换字母。

找到“ HoverPeriod”字符串后,反汇编程序应在其前面的某个位置放置标签。使用此生成的标签的名称搜索在何处使用它,以标识从注册表中检索它的位置以及结果存储在哪个全局变量中。

找到保存计数的变量后,搜索其使用位置。您将执行的操作取决于您将找到的代码的格式。然后,您可以决定所需的补丁。

例如,您可能要使用十六进制编辑器在osk.exe中替换以下命令:

move AX,<HoverPeriod milliseconds count variable>

进入

mov AX,200       (your count of 200 milliseconds)

请注意不同的命令长度,如果新命令较短,则需要用一字节的NOP指令(无操作)填充到旧指令的长度。

在osk.exe中找到要修补的命令可能需要搜索反汇编程序给出的偏移量是否在代码中,而不是在exe文件中。如果十六进制编辑器不支持汇编程序搜索,请在列出原始指令字节的同时进行反汇编,以便您知道要搜索的二进制字节。避免搜索包含地址的指令,因为地址可能会在exe中重定位,因此应搜索接近该指令的字节序列。

如果支持修补程序,则可以直接在十六进制编辑器中创建新的修补程序字节。否则,如果您对Intel机器代码不满意,请找到一个汇编器来编译您的新代码,并使用其清单获取编译后的字节用于修补。


鉴于该值被更通用的功能覆盖,因此更改将无效。更改它从注册表获得的每个值都会破坏应用程序。请参阅我关于此通用功能的答案。十六进制编辑器将无法工作,因此只能找到合适的(反)汇编器(或[反]编译器)。
Tamara Wijsman 2012年

1

我可以建议使用AutoIt自动执行点击吗?

这个想法是当光标在屏幕上的窗口中时监视鼠标的空闲状态(例如,在控制循环中,以规则的间隔检查光标是否已更改位置),并在例如100毫秒后自动单击(调用功能SendClick)不活动。

击败反向工程的.exe。


+1表示将“我需要它来加快点击速度”变成“我让它以一种聪明的方式加快点击速度”。
Tamara Wijsman '04 -4-2

0

也许您不必重新编译所有内容。在游戏世界中,通常使用训练器,它们在程序运行时操纵内存中的值。如果您在内存(0.5)中找到最小值,并编程类似装载程序的程序以减小该值,那么它可能会起作用。


仅当该值位于相同位置或具有该值的Xth值时,这才可行。无论如何,T Search和Quick Memory Editor是两个不错的工具。您可能需要搜索,500因为这是它的加载方式,而不是浮点数。
塔玛拉·威斯曼

第一次尝试时,似乎osk.exe不在进程列表中。这是因为它是在上下文中启动的winlogon,因此可以跨用户使用,您也可以通过在上下文中启动内存编辑器来解决此问题winlogon
塔玛拉·威斯曼

有关执行此操作的方法,请参见stackoverflow.com/questions/9868079/…stackoverflow.com/a/3143055/47064,简单的方法是替换,osk.exe但是仅当您创建启动器时才启动内存编辑器并启动备份的osk.exe。但是随后您必须考虑到装载程序也需要这样做。似乎此解决方案变得像拆装一样困难,osk.exe很难... :)
Tamara Wijsman 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.