03 April, 2019
#22: Tản mạn về điểm danh FacePlus
Trong những năm trở lại đây, xu hướng về trí tuệ nhân tạo và big data đã trở thành 1 trend mới trong ngành CNTT. Mình cũng ko ngoại lệ, bị lôi cuốn bởi ước muốn làm chủ công nghệ. Vậy nên, khi thấy ý tưởng về việc điểm danh online của trường ĐHCN, mình khá nóng lòng đc trực tiếp thử nghiệm và khám phá công nghệ bên trong mà họ sử dụng.
Sau khi “nghịch ngợm” ứng dụng (may quá MSSV cũ của mình vẫn còn dùng đc), mình phát hiện ra 1 vài thứ khá hay ho. Bài viết này mình muốn nói về procedure mà mình đã làm để “khám phá” cách hoạt động của ứng dụng.
Luyên thuyên vậy đủ rồi, giờ là bước chuẩn bị đồ. Target mình nhắm tới là bản trên android. Nếu bạn đã từng mod ROM trên android thì có lẽ bạn sẽ ko xa lạ với:
- dex2jar
- jd-gui
- APKTool
Ngoài ra mình còn setup 1 server proxy trên nodejs nữa, công cụ cũng ko quá cồng kềnh nhỉ 😉
Bước đầu tiên mình luôn làm đó là decompile file dex để xem các library / services mà app sử dụng. Sau 1 lúc mò mẫu mình đã tìm ra đc 2 điểm mấu chốt:
- Server cũng như các endpoint
- Hàm build các thông tin điểm danh để gửi về cho server
Lúc này mình mới mở thử ứng dụng ra, và không quá bất ngờ khi mình nhận đc thông báo Không xác định được vị trí điểm danh. Vui lòng thử lại
Nhìn vào đoạn code trên, các bạn thấy có 2 string nổi bật đó là BLE devices (bluetooth low energy) và Wifi SSID. Nhìn kỹ chút nữa thì paramArrayOfByte lưu uidStatus.uidValue của cái Beacon gì đó, vốn là 1 thư viện liên quan đến BLE trong android. App sẽ check if (paramArrayOfByte.length() > 0) thì mới cho điểm danh.
Như vậy, mình chỉ cần sửa điều kiện này thành true để chạy đoạn code điểm danh thực sự. Để sửa thì sẽ hơi phức tạp, bạn ko thể chỉ sửa code java trên là nó chạy luôn, phải biết về smali code. Ví dụ như ở dưới đây mình comment dòng 1999 và 2001 (là code cũ), và sửa thành const v0, 1. đoạn này tương đương với if (1 > 0) trong java
Ngoài ra mình cũng đổi URL tới server thành URL PC của mình, và setup 1 proxy đơn giản trên PC
Sau khi compile lại và sign apk, mình mở app và thử với tính năng đăng ký. Rất nhanh chóng, mình bắt đc request gửi từ ứng dụng. Request này chỉ gồm có MSSV và ảnh jpg encode dưới dạng base64. Mình đã chỉnh sửa request này để gửi lên 1 lời chào tới anh An ở phòng CTSV 😀
Tiếp theo đến phần quan trọng nhứt là điểm danh. Truy vấn lên endpoint điểm danh gồm các thông tin như ảnh chụp mặt, locationCode (???), app và OS info
Phần locationCode bị trống do mình đã sửa code để bypass phần check BLE devices. Vậy nên server chỉ trả lại lỗi face_img_src or locationCode is null . Tuy nhiên, sau khi tham khảo lại code lúc đầu thì mình có thể đoán đc locationCode sẽ chứa thông tin về BLE devices và Wifi SSID
Từ những thông tin trên, mình đoán rằng khi điểm danh, giảng viên sẽ mang 1 thiết bị có thể phát bluetooth (hỗ trợ Eddystone Protocol). Sinh viên sẽ bật đt và scan thấy thiết bị này (mình cũng ko rõ là có phải kết nối với thiết bị đó ko), sau đó lấy uid của thiết bị, kèm với ảnh chụp khuôn mặt lúc đó để gửi lên server.
Vậy liệu chăng có cách “qua mặt” hệ thống điểm danh này? Giả thiết của mình như sau:
- Bạn A và B học cùng lớp, một hôm B nhờ A điểm danh hộ
- A vào lớp, điểm danh như bình thường kèm theo việc capture lại request lên server (như mình đã làm)
- A lấy locationCode từ capture này, kèm theo ảnh của B (chụp ở phòng học đó nhưng là trước đây B chụp và để dành để điểm danh sau)
- Thậm chí nếu tinh vi hơn, A có thể đổi MAC (dẫn đến đổi IP local) trước khi điểm danh hộ B
Như vậy sẽ rất khó cho server để kiểm tra thực sự B có trong lớp hay ko, truy vấn lên server ko có các thông tin “tĩnh” của B như địa chỉ MAC, IMEI, mà có khi những thông tin này lại có thể thay đổi đc, vả lại nếu B hết pin, hỏng đt hay thậm chí có đt mới, thì việc cập nhật thông tin sẽ khá phức tạp.
Tuy nhiên đó chỉ là giả thiết của mình. Hiện rất tiếc mình ko còn ở UET nữa để “cùng cam cộng khổ” cùng anh em. Có thể thực tế nhà trường đã có solution tinh vi hơn thì sao ? Các bạn hãy cùng nghĩ và comment xuống dưới nhé !
Nui – Marseille, 2019