[XiaoMi Phone] Unlock Bootloader without any permission
Hi all,
Long time no see!
Tự dưng nay có máu viết lách + muốn chấm dứt cái project sâu ko thấy đáy ở đây, đành lôi cái blog mốc meo này ra vậy!
Thì vừa ngày hôm qua (07/05/2018), chiếc điện thoại Redmi Note 5 Ai được ra mắt chính thức ở VN, ko biết nó có trở thành hiện tượng và xuất hiện nhiều thánh cuồng như con Redmi Note 4x năm ngoái ko nữa?!
Mình thì đã có cơ hội trải nghiệm con này trước đó tầm 1 tháng, do đúng lúc đó đang có nhu cầu đổi máy + con này lại vừa ra, thế là quyết định mua luôn 1 ẻm xách tay bản 64GB ROM và 6GB RAM về để dùng! (Mức giá của nó khá là hợp lý, mình suggest ae đang tìm kiếm máy thì nên mua con này).
Về chức năng, camera, chip các thứ … thì ko bàn ở đây vì với mình thì mọi thứ đều perfect cả.
Chỉ có điều, xiaomi mới áp luật mới đối với các sản phẩm của mình, đó là các model sản xuất sau này đều phải chờ 15 ngày kể từ khi đăng nhập tài khoản Mi vào máy.
Đây là 1 hành động thắt chặt của xiaomi đối với các sản phẩm của mình, hạn chế các trường hợp bán xách tay và bảo vệ quyền lợi cho bên cung cấp chính thức!
Vậy là máy mình phải chờ 15 ngày mới được unlock bootloader và root máy!!
Với người khác thì được, chứ với mình thì chờ đợi luôn luôn là việc khó để thực hiện.
Chân tay cứ ngứa ngáy, rất muốn unlock bootloader con máy để root nó. Về Xiaomi thì họ làm rất mạnh, nếu ko có sự cho phép unlock bootloader thì mọi cố gắng để root máy của họ đều là vô ích (trust me, i have tried).
Trong quá trình tìm cách bypass unlock bootloader kia thì mình đã tiện thể ngâm cứu ra luôn cách mã hóa mà xiaomi họ sử dụng trong các thiết bị của mình trong quá trình trao đổi thông tin qua lại với server. (Việc ngâm cứu này rất là mất thời gian cho nên mình ko muốn đề cập ở đây, chỉ muốn nói qua để các bạn ko thắc mắc ở dưới là tại sao gói tin này nó encrypt ròi mà mình vẫn đọc đc v.v… )
Mình có đọc qua giả code của mi unlock tool (tool để unlock máy xiaomi) (btw: người phát minh ra chức năng F5 của IDA rất đáng được thưởng huân chương =))) ).
Ở đây thì mi unlock tool có 2 version, version 1.x là bản cũ, bản này sử dụng api cũ cho nên hiện tại ko thể sử dụng được, ver 2 là ver hiện tại vẫn đang dùng.
Khó khăn 1 chút trong quá trình đọc code của tool đó là bản ver 2 bị họ sử dụng kỹ thuật gì đó (nghe nói là VMProtected) cho nên mình ko bấm “F5” được
, còn ver 1 thì vẫn “F5” bình thường.
Sau khi vòng vòng 1 thời gian, mình phát hiện ra bản ver 2 kia chưa bị obfuscate hết, có 1 số phần vẫn có thể “F5”.
Lòng vòng 1 chút thì thấy mình vẫn may mắn chán, vì cấu trúc chương trình của ver 1 và ver 2 này hao hao giống nhau, và quan trọng nhất đó là 1 số phần quan trọng của cái API nó vẫn có thể find xref từ Strings ra được
Đó là vài info cho ai có ý định ngâm cứu cái tool này nhé!
Và sau khi đã explore được cái phần mềm kia có gì, thì mình đã có thể giả lập lại được các request mà từ client khởi tạo đến server, và giải mã dữ liệu trả về! (it took 3 day + night + too much coffee
)
Tổng quát về quá trình unlock 1 chiếc điện thoại như sau:
- PC sẽ request token từ Phone trong chế độ fastboot bằng lệnh: fastboot getvar token
- Phone sẽ generate token dạng “giống như random”, nhưng thực chất token có cấu tạo (mỗi dòng máy sẽ có padding khác nhau): 12 or 16 bit padding + serial number
- PC gửi request đến Server cùng với token để yêu cầu 1 signature cho việc unlock
- Server generate signature và return cho PC (do trình độ về mật mã học của 1 thanh niên học mật mã quá kém cho nên bước này mình chỉ có thể phỏng đoán!)
- PC nhận được signature, sau đó decode hex đoạn đó (dài đúng 256 char, các nhà mật mã học cho mình xin ý kiến đoạn này với!!!), và lưu vào 1 file sig.data
- PC send lệnh qua fastboot: fastboot oem unlock sig.data
- Phone nhận được lệnh và dữ liệu của file sig.data, nó sẽ sử dụng kỹ thuật gì đó để giải mã (cần hỗ trợ thêm về khoản này), và sau đó sẽ check token và quyết định là signature match or not?! để unlock máy!
Như vậy có thể thấy, nếu ko có được cái đoạn mã hóa của server kia thì việc tạo ra signature để unlock máy là ko thể (mình đã thử với 1 file junk và fail!)
Thực tế thì ngay sau khi gửi lệnh yêu cầu unlock máy tới Phone thì ngay lập tức tool sẽ xóa file sig.data (để đảm bảo tính an toàn cho file signature, ko bị tình trạng reuse cho những lần sau!!).
Nhưng ko sao, mình đã hiểu rõ cái API của nó hoạt động ntn ròi cơ mà!
Mình có thử gửi request unlock với id là con máy mới của mình (Redmi Note 5 như đã nhắc ở đầu bài), thì server vẫn báo phải chờ trong 360h nữa :(.
Thay vào đó, lần sau mình thay cái id đó thành id con máy cũ của mình (đã được unlock từ trước), thì ngay lập tức server trả về 1 đoạn encrypted Data, chính là đoạn signature sử dụng để unlock máy mà mình nói, demo:
Mình thử các kiểu để decrypt nó, mà đều thất bại cả
.
Rồi vô tình trong đầu nghĩ ra ý kiến, tại sao ko sử dụng đoạn signature này để unlock con máy mới của mình???
Đầu chưa kịp nghĩ xong thì tay đã gõ xong, và bùm… trên màn hình điện thoại báo verify success và bắt đầu decrypt data rồi unlock bootloader máy
Demo thêm:
.
.
.
Vậy điều gì đã xảy ra ở đây??
?
?
?
Thực ra thì đến bây giờ, lúc viết bài này, mình cũng chả biết điều gì đã xảy ra ở đây cả, mình có thử trick này lên các dòng máy khác và đều fail!
Và sau đây là giả thuyết của mình về vấn đề này!
Ở đây chỉ là giả thuyết thôi nhé, vì mình đã thử vài cách để làm bằng chứng nhưng ko có đủ thời gian + kiến thức + nguồn lực cho việc nghiên cứu này!
.
Xem lại các bước của 1 quá trình unlock, nếu để ý kỹ sẽ có 1 chỗ hơi sai sai, đó chính là cái token!
Mình có thử gather vài mẫu token của 3–4 con máy xiaomi khác nhau (cả nhà mình đều dùng máy xiaomi =))) ),
Nói qua chút về đoạn generate token!
Cứ sau mỗi lần reload, fastboot lại generate cho chúng ta 1 cái token mới, điều này nhằm mục đích cho cái signature luôn thay đổi, ko bao giờ trùng nhau!
Nếu để ý token sau mỗi lần generate thì chúng ta có thể thấy, chỉ có riêng 12 hoặc 16 byte đầu là thay đổi, còn các byte cuối thì ko đổi.
Và các byte cuối đó chính là serial number của máy, có thể lấy ra bằng cách “cat /proc/serial_num”.
Các dòng máy trước thì token dài 18 byte, riêng từ Redmi Note 5 trở đi thì token dài 20 byte!
Dưới đây là mẫu token mình đã lấy:
Ở bên trái là token đã được decode base64 và encode ra hex cho dễ nhìn, bên phải là phần còn lại sau khi đã bỏ padding đoạn đầu!
Như bạn có thể thấy, khi bỏ padding đi, thì đó chính là cái serial number mà mình đã nhắc bên trên.
Đoạn padding byte null ở phía cuối ko phải là mình thêm vào, mà là decode nguyên từ token ra đó nhé!
Vấn đề mấu chốt là ở đây!!
Khi thử unlock con Redmi Note 5, mình đã sử dụng token số 2 ở trong hình, nghĩa là token này:
a5a83bc0a61eae74e29bc0911d539d000000
(Token này có chiều dài là 18)
Còn con Redmi Note 5 của mình token là như thế này:
71dd8aee7825b65a3f4c0f3576f63a69b6e874c4
(Chiều dài token này là 20)
Theo giả thuyết của mình:
- PC gửi signature data cho Phone
- trên Phone đã tiến hành giải mã data đó ra và lấy token trong đó
- lấy token đã giải mã, xóa bỏ đoạn padding đầu (12 or 16 byte first đó) => khi đó chỉ còn có serial_number thôi phải ko?
- rồi tiếp theo đem compare với serial number get từ máy ra
- => nếu đúng thì sẽ unlock, ko thì sẽ trả về fail
Trong đó, theo mình đoạn compare kia đã xảy ra lỗi!
Vì thế này:
Token 18 byte của mình: a5a83bc0a61eae74e29bc0911d539d000000
Nếu nó được sử dụng cho máy cũ (ko phải Redmi Note 5) thì nó sẽ được cắt bỏ padding là 12 byte, để lấy được serial number là 1d539d000000
Nhưng khi được sử dụng cho máy Redmi Note 5: đối với con máy này, thay vì cắt bỏ padding 12 byte, nó sẽ bỏ padding là 16 byte, cho nên, lúc này serial number sẽ là: 0000 <= Đây là null byte
=> Có lỗi ở đoạn compare, 1 số compare function khi gặp null byte sẽ kết thúc việc so sánh tại đó, và trả về kết quả luôn!
Điều này có thể giải thích được việc tại sao khi sử dụng signature data kia lại không thể unlock được các máy cũ hơn (vì các máy đó đều bỏ đi 12 byte padding chứ ko phải là 16 byte padding của Redmi Note 5)
Trường hợp xấu nhất có thể xảy ra:
Đó là khi ta có thể tìm được ở đâu đó 1 máy có số serial đặc biệt, thay vì 1d539d00 sẽ là 00539d00
Khi đó, sau khi bỏ padding 12 byte đầu, chúng ta sẽ có chuỗi chứa \x00 ở đầu
Và việc unlock bootloader tất cả các máy xiaomi trở thành hiện thực.
Khi đó không ai còn phải chờ đợi, tất cả các máy mất trộm, bị chủ nhân lock đều có thể được “giải cứu” bằng master key này
Chỉ có điều, tất cả đều là giả thuyết!!!
Tại sao lại fail:
- Do mình rất rất thiếu kiến thức về assembly của arm
- Kiến thức về cryptoo như sh*t nên ko thể đoán được các đoạn mã kia là gì :sadpepe:
- Thời gian + vài thứ lộn xộn bên lề đời thường
- Không thể fake được serial number khi request tới server
- Ko còn có lý tưởng #vicongdong nữa
Bữa tiệc vui nào đều cũng có lúc phải tàn, …
Mình đã chạm đến các TZ, các thứ của chip qualcom rồi mà vẫn không thể giải quyết được vấn đề…
Để tránh cho việc loạn đầu óc và vướng vào các job thì mình quyết định dừng ở đây: ở 1 chỗ mà chả có kết quả gì cả?!
Định report cho nhà sản xuất nhưng thôi, nghĩ lại thì họ sẽ cười cho, mình đem cả đống giả thuyết ném vào mặt họ rồi ko có lấy 1 cái bằng chứng cụ thể!
Ài, kết thúc ở đây để còn khởi đầu cho những cái khác.
Níu kéo lâu quá sẽ không tốt cho ai cả …
Bớt đi 1 phần sầu não, …
Tạm gác vụ này ở đây, ai có hứng nghiên cứu thì có thể liên hệ trực tiếp với mình qua fb để trao đổi thêm nhé, mình thực sự rất muốn nó hoàn thiện!
.
.
“Lòng ta xin nguyện khắc ghi trong tim tình nồng men say
Mặc cho tóc mây vương lên đôi môi cay
Bâng khuâng mình ta lạc trôi giữa đời … “