近期有使用手机投屏的需求,用过几个小工具感觉效果不是很理想。所以想着着手分析下,发现涉及到了三阶段的知识,目前在科锐学到了二阶段尾声,于是向老师请教,在老师的指点下,艰难的进行了一些分析。如有分析不对的地方烦请各位指正。
软件版本 : 11.1.6.31 (PCManager_Setup_11.1.6.31(C233D005).exe)
虚拟机 :windows 10 21H2 x64
真机 : windows 10 21H1 x64
工具 :IDA 、VS 2019
测试手机 : 华为 Mate 30 5G
从华为电脑管家官网上下载最新版本的安装包后,给我的感觉是一个类似与msi的安装包。
将安装包拖入虚拟机,同时打开process monitor
抓取一波安装时的行为,方便后续分析。
首先最直观的提示是
同样是windows,华为电脑和其友商电脑有什么区别?我感觉最直观的体现在于下图
有这个方向下一步就需要关注下针对主板或者系统信息的一次操作。
将安装包拖入到ida中,在入口函数处竟然发现了一个明显的提示
这华为电脑管家安装包应该是通过NSIS打包生成的。之前使用过NSIS
进行过打包,该工具主要通过编写一个脚本文件(*.nsi/*.ini
等)完成一系列操作。例子如下:
用7Z直接解压PCManager_Setup_11.1.6.31(C233D005).exe
看看是否可能从修改脚本重打包的方式绕过对设备的检测。
但是在压缩包的根目录并没有找到相关的脚本文件,因此这个方法并不可行。
不过既然解压了就试下解压后的可执行文件是否能运行。在解压目录找到PCManager.exe
运行。
可以直接运行,难道就此结束吗?跟着窗口的各种提示一路点击"同意",但是还是有问题。
可能是跳过了安装过程没有给安装上服务的原因,点击"修复"。
连接手机并进入"多屏协同"。此时并不能正常识别到手机。
到此看来,似乎并不能通过解压的方式正常运行"华为电脑管家"。
知道了安装包并不包含主要的逻辑代码,那么就需要从安装包中包含的模块入手分析。
回到开始时用process monitor
抓取到的信息中,在日志中可以看到一条信息
通过命令行参数可以大胆猜测下,这里可能就是验证设备兼容性的函数。在IDA中定位到MBAInstallPre.exe
中对参数isSupportDevice
判断的位置。
通过观察流程该函数Func_isSupportDevice
主要有两个可能的返回值,分别是 : 1 或 2
首先进入函数sub_1400162D0
该函数在入口处调用了一次导入函数之后便进入到字符串的拼接环节。
这里主要看下导入函数的工作流程。
这里多次跟进ProductAdapt::MachineType::GetInstance
后发现会进入到一个函数__int64 __fastcall ProductAdapt::MachineType::LoadConfig(ProductAdapt::MachineType *this)
在函数ProductAdapt::MachineType::LoadConfig
再次发现了Func_isSupportDevice
里用到的一个类实例SmBiosHelper::GetInstance()
看来这个SmBiosHelper
这个类才是真正干活的。该函数由HardwareHal.dll
导出。
在其初始化函数中发现了如下调用:
下面是函数sub_180032750
的主要逻辑
通过MSDN GetSystemFirmwareTable发现该函数可以读取到SMBIOS固件表。同时该函数也提到了使用WMI也可以获取到。
通过GitHub代码 DumpSMBIOS尝试获取数据
通过wbemtest.exe
打开ROOT\WMI
并打开类MSSMBios_RawSMBiosTables
找到SMBiosData
显示SMBiosData
字段无数据。
这里不清楚为什么通过WMI GUI工具没有获取到数据,已经管理员方式运行了。
通过上图可以看出来使用GetSystemFirmwareTable
确实可以拿到主板信息。由上图中可以知道,如果通过GetSystemFirmwareTable
可以拿到信息之后则跳过了通过WMI
方式获取数据。
在拿到SMBiosData
字段或者说SMBIOSTableData
字段后,程序进行了如下处理。
主要对其中的5个字段进行了解析(文章结尾提供BIOS更多信息)。分别是
回到函数sub_1400162D0
内部,当函数ProductCheckSupport::GetDeviceTypeEx
返回后,则会得到对应设备的GetProductName
,通过返回的ProductName
与软件Config中包含的ProductName
进行比较
如果与Config中的ProductName
一致,则函数返回1否则返回0。
至此函数sub_1400162D0
流程分析完毕。下面来看Func_isSupportDevice
中的else
分支。
else
分支直接通过SmBiosHelper::GetSysManufactor
来获取主板制造商。并将字符串转换为大写后与HUAWEI
和XXXX
进行比较。
如果主板厂商是HUAWEI
则函数返回1,否则函数返回2。
至此MBAInstallPre.exe
中的Func_isSupportDevice
函数分析完毕。
通过上面的对其中的MBAInstallPre.exe
->isSupportDevice
流程的大概分析可以知道,模块HardwareHal.dll
中的类SmBiosHelper
会通过函数GetSystemFirmwareTable
或者WMI
来获取主板信息。
接下来则通过hook函数GetSystemFirmwareTable
处理其返回值。
通过MSDN GetSystemFirmwareTable知道正确的函数调用方式如下。
主要代码如下(修改自GitHub代码 DumpSMBIOS)。
更多BIOS结构信息在文章结尾提供相关链接。
以上内容如有侵权部分,敬请告知,将及时更改。
BIOS有关更多信息
GitHub DumpSMBIOS
MSDN GetSystemFirmwareTable
华为 matebook
BIOS Information (
Type
0
)
System Information (
Type
1
)
Baseboard (
or
Module) Information (
Type
2
)
System Enclosure (
Type
3
)
OEM Strings (
Type
11
)
BIOS Information (
Type
0
)
System Information (
Type
1
)
Baseboard (
or
Module) Information (
Type
2
)
System Enclosure (
Type
3
)
OEM Strings (
Type
11
)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)