Các vấn đề của làm rối mã
Làm rối mã là giải pháp sớm nhất được áp dụng để bảo vệ mã Java, và cũng là giải pháp trực tiếp nhất.
Làm rối mã thường bao gồm bốn phương pháp sau:
- Chuyển đổi tên gói, tên lớp, tên biến
- Thay đổi cấu trúc điều khiển, như làm phẳng luồng điều khiển, thêm các vị từ bất biến, v.v.
- Làm rối hoặc mã hóa chuỗi
- Thêm mã vô dụng
Làm rối mã có thể giảm đáng kể khả năng đọc của mã được dịch ngược và tăng độ khó của phân tích tĩnh, nhưng dù làm rối mã như thế nào, logic thực thi của chương trình sẽ không bị thay đổi.
Bytecode JVM là mã trung gian ngữ nghĩa rất rõ ràng và tường minh, có khả năng đọc cao. Đối với các tệp class đã được làm rối, ngay cả khi chúng không thể được khôi phục thành mã nguồn Java có thể đọc được, chúng vẫn có thể được phân tích ở cấp độ bytecode. Do tính ngữ nghĩa cao của bytecode Java, quá trình này thực tế khá dễ dàng.
Chúng tôi đã phát triển một công cụ thực thi bytecode JVM sử dụng ngôn ngữ Java và Kotlin. Người dùng có thể sử dụng dự án này để gỡ lỗi động các chương trình Java ở cấp độ bytecode trong IntelliJ IDEA. Để biết thêm thông tin, vui lòng tham khảo bài viết dưới đây.
https://protector4j.com/vi/articles/jvm-bytecode-engine-written-with-java-and-kotlin/
Và chúng tôi sử dụng công cụ này để cố gắng bẻ khóa một mã đã được làm rối nổi tiếng, quy trình cụ thể có thể tham khảo bài viết sau
http://protector4j.com/vi/articles/deobfuscate-with-vlx-vmengine/
Kết luận
Từ phân tích trên, có thể thấy rằng do tính ngữ nghĩa cao của bytecode JVM, nó rất dễ bị phân tích và đọc. Logic chạy có thể dễ dàng phân tích thông qua gỡ lỗi động. Viết công cụ gỡ lỗi động không phải là nhiệm vụ quá phức tạp, vì vậy làm rối mã không phải là giải pháp bảo vệ đáng tin cậy.