在windows有一些应用经常会通过一些wlan的API获取用户位置信息,比如WlanGetAvailableNetworkList,如果用户关闭了位置权限的情况下第一次使用这些API的时候,windows系统会出现一个弹框提示如下:

当用户点击yes的时候安全与隐私的位置开关的三个开关就会被打开

微软官网60dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9k6h3q4J5L8W2)9J5k6h3#2A6j5%4u0G2M7$3!0X3N6q4)9J5k6h3y4G2L8g2)9J5c8Y4A6Z5i4K6u0V1j5$3&6Q4x3V1k6%4K9h3&6V1L8%4N6K6i4K6u0r3N6$3W2F1x3K6u0Q4x3V1k6F1j5i4c8A6N6X3g2%4K9h3k6A6i4K6u0r3N6$3W2Q4x3X3c8X3K9g2)9J5k6r3q4U0j5$3g2K6M7#2)9J5k6r3I4G2j5$3q4@1K9h3!0F1i4K6u0V1j5$3S2S2L8X3N6W2M7H3`.`. 里有明确说明这点,。

以往的绕过的方法是通过powershell设置注册表就可以实现自动打开
/**************************************************************************************************/
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\CapabilityAccessManager\ConsentStore\...\location" -Name "Value" -Value "Allow" -Type String -Force
/**************************************************************************************************/
这个方法以及现在网上或者DeepSeek所有能搜索到的方法都无效了,或者AI给了一个结果是没有不弹框的方法

难道最新的win11真的无法绕过吗?答案是否定的,接下里就是逆向分析如何绕过最新的win11
- 找到设置开关的程序
首先我们打开Windows系统设置程序SystemSettings.exe去点击开关。同时打开windows的SysinternalsSuite工具去监控文件以及注册表读写(我们只需要关注这两个项目).

在ProcMonitor中设置关注Process Name包含SystemSettings,为什么这么设置而不设置完整的exe,一会你就晓得了

设置好后开始监控

从上往下翻阅可以发现SystemSettings.exe这个程序读写了很多注册表,但是实验后修改都无效,但是翻阅到其中一行Process Start的进程启动

启动了一个新的进程C:\Windows\system32\SystemSettingsAdminFlows.exe,而且进程启动的参数是"C:\Windows\system32\SystemSettingsAdminFlows.exe" SetCamSystemGlobal location 1
同时我们在ProcMonitor中加入关注svchost进程的事件会发现有一个命令行为-k osprivacy -p -s camsvc的系统服务会对location的一些注册表做操作,其实这个就是管理以前注册表里提到的CapabilityAccessManager的这个服务,camsvc就是Capability Access Manager的简称的服务。


我们可以修改验证下这个注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PolicyManager\default\Privacy\LetAppsAccessLocation
下面的Value -===》 0

如果注册表里把这个value值修改为 1

打开系统设置会发现,不允许做任何设置去打开位置开关,变成由你所在的组织去管理

但是这个设置和开关没有任何关系,只是验证这个svchost服务
如果在ProcMonitor中我们还可以看到每次设置的时候,该svchost程序会操作文件C:\ProgramData\Microsoft\Windows\CapabilityAccessManager\CapabilityConsentStorage.db

打开这个db可以看到一些信息
对这个svchost进程通过cheatengine附加调试会发现,每次设置的时候会调用rpc服务到这个进程去设置信息

由此我们可以猜测,系统设置程序通过rpc告诉svchost对当前用户去设置开关。
接下来我们再回到C:\Windows\system32\SystemSettingsAdminFlows.exe这个进程,启动一个管理员命令行程序去调用这个进程,同时把定位服务开关关闭

运行这个命令行后,会发现这个管会被打开,这样我们就得到了一个打开的方法


2.分析具体的进程的原理
以上第一步我们找到了具体的设置开关的进程,下面就对具体的进程实现的原理逻辑进行逆向。
同样我们通过ProcMonitor监控SystemSettingsAdminFlows.exe这个程序的读写注册表文件等等信息,如下

打开其中一个注册表监控内容去查看堆栈

在堆栈的红框的位置可以发现,在该进程的+0x20bcb 以及0x71bad的偏移的地址执行了RoGetActivationFactory,可以猜测出来这里是获取了一个com对象的class地址,下面就去system32的目录下面去找到这个进程并且通过ida打开这个进程去静态分析

可以看到这里是一个 CamSystemGlobalSetValue函数,继续往下翻阅

这里可以看出是一个com的调用,其中
v8 = (*(__int64 (__fastcall **)(__int64, _QWORD))(*(_QWORD *)v11 + 112LL))(v11, (v2 ^ 1u) + 1);
这个是获取com后其中一个偏移的函数时设置开关,如果参数v2是0,表示传输的参数是0,这个(v2 ^ 1u) + 1表达式的值就是1,设置1是关闭,如果传入的参数是1的时候表示打开,这个(v2 ^ 1u) + 1就是2,设置2就是打开
下面我们就写代码验证我们的猜测
bool WRlWraper::SetCamSystemGlobalValue(bool Switch)
{
Init();
WRlHandle Handle;
HRESULT hr = CreateReference(&Handle,
s_WindowsCapabilityManager.c_str(),
s_WindowsCapabilityManager.capacity(),
s_WindowsCapabilityManager.length()
);
if (hr != S_OK)
{
return false;
}
void* pClass = NULL;
hr = GetActivationFactory(Handle.string, &pClass);
if (hr == S_OK && pClass)
{
pCapabilityManager* pManager = (pCapabilityManager*)pClass;
__try
{
if (pManager->pComPtr && pManager->pComPtr->ActivateInstance)
{
WRlHandle HandleLocation;
CreateReference(&HandleLocation,
s_LocationName.c_str(),
s_LocationName.capacity(),
s_LocationName.length()
);
void* pRet = nullptr;
hr = pManager->pComPtr->ActivateInstance(pManager, HandleLocation.string, &pRet);
if (hr == S_OK && pRet)
{
pLocation* Location = (pLocation*)pRet;
if (Location->LocationPtr && Location->LocationPtr->SetCamLocationSwitch)
{
hr = Location->LocationPtr->SetCamLocationSwitch(
Location,
Switch == true ? 1 : 2);
}
if (Location)
{
Release((ComBase*)Location);
}
}
}
if (pManager)
{
Release((ComBase*)pManager);
}
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
hr = E_FAIL;
}
}
return hr == S_OK ? true : false;
}
代码写好了我们可以单步调试验证
(1 )先关掉定位服务

(2)单步调试

单步往下后,hr返回0 表示成功

实际效果如何呢?且看

成功打开,而且windows没有任何弹框提示,如果你的程序是一个服务进程只需要这一个开关打开就可以获取位置信息,但是如果你的程序是一个用户账号下的还需要打开下面的两个开关

用户权限下的应用程序必须再次打开允许应用访问位置和让桌面应用程序访问位置,才可以获取位置信息,同样的分析方法,读者可以自行分析,此次这个开关的原理分析完毕。
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!
最后于 2小时前
被basketwill编辑
,原因: