Mã hóa đoạn script JavaScript kỹ thuật obfuscation

Để mã hóa đoạn script JavaScript của bạn và khiến nó khó đọc, có thể dùng kỹ thuật obfuscation bằng công cụ như JavaScript Obfuscator. Dưới đây là cách thực hiện theo từng bước:

  1. Sao chép đoạn mã cần mã hóa vào công cụ.
  2. Chọn các tùy chọn mã hóa nâng cao, như:
    • Compact Code: làm mã ngắn gọn hơn.
    • Control Flow Flattening: làm phức tạp logic mã.
    • String Array Encoding: mã hóa chuỗi.
    • Self-Defending: bảo vệ mã khỏi bị gỡ rối.
  3. Nhấn Obfuscate để nhận mã đã mã hóa.

Nếu bạn muốn làm điều này trong môi trường Node.js mà không phụ thuộc vào công cụ bên ngoài, bạn có thể dùng các thư viện như javascript-obfuscator:

Cài đặt thư viện:

bash
npm install javascript-obfuscator

Sau đó, cập nhật tệp routes/anti.js để mã hóa đoạn script:

javascript

  const JavaScriptObfuscator = require('javascript-obfuscator');

router.get(‘/javascript/anti-config’, (req, res) => {
const script = `
(function() {
const antiConfig = ${JSON.stringify(antiConfig)};

if (antiConfig.blockDevTools) {
document.addEventListener(‘keydown’, function(e) {
if ((e.ctrlKey && e.shiftKey && e.keyCode === 73) || e.keyCode === 123) {
window.location.href = ‘404.html;
e.preventDefault();
}
});

const element = new Image();
Object.defineProperty(element, ‘id’, {
get: function() {
window.location.href = ‘404.html;
throw new Error(‘Chặn Developer Tools’);
}
});
console.log(element);
}

if (antiConfig.blockViewSource) {
document.addEventListener(‘keydown’, function(e) {
if ((e.ctrlKey && e.keyCode === 85) || (e.ctrlKey && e.shiftKey && e.keyCode === 67)) {
window.location.href = ‘404.html’;
e.preventDefault();
}
});
}

if (antiConfig.blockRightClick) {
document.addEventListener(‘contextmenu’, function(e) {
window.location.href = ‘404.html’;
e.preventDefault();
});
}
})();
`;

const obfuscatedScript = JavaScriptObfuscator.obfuscate(script, {
compact: true,
controlFlowFlattening: true,
stringArray: true,
selfDefending: true,
});

res.setHeader(‘Content-Type’, ‘application/javascript’);
res.send(obfuscatedScript.getObfuscatedCode());
});

Lệnh trên sẽ gửi mã JavaScript đã mã hóa đến trình duyệt. Các tùy chọn obfuscation giúp mã hóa và bảo vệ đoạn mã của bạn khỏi bị đọc trực tiếp.

Cơ chế hoạt động của obfuscation:

Obfuscation làm cho mã nguồn trở nên khó hiểu, nhưng không thực hiện mã hóa hay bảo vệ bằng mật mã. Các thư viện này thực hiện điều này thông qua một số kỹ thuật chính:

  1. Đổi tên biến và hàm: Các biến, hàm sẽ bị đổi tên thành chuỗi không rõ ràng (ví dụ var1, func1), làm giảm khả năng hiểu của mã nguồn.
  2. Loại bỏ khoảng trắng và chú thích: Tất cả các khoảng trắng, xuống dòng, và chú thích sẽ bị xóa bỏ, làm cho mã trở nên khó đọc hơn.
  3. Chèn mã vô nghĩa (dead code): Các đoạn mã không thực hiện gì, nhưng vẫn hợp lệ, được chèn vào để làm nhiễu.
  4. Mã hóa chuỗi và giá trị literal: Các chuỗi trong mã sẽ bị mã hóa để không đọc trực tiếp được, và chỉ có thể được giải mã khi mã chạy.
  5. Control flow flattening: Sắp xếp lại cấu trúc điều khiển (if-else, switch-case) để phức tạp hóa logic chương trình, khiến người khác khó theo dõi luồng chương trình.

Phân tích chi tiết khi obfuscation:

  • Ưu điểm:
    • Bảo mật tạm thời: Làm cho mã nguồn trở nên khó đọc và phức tạp, giúp chống lại việc sao chép hoặc phân tích mã của các đối thủ.
    • Tăng thời gian giải mã: Người dùng không có quyền sẽ phải tốn nhiều thời gian nếu muốn giải mã.
  • Nhược điểm:
    • Không phải là mã hóa thật sự: Obfuscation chỉ làm cho mã khó hiểu chứ không mã hóa dữ liệu. Người có kỹ thuật vẫn có thể tìm cách phân tích và đảo ngược mã.
    • Hiệu suất: Một số kỹ thuật obfuscation làm tăng kích thước và làm chậm mã nguồn.
    • Giải mã tiềm ẩn: Các công cụ và kỹ thuật “de-obfuscation” có thể làm cho mã obfuscate dễ dàng hơn để phân tích ngược lại.

Khả năng giải mã khi obfuscation

Mã obfuscate không có cách giải mã trực tiếp, bởi vì nó không dùng mã hóa mà chỉ dùng các kỹ thuật rối mã. Tuy nhiên, vẫn có thể giải mã thủ công thông qua:

  • Công cụ de-obfuscation: Các công cụ như js-beautify hoặc các deobfuscator khác có thể giúp định dạng lại mã.
  • Kỹ thuật phân tích ngược (reverse engineering): Các kỹ sư có kỹ thuật cao vẫn có thể dò tìm các mẫu để hiểu cấu trúc mã.