Các vấn đề của mã hóa tệp class Java
Ngoài làm rối mã, mã hóa tệp class là phương pháp bảo vệ mã dễ nghĩ đến. Nhiều giải pháp sử dụng agent để mã hóa tệp class và giải mã chúng trong quá trình tải class. Tuy nhiên, các giải pháp này bỏ qua một điểm quan trọng, đó là cơ chế gắn kết (attachment) tích hợp sẵn của JVM.
Cơ chế gắn kết của JVM
Để thuận tiện cho việc phân tích và giám sát hoạt động chương trình, các JVM thông thường đều đi kèm với cơ chế gắn kết. Người dùng có thể sử dụng các công cụ như jhsdb để gắn vào tiến trình JVM, xem và phân tích dữ liệu bộ nhớ. Hơn nữa, các dữ liệu bộ nhớ này được tổ chức hợp lý theo cấu trúc dữ liệu trong tệp nguồn, có thể hiểu đây cũng là cơ chế cửa hậu tích hợp sẵn của JVM.
Bài viết sau giới thiệu cách sử dụng cơ chế gắn kết JVM để đọc và lưu thông tin tệp class trong bộ nhớ.
https://protector4j.com/vi/articles/cracking-encrypted-java-applications-jhsdb/
Ngoài việc sử dụng công cụ jhsdb đi kèm JDK, bạn cũng có thể sử dụng Arthas của Alibaba để phân tích các tiến trình Java đang chạy.
HOOK các hàm liên quan để lấy thông tin class được tải động
Một số phương pháp bảo vệ tải động thông tin class thông qua reflection, và cách tiếp cận này cũng có thể được sử dụng để lấy thông tin class được tải theo thời gian thực thông qua DLL injection. Để biết thêm chi tiết, vui lòng tham khảo hai dự án sau.
https://github.com/ViRb3/jvm-dump-proxy
https://github.com/zorftw/JVM-Native-Classdumping
Kết luận
Do sự tồn tại của cơ chế gắn kết JVM hoặc cơ chế HOOK nhị phân, tất cả mã được gọi là đã mã hóa mà chưa được tách khỏi hoạt động JVM thông thường đều có thể dễ dàng đọc được bằng công cụ gắn kết hoặc hook thông qua DLL injection. Do đó, đây là giải pháp bảo vệ kém hiệu quả nhất.