它在代码中的哪里找到我们的密钥?
使用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
。
请注意,变更74
(JZ
)在十六进制编辑器E9
(JMP
)将无法工作。您无法在十六进制编辑器中执行此操作,您将需要对代码进行反汇编和重新汇编,但是并不一定易于查找(例如,人们实际付费的IDA Professional,无法生成适当的C代码或可执行文件。补丁社区中常用的OllyDBG甚至无法打开可执行文件。)甚至,Microsoft可能正在保护其可执行文件不被篡改,因为这可能会被视为违反EULA。所以,祝你好运!
Me!这很难,我只想用鼠标/眼睛/ ...快速键入。
您绝对应该检查一下Dasher,它比屏幕键盘快得多。只需将鼠标移到字母上即可。水平移动确定速度,垂直移动选择字母。借助内置的词典,它甚至可以将最可能出现的字母的大小设置为更大,它还会尝试从您的动作中学习,以使速度和字母真正适合您的用法。
图像说出一千多个单词。
当然,这只是一个很小的例子,并不是真的很快,但是您可以将其大小调整为位于屏幕的右侧,以免干扰屏幕。这使您可以尽快键入...
这是一个很好的示例,说明了预测如何使您可以更快地键入任何语言:
还要注意,右边的字母按特定顺序排序,以便主方向(上,中或下)在不同类型(小写,大写,数字和标点符号)之间进行选择;然后在该主要方向内,您的次要方向将在AZ,az,0-9等之间进行选择。我过去曾经使用过它,与其他竞争者相比,它的流利程度令我惊讶。
另请注意,Dasher具有一些配置,因此您可以调整不喜欢的内容。