【网络编程】获取网络连接状态
概述:获取网络连接状态调用接口分析
环境状况描述:windows 10 x 64
使用 COM 对象查看网络连接状态
1 |
|
调用分析
结论:调用的接口为 get_IsConnectedToInternet
,此接口为 RPC 客户端接口,调用时通过 RPC 远程调用服务端的接口。
get_IsConnectedToInternet
,此接口为 RPC 客户端接口,调用时通过 RPC 远程调用服务端的接口。分析过程:调用时可以看到会进入 netprofm 中的 CPubINetworkListManager::get_IsConnectedToInternet
接口,又在该接口当中创建了 COM 对象通过 RPC 远程调用到服务端的 RPC 接口。
这里可以在 GetPrivateNetworkListManager
中看到创建的 COM 对象的 CLSID 和 IID。在注册表查询相关 COM 组件。查询结果如下所示:
- 通过 CLSID 查询 com 组件的文件
- 接着使用 OLEView 查看具体的接口对象,可以看到为
INetworkListManager
。 - 在 APPID 中查看 netprofm 注册的应用
可以看到 netprofm
是作为本地服务的,服务名就是 netprofm
。
分析 netprofm 服务
这里要做的就是使用 windbg 调试,然后查看可能相关的 dll 或者接口
相关 DLL
分析思路
这里由于我第一次调试也没有什么经验,后来又大佬帮助,所以整个思路我都补充一下,尽量详细一点,这里补充下服务端调用分析思路。
- 使用 windbg 调试可以看到有一个 netprofmsvc 的 dll
- 查看其接口都有哪些,然后在可能会被调用的接口上打断点
1
x /D /f netprofmsvc!*Get*
- 使用客户端查询,看断点是否会触发
稍微看下,差不多也能猜到基本上都在 CImplINetworkListManager
类提供的接口中,打断点调试 CImplINetworkListManager::IsConnectedToInternet
。剩下的就是具体的调试过程了。具体含义如下所示,
CImplINetworkListManager::GetConnectivity
往后的执行逻辑感兴趣的可以调试看看。
拓展阅读
这里补充一个查询网卡 GUID 的堆栈,主要记录拓展以下这里查询的逻辑。
调用堆栈如下所示:
1 |
|
相关知识
先调试记录一下分析过程:
- 添加断点,在
netprofmsvc!GetBestInterfaceGuid
之后打断点,这里主要是为了查看函数执行结果这里可以看到传入的参数为 rcx,指向的位置为1
__int64 __fastcall GetBestInterfaceGuid(struct _GUID *_guid)
rbp-61h
。在断点处查看这个变量即可,如下所示:这里我们就获取到了一个网卡的 GUID 为1
dt ntdll!_GUID rbp-61h
{a0dce93d-2e39-496c-a9df-0f894c247ef9}
,下一步就是在注册表中进行查询具体的网络接口。 - 查询网卡项(这一步可以忽略)
注册表位置:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}
这个位置是固定的,需要在这个注册表项下根据第一步的 GUID 查询具体的键值项。查询结果如下所示: - 根据 GUID 查询网络适配器
注册表位置:SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\{GUID}
补充
相关断点
1 |
|
对于 RPC 远程调用接口的查看可以参考文章:
[[…/…/…/wiki/调试技术/【调试技术】各种场景下调试汇总#查看 call 寄存器时调用的函数|【调试技术】各种场景下调试汇总]]
No newline at end of file
【网络编程】获取网络连接状态
https://hodlyounger.github.io/2024/10/11/A_OS/Windows/网络helper/【网络编程】获取网络连接状态/