3.png
OK,軟件下回來了,接着就開始幹正事了。
習慣性地把軟件拉入了虛拟機運行,結果雙擊後沒反應,以為是鼠标出問題或者虛拟機太卡,連續試了好幾次依然沒反應。
一瞬間,腦子裡翻江倒海,難道華為加了反虛拟機、反調試、反...C
直接上吧,一運行,直接退出,才發現是烏龍。
因為這兩天在測試DLL劫持,留了個DLL在桌面,華為的“電腦管家”很不幸中槍了,被劫持,然後直接退出。(劃重點)
删掉DLL,終于有了反應,但是...提示隻支持64位系統,而我用的是Win7 x86...C
4.png
換呗,還能咋辦,切到Win7 x64虛拟機,問題又來了。
5.png
好吧,我錯了,我直接本機win10安裝吧,一分鐘不到,終于裝好了。
6.png
但是從下載到裝好時間已經過去了30分鐘,都是自己作的。
點擊立即體驗,看看界面長啥樣。
結果又退出了,退出了...出了...了
咋回事?難道是直接驗證到不是華為電腦,直接退出?
繼續啟動軟件,看到如下信息:
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的位置。一處異常,看不出什麼東西。
7.png
往上回溯兩層,看到很重要的信息::t,确實很像是檢查的地方。
8.png
對下斷,查看參數。發現第三個參數指向一個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.....
打開一看,加密了。
9.png
那看看附近代碼,應該是先解密,可以把數據dump出來。
通過IDA翻看了一下後面的函數,看到另一個特征::::`,這是用了開源庫來解析xml文檔。
把的源碼下回來,通過對比(一些log字符特征)來确認函數的功能。
10.png
基本弄清楚xml解密到解析的過程,對下斷,查看參數。果然拿到解密後的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數據長這樣。
11.png
看到這裡,其實已經有一個思路了,就是把自己電腦的品牌加入xml文件,重新加密回去,就能夠就能夠使用華為電腦管家了。
不過分析解密、拿品牌信息、加密等挺麻煩的,再看看還有方法嗎?
比如直接patch比較品牌的函數,繞過檢查。
繼續分析,一堆xml的node的解析比較,因為華為在編譯時基本都是内聯函數,導緻跟源碼結構并不是很一緻,增加了分析難度。
經過一段數據的比較,還沒有找到繞過的點。
我停了下來,看了看調用棧。
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!::,這個函數名太明顯了。
隻需要修改這個返回值,基本應該就繞過檢查了。
BOOL8 __fastcall SMBIOSHelper::IsSupportDevice(SMBIOSHelper *this)
{
return 1; //patch
}
是的,我好像又掉坑裡,浪費了挺多時間。
但是前面為什麼會出現異常呢,導緻我掉進了一個确實是對的但又有點坑的位置呢。
想到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
是在中正常退出的,所以判斷就是在中。在IDA翻看一下,很容就找到了重要提示。
12.png
在往上看,正主來了。
13.png
這樣簡單太多了,已經不記得是第幾次被中文路徑坑了,又想用英文系統了。
把Util!::修正一番,替換原始的utlil.dll,直接運行軟件,在華為的友商電腦中成功啟動。
14.png
開始嘗試連接手機。
點擊我的手機->掃碼連接,提示需使用華為浏覽器掃描。
因為我不是華為手機,所以是不是下載一個華為浏覽器就OK了呢。
一番搜索,在華為市場找到了華為浏覽器的app。
15.png
興緻勃勃地裝到了我的小米手機上,嗯,友商之間很友好,并沒有出現什麼異常情況。
打開浏覽器,點開二維碼掃描,掃描軟件管家二維碼,提示需要安裝華為移動服務,ok,安裝。
16.jpg
安裝完成之後,啥也沒提示,就光秃秃一個網頁頁面,電腦助手。
懵逼中,再次掃描,同樣地情況。
腦筋一轉,把鍊接複制發到了電腦,浏覽器打開,看到了下載按鈕。
17.png
第三個app了,繼續把華為電腦助手安卓版裝入了小米,瞬間感覺MIUI好像被華為全家桶強X了一下ε(┬┬﹏┬┬)3。
重新掃描,這次果然不一樣了,浏覽器跳轉到了助手頁面,提示配對。
這中間又出現了n多問題
(懷疑藍牙服務不正常、二維碼生成不正常、電腦管家是否對手機校驗、分析是否還有check...)
不想細說了,反正經過一番折騰,終于手機和電腦連上了。
18.png
但是這也沒有多屏協同啊,就一個手機助手啊。
難道我哪裡又弄錯了?
去搜了搜多屏協同的帖子,算是找到了問題。
19.png
TMD,原來下載的軟件版本低了,而我還眼瞎地沒看到上面的下載列表的10.0.2.59版本。
真是被自己蠢哭了。
下載最新版,重新修正了util.dll,這次連上果然不一樣了。
20.png
但是,最終還是沒能用上多屏協同,盡管我已經安裝了3個華為的app,但就是手機不支持(EMUI系統功能)。
21.png
看到這些條件,我真是感到心累,“這是對沖動最好的懲罰”。
是的,雖然折騰了這麼久,最後也沒用上這個牛逼的功能,但是我很充實(哭)。
因為我為其他擁有華為手機但沒有華為電腦然後想體驗華為多屏協同功能的大夥做出了我的貢獻。
我滿足了。
哎,卑微的我去鹹魚看看二手的華為手機,或者去問問華為EMUI适配不适配友商的手機了。
或者哪位大佬有換代的華為手機郵我一個,地址是:XXXX。
哎,曾經的我沒錢買華為,現在的我依然沒錢買華為。
申明:雖然華為手機副總裁已經說過不反對破解,但這裡還是鄭重申明,文章僅僅是做技術研究,如侵删,謝謝。
最後,小聲地說,如果想體驗的朋友,請到下載試用,務必閱後即焚。
有話要說...