讓友商電腦兼容了一下華爲系專屬的多屏協同功能
筆者注:文中出現的大寫C
,請輕聲念出北京大爺的口頭禪。
華爲剛發佈多屏協同功能的時候,我就被種草了。
後來一天在微博看到@Navis-MDT發佈的一個體驗視頻,果然碉堡了。
瞬間有點想從“米boy”轉爲“花粉”用戶,這…當然是不可能的了。
翻看微博回覆,看到華爲手機副總裁@李小龍Bruce_Lee也轉發了該視頻,並回復網友“爲啥不面向非華爲電腦”說:“不是故意不做其他品牌的電腦,是電腦上WIFI/藍牙硬件和驅動太亂了,我們沒精力搞定兼容性問題。大神們想破解我們也不會攔着。”
對啊,怎麼忘了自己也是“大神”啊(羞澀~~)。
既然主人家都不反對,那我幫他們兼容一下,腦子開始發熱,迅速準備搞一搞。
是的,腦子非常熱,導致前期資訊準備不足,後面踩了很多坑。
下面且聽我一一道來。
1
視頻中提到華爲電腦中需要使用“電腦管家”(視頻中沒看清界面),然後手機掃描連接即可。
聽到“電腦管家”第一反應就是華爲多屏協同怎麼還跟騰訊合作?懵逼,騰訊NB。
後來一想不對,應該是華爲自己的軟件“電腦管家”,類似於小米筆記本上的“小米遊戲盒子”之類的軟件。
沒有華爲電腦,先去搜搜看是否能下載到軟件。
果然有,華爲官網很友好的給出了操作提示,果然是爲客戶着想的好公司。
版本挺多,下一個最新的。然後我選擇了9.1.6.33
,因爲我看到日期是2019-11-01
。(請仔細看圖,並記住這裏)
2
OK,軟件下回來了,接着就開始幹正事了。
習慣性地把軟件拉入了虛擬機運行,結果雙擊後沒反應,以爲是鼠標出問題或者虛擬機太卡,連續試了好幾次依然沒反應。
一瞬間,腦子裏翻江倒海,難道華爲加了反虛擬機、反調試、反…C
直接上windbg吧,一運行,直接退出,才發現是烏龍。
因爲這兩天在測試DLL劫持,留了個DLL在桌面,華爲的“電腦管家”很不幸中槍了,被劫持,然後直接退出。(劃重點)
刪掉DLL,終於有了反應,但是…提示只支持64位系統,而我用的是Win7 x86…C
換唄,還能咋辦,切到Win7 x64虛擬機,問題又來了。
好吧,我錯了,我直接本機win10安裝吧,一分鐘不到,終於裝好了。
但是從下載到裝好時間已經過去了30分鐘,都是自己作的。
3
點擊立即體驗,看看界面長啥樣。
結果又退出了,退出了…出了…了
咋回事?難道是直接驗證到不是華爲電腦,直接退出?
繼續windbg啓動軟件,看到如下信息:
Util!HttpUtil::OnDebug+0x13f8:
00007fff`0aa7a2c8 cc int 3
0:000> kv
# Child-SP RetAddr : Args to Child : Call Site
00 00000042`558fed10 00007fff`0aa78d2f : 00000219`596f44a0 00000042`558ff339 00000042`558ff2f4 00000042`558ff2f4 : Util!HttpUtil::OnDebug+0x13f8
01 00000042`558fee30 00007fff`0ab05616 : 00000042`558fefe0 00000219`596f44a0 00007fff`0aa60000 00000219`59660000 : Util!mba::util::UrlsManager::ParseXml+0x63f
02 00000042`558fee70 00007fff`0ab04879 : 00000000`00000006 00000000`00000006 00000042`558ff2f4 00000042`558ff339 : Util!CWMI::GetOutPutUIntByString+0x3bb6
03 00000042`558ff1b0 00007fff`0ab04af2 : 00000000`00000000 00000000`00000000 00000042`558ff3c0 00000000`00000000 : Util!CWMI::GetOutPutUIntByString+0x2e19
04 00000042`558ff2d0 00007fff`0aaf53df : 00000000`00000000 7fffffff`ffffffff 00000000`00000000 00000000`00000000 : Util!CWMI::GetOutPutUIntByString+0x3092
05 00000042`558ff3a0 00007ff6`fa838ff3 : 7fffffff`ffffffff 00000000`00000000 7fffffff`ffffffff 00000000`00000000 : Util!SMBIOSHelper::IsSupportDevice+0x1f
06 00000042`558ff400 00007ff6`fa852223 : 00000000`00000000 00000000`0000000a 00000000`00000000 00000000`00000000 : PCManager!SMBIOSHelper::operator=+0xa93
07 00000042`558ffc20 00007fff`4f6f7bd4 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : PCManager!Compression::Compression+0x3b93
08 00000042`558ffc60 00007fff`5150ced1 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0x14
09 00000042`558ffc90 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x21
0:000> g
ntdll!NtTerminateProcess+0x14:
00007fff`5153c644 c3 ret
咋還出現int3了呢,難道這裏就是檢查是不是華爲電腦的位置。
使用IDA開始粗略分析,進入int3的位置。一處異常,看不出什麼東西。
往上回溯兩層,看到很重要的信息SystemEnvironment::GetSupportMachineList
,確實很像是檢查的地方。
對sub_180018D00
下斷,查看參數。發現第三個參數指向一個xml配置文件路徑,看名字很明顯是表示支持的機器類型列表。
0:000> db 000001f0`587329b0
000001f0`587329c0 5c bb aa ce aa 5c 50 43-4d 61 6e 61 67 65 72 5f \....\PCManager_
000001f0`587329d0 53 65 74 75 70 5f 39 2e-31 2e 36 2e 33 33 5c 48 Setup_9.1.6.33\H
000001f0`587329e0 75 61 77 65 69 5c 50 43-4d 61 6e 61 67 65 72 5c uawei\PCManager\
000001f0`587329f0 5c 63 6f 6e 66 69 67 5c-4d 61 63 68 69 6e 65 54 \config\MachineT
000001f0`58732a00 79 70 65 4c 69 73 74 2e-78 6d 6c 00 ee fe ee ab ypeList.xml.....
打開一看,加密了。
那看看附近代碼,應該是先解密,可以把數據dump出來。
通過IDA翻看了一下後面的函數,看到另一個特徵rapidxml::parse_error::
vftable`,這是用了rapidxml開源庫來解析xml文檔。
把rapidxml的源碼下回來,通過對比(一些log字符特徵)來確認函數的功能。
基本弄清楚xml解密到解析的過程,對sub_180014EA0
下斷,查看參數。果然拿到解密後的xml文件。
0:000> dq 000000315e6feb48
00000031`5e6feb48 000001ec`051970b0 00000000`00000000
0:000> db 000001ec`051970b0
000001ec`051970b0 3c 3f 78 6d 6c 20 76 65-72 73 69 6f 6e 3d 22 31 <?xml version="1
000001ec`051970c0 2e 30 22 20 65 6e 63 6f-64 69 6e 67 3d 22 55 54 .0" encoding="UT
000001ec`051970d0 46 2d 38 22 3f 3e 20 0d-0a 3c 6d 61 63 68 69 6e F-8"?> ..<machin
000001ec`051970e0 65 54 79 70 65 6c 69 73-74 3e 20 0d 0a 09 3c 6d eTypelist> ...<m
xml數據長這樣。
看到這裏,其實已經有一個思路了,就是把自己電腦的品牌加入xml文件,重新加密回去,就能夠就能夠使用華爲電腦管家了。
不過分析解密、拿品牌信息、加密等挺麻煩的,再看看還有方法嗎?
比如直接patch比較品牌的函數,繞過檢查。
繼續分析,一堆xml的node的解析比較,因爲華爲在編譯rapidxml時基本都是內聯函數,導致跟源碼結構並不是很一致,增加了分析難度。
經過一段數據的比較,還沒有找到繞過的點。
我停了下來,看了看調用棧。
0:000> kv
# Child-SP RetAddr : Args to Child : Call Site
00 00000031`5e6fea20 00007fff`11184879 : 00000000`00000006 00000000`00000006 00000031`5e6feea4 00000031`5e6feee9 : Util!CWMI::GetOutPutUIntByString+0x4075
01 00000031`5e6fed60 00007fff`11184af2 : 00000000`00000000 00000000`00000000 00000031`5e6fef70 00000000`00000000 : Util!CWMI::GetOutPutUIntByString+0x2e19
02 00000031`5e6fee80 00007fff`111753df : 00000000`00000000 7fffffff`ffffffff 00000000`00000000 00000000`00000000 : Util!CWMI::GetOutPutUIntByString+0x3092
03 00000031`5e6fef50 00007ff7`70a18ff3 : 7fffffff`ffffffff 00000000`00000000 7fffffff`ffffffff 00000000`00000000 : Util!SMBIOSHelper::IsSupportDevice+0x1f
04 00000031`5e6fefb0 00007ff7`70a32223 : 00000000`00000000 00000000`0000000a 00000000`00000000 00000000`00000000 : PCManager!SMBIOSHelper::operator=+0xa93
05 00000031`5e6ff7d0 00007fff`4f6f7bd4 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : PCManager!Compression::Compression+0x3b93
06 00000031`5e6ff810 00007fff`5150ced1 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0x14
07 00000031`5e6ff840 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x21
纔看到被我忽略的一個很重要的信息Util!SMBIOSHelper::IsSupportDevice
,這個函數名太明顯了。
只需要修改這個返回值,基本應該就繞過檢查了。
BOOL8 __fastcall SMBIOSHelper::IsSupportDevice(SMBIOSHelper *this)
{
return 1; //patch
}
是的,我好像又掉坑裏,浪費了挺多時間。
4
但是前面爲什麼會出現異常呢,導致我掉進了一個確實是對的但又有點坑的位置呢。
想到xml的路徑,此時我終於反應過來哪個異常可能是什麼了。
因爲我把軟件放在了中文目錄中,而軟件對中文處理貌似有問題。(我沒有深究了)
D:\華爲\PCManager_Setup_9.1.6.33
果然,去掉中文目錄後,再沒有上面看到的int3。
所以,這又是個坑。C
本來正常的分析邏輯是這樣的。
0:000> g
ntdll!NtTerminateProcess+0x14:
00007fff`5153c644 c3 ret
0:000> kv
# Child-SP RetAddr : Args to Child : Call Site
00 00000042`558ffb38 00007fff`5150a9b8 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!NtTerminateProcess+0x14
01 00000042`558ffb40 00007fff`4f6fcd8a : 00000000`00000000 00000000`00000000 00007fff`4ecb9b68 00000000`00000000 : ntdll!RtlExitUserProcess+0xb8
02 00000042`558ffb70 00007fff`4ec1ae38 : 00000000`00000000 00000000`00000000 00000042`558ffbf8 00007fff`4ecebc20 : KERNEL32!ExitProcessImplementation+0xa
03 00000042`558ffba0 00007fff`4ec186ef : 00000000`00000000 00000000`00000000 00000000`00000000 00000042`558ffbf0 : ucrtbase!exit_or_terminate_process+0x44
04 00000042`558ffbd0 00007ff6`fa852235 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000001 : ucrtbase!common_exit+0x6f
05 00000042`558ffc20 00007fff`4f6f7bd4 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : PCManager!Compression::Compression+0x3ba5
06 00000042`558ffc60 00007fff`5150ced1 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : KERNEL32!BaseThreadInitThunk+0x14
07 00000042`558ffc90 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x21
看到exit進程,回溯到調用位置,看看做了什麼判斷。
.text:000000014003221E call WinMain
.text:0000000140032223 mov ebx, eax
.text:0000000140032225 call __scrt_is_managed_app
.text:000000014003222A test al, al
.text:000000014003222C jnz short loc_140032235
.text:000000014003222E mov ecx, ebx ; Code
.text:0000000140032230 call exit
.text:0000000140032235 ; ---------------------------------------------------------------------------
.text:0000000140032235
.text:0000000140032235 loc_140032235: ; CODE XREF: __scrt_common_main_seh(void)+120↑j
.text:0000000140032235 test dil, dil
是在WinMain中正常退出的,所以判斷就是在WinMain中。在IDA翻看一下,很容就找到了重要提示。
在往上看,正主來了。
這樣簡單太多了,已經不記得是第幾次被中文路徑坑了,又想用英文系統了。
5
把Util!SMBIOSHelper::IsSupportDevice
修正一番,替換原始的utlil.dll,直接運行軟件,在華爲的友商電腦中成功啓動。
開始嘗試連接手機。
點擊我的手機->掃碼連接,提示需使用華爲瀏覽器掃描。
因爲我不是華爲手機,所以是不是下載一個華爲瀏覽器就OK了呢。
一番搜索,在華爲市場找到了華爲瀏覽器的app。
興致勃勃地裝到了我的小米手機上,嗯,友商之間很友好,並沒有出現什麼異常情況。
打開瀏覽器,點開二維碼掃描,掃描軟件管家二維碼,提示需要安裝華爲移動服務,ok,安裝。
安裝完成之後,啥也沒提示,就光禿禿一個網頁頁面,電腦助手。
懵逼中,再次掃描,同樣地情況。
腦筋一轉,把鏈接複製發到了電腦,瀏覽器打開,看到了下載按鈕。
第三個app了,繼續把華爲電腦助手安卓版裝入了小米,瞬間感覺MIUI好像被華爲全家桶強X了一下ε(┬┬﹏┬┬)3。
重新掃描,這次果然不一樣了,瀏覽器跳轉到了助手頁面,提示配對。
這中間又出現了n多問題
(懷疑藍牙服務不正常、二維碼生成不正常、電腦管家是否對手機校驗、分析是否還有check…)
不想細說了,反正經過一番折騰,終於手機和電腦連上了。
但是這也沒有多屏協同啊,就一個手機助手啊。
難道我哪裏又弄錯了?
去搜了搜多屏協同的帖子,算是找到了問題。
TMD,原來下載的軟件版本低了,而我還眼瞎地沒看到上面的下載列表的10.0.2.59版本。
真是被自己蠢哭了。
下載最新版,重新修正了util.dll,這次連上果然不一樣了。
但是,最終還是沒能用上多屏協同,儘管我已經安裝了3個華爲的app,但就是手機不支持(EMUI系統功能)。
看到這些條件,我真是感到心累,“這是對衝動最好的懲罰”。
6
是的,雖然折騰了這麼久,最後也沒用上這個牛逼的功能,但是我很充實(哭)。
因爲我爲其他擁有華爲手機但沒有華爲電腦然後想體驗華爲多屏協同功能的大夥做出了我的貢獻。
我滿足了。
哎,卑微的我去鹹魚看看二手的華爲手機,或者去問問華爲EMUI適配不適配友商的手機了。
或者哪位大佬有換代的華爲手機郵我一個,地址是:XXXX。
哎,曾經的我沒錢買華爲,現在的我依然沒錢買華爲。
申明:雖然華爲手機副總裁已經說過不反對破解,但這裏還是鄭重申明,文章僅僅是做技術研究,如侵刪,謝謝。
最後,小聲地說,如果想體驗的朋友,請到https://github.com/anhkgg/Huawei_PCManager_NB下載試用,務必閱後即焚。
文件較大,也可以公衆號後臺回覆:HuaweiNB
獲取網盤鏈接。
如果覺得內容還不錯,歡迎關注公衆號:漢客兒。
交流羣:753894145