Trong bài viết này, mình sẽ chia sẻ 1 trig nhỏ để bảo mật chương trình cho esp8266, với phương pháp này, dù bạn có gửi thẳng file .bin của bạn cho người khác thì họ nạp vào chip của họ cũng không chạy được
Các bạn theo dõi đoạn code sau
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <ESP8266WiFi.h> String check_MAC = "XX:XX:XX:XX:XX:XX"; void setup() { Serial.begin(115200); Serial.println(); Serial.println("ESP8266 start !"); String mac = WiFi.macAddress(); //lấy địa chỉ mac của esp8266 mac.toLowerCase(); if(mac == check_MAC) { Serial.println("Khởi động thành công"); } else { Serial.println("Khởi động thất bại"); while(1); } } void loop() {} |
Trong chương trình trên, khi khởi động mình sẽ so sánh mac của thiết bị với biến check_MAC nếu giống nhau thì mới cho phép chạy
PHÉP THUẬT
Giờ hãy làm 1 chút ảo thuật nào
Khi bạn ấn nút nạp trên arduino, Arduino IDE sẽ sinh ra 1 file .bin, chính là file firmware của bạn đã được biên dịch thành mã máy. Bên trong file bin đó có chứa 1 đoạn dữ liệu chính là XX:XX:XX:XX:XX:XX
Sau khi file .bin được tạo thành công, arduino IDE sẽ nạp chương trình xuống cho esp8266 bằng 1 script
Cụ thể, arduino ide sử dụng 1 chương trình nạp được có tên là esptool.py. đây là 1 đoạn mã python, điều tuyệt vời là nó là mã nguồn mở, có nghĩa là ta có thể chèn thêm vào 1 vài dòng code để thêm chức năng cho nó.
Cụ thể, trong quá trình nạp, chúng ta sẽ đọc MAC của esp8266 lên và thay thế nó vào đoạn dữ liệu XX:XX:XX:XX:XX:XX trong file .bin kia. Nghe thì dòng dài nhưng chỉ cần thêm đúng 5 dòng code thôi 😀
Các bạn mở file esptool.py lên, có thể mở bằng nodepad hay bất kì phần mềm chỉnh sửa văn bản nào. Nếu không biết vị trí của file này ở đâu thì hãy ấn nút upload trên arduino IDE, trước khi nạp arduino IDE sẽ in ra 1 dòng lệnh, trong đó có chưa vị trí của file upload.py, file esptool.py nằm trong thư mục esptool cùng cấp với upload.py
Nếu arduino IDE của bạn không hiển thị, thì là do bạn chưa bật chức năng show log upload, hãy vào FILE -> Preferences và tích vào upload
Khi đã mở được file esptool.py các bạn dùng chức năng tìm kiếm ( Ctrl + F ) để tìm hàm read_mac sau đó chèn 2 dòng mã này vào cuối hàm
1 2 |
global user_mac_str user_mac_str = (':'.join(map(lambda x: '%02x' % x, mac))).lower() |
Tiếp tục tìm tới hàm write_flash và chèn thêm 3 dòng code này vào dưới dòng image = _update_image_flash_params(esp, address, args, image)
1 2 3 |
in_arduino_string= b'XX:XX:XX:XX:XX:XX' print("Thay doi %s thanh %s" % (in_arduino_string , user_mac_str) ) image = image.replace(in_arduino_string,bytes(user_mac_str, 'ascii')) |
Vậy là xong, lưu lại và nạp code thử , từ giờ khi upload trên arduino sẽ có in thêm dòng Thay doi XX:XX:XX:XX:XX:XX thành mac của chip là thành công
Nâng cao khả năng bảo mật
Việc lưu trực tiếp ID vào flash vẫn có thể bị hacker phát hiện ra khi dump code và phân tích, vì vậy hãy thêm 1 số thuật toán mã hóa để “che” đi MAC của bạn, thậm chí bạn có thể tạo thêm nhiều biến so sánh ở nhều nơi khác nhau trong chương trình để làm hacker “nản lòng”
Hạn chế
XX:XX:XX:XX:XX:XX là 1 value đặc biệt trong code của bạn. Do đó hãy đảm bảo trong chương trình của bạn không dữ liệu nào có thể chứa XX:XX:XX:XX:XX:XX hoặc bạn cũng có thể thay đổi khóa XX:XX:XX:XX:XX:XX thành 1 từ khóa đặc biệt khác khó bị trùng hơn
I found your article to be very well-researched and informative. Thank you for taking the time to provide such valuable information.
Thanks for sharing valuable ideas in this article.