1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BÁO CÁO TIỂU LUẬN CÔNG CỤ GIẢI MÃ JAVASCRIPT DE4JS

40 80 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 40
Dung lượng 1,33 MB

Nội dung

Do đó, để khắc phục và hạn chế các khuyết - nhược điểm này, ngưởi ta sử dụng một số phương pháp như: rút gọn code minify code, đóng gói code packer code hoặc mã hóa code obfuscated code

Trang 1

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG

Sinh viên thực hiện : Ma Công Thành

Giảng viên hướng dẫn : TS Đặng Minh Tuấn

Trang 2

MA CÔNG THÀNH – B18AT03 TRANG 2

NHẬN XÉT VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN:

Hà Nội, ngày… tháng 12 năm 2021

GIẢNG VIÊN GIẢNG DẠY

Trang 3

MA CÔNG THÀNH – B18AT03 TRANG 3

MỤC LỤC

NHẬN XÉT VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN: 2

DANH MỤC CÁC BẢNG 5

DANH MỤC CÁC HÌNH VẼ 5

DANH MỤC CÁC TỪ VÀ THUẬT NGỮ VIẾT TẮT 6

LỜI MỞ ĐẦU 7

I Giới thiệu, lịch sử hình thành 8

1 Javascript: 8

1.1 Javascript là gì? 8

1.2 Lịch sử hình thành JavaScript 8

1.3 Cách hoạt động của JavaScript 9

1.4 Điểm khác biệt giữa các ngôn ngữ lập trình khác và JavaScript là gì? 10

1.5 Khuyết điểm của JavaScript 10

1.6 Tại sao phải làm xáo trộn (Obfuscation) mã javascript: 11

2 Các phương pháp để mã hóa code javascript: 12

2.1 Rút gọn code (Minified Code) 13

2.2 Tối ưu hóa code (Optimized Code) 13

2.3 Nén code (Packing Code) 13

2.4 Obfuscated Code 14

3 Phương pháp giải mã code javascript bị mã hóa 19

3.1 Giải mã bị xáo trộn (Deobfuscation code) 20

3.2 Giải nén (Unpacking code) 20

3.3 Giải mã (Decoding code) 20

II Hướng dẫn cài đặt và sử dụng DE4JS 21

1 Công cụ De4js: 21

2 Cài đặt De4js: 22

2.1 Cài đặt trên Kali Linux 22

2.2 Cài đặt trên BlackArch 25

2.3 Cài đặt trên Debian, Linux Mint, Ubuntu 26

2.4 Sử dụng trên online website 26

3 Cách sử dụng De4js 27

3.1 Khởi tạo công cụ 27

3.2 Cách sử dụng: 28

Trang 4

MA CÔNG THÀNH – B18AT03 TRANG 4

III Bài lab 29

1 Demo lab 1: Giải mã đoạn mã bị làm rối bằng Javascript Obfuscator 29

2 Demo lab 2: Giải mã javascript để gỡ bỏ bản quyền chân trang trên một số nền tảng web template: 31

IV Kết luận: 39

V Tài liệu tham khảo 40

Trang 5

MA CÔNG THÀNH – B18AT03 TRANG 5

DANH MỤC CÁC BẢNG

Bảng 1 Bảng so sánh JS với một số ngôn ngữ lập trình phổ biến 10

DANH MỤC CÁC HÌNH VẼ Hình 1 Tỉ lệ sử dụng JavaScript 8

Hình 2 Cách JavaScript làm việc trên trang web 9

Hình 3 Ví dụ không dùng obfuscation 11

Hình 4 Obfuscation đoạn mã JavaScript 12

Hình 5 Đoạn mã rõ 15

Hình 6 Mã được minified 15

Hình 7 Mã được làm rối obfuscation bằng một phương pháp duy nhất 16

Hình 8 Mã được mã hóa cực độ 16

Hình 9 Luồng giải mã đoạn code bị làm rối 20

Hình 10 Cài đặt các gói bắt buộc 1 22

Hình 11 Cài đặt các gói bắt buộc 2 22

Hình 12 Lấy mã nguồn de4js và cài các thư viện phụ thuộc 23

Hình 13 Cài đặt workbox-cli 24

Hình 14 Chạy máy chủ web de4js 24

Hình 15 Website local của de4js 25

Hình 16 Trang web de4js online 27

Hình 17 Khởi tạo công cụ de4js 27

Hình 18 Nhập đoạn mã vào form 28

Hình 19 Nhập đoạn mã từ file 28

Hình 20 Nhập đoạn mã từ URL 28

Hình 21 Các lựa chọn để giải mã 28

Hình 22 Các tùy chọn bổ sung 29

Hình 23 Lab1 - Đoạn mã JS bình thường 30

Hình 24 Lab 1 - Đoạn mã đầu vào bị làm rối 30

Hình 25 Lab 1 - Giải mã bằng De4js 31

Hình 26 Lab 2 - Trang web với bản quyền chân trang 32

Hình 27 Lab 2 - Mã nguồn của trang web bị gắn bản quyền 33

Hình 28 Lab 2 - Nhập đoạn mã bị mã hóa vào de4js 34

Hình 29 Lab 2 - Kết quả giải mã của de4js 34

Hình 30 Lab 2 - Rút gọn lại đoạn mã vừa được giải mã 35

Hình 31 Lab 2 - Định dạng lại đoạn code 35

Hình 32 Lab 2 - Chỉnh sửa HTML của template theme 36

Hình 33 Lab 2 - Đoạn code mã hóa cần được thay thế 36

Hình 34 Lab 2 - Đoạn mã được giải mã thay thế đoạn mã bị mã hóa cũ 37

Hình 35 Lab 2 - Xóa đoạn mã JS chứa bản quyền chân trang 37

Hình 36 Lab 2 - Xóa thành công bản quyền chân trang 38

Trang 6

MA CÔNG THÀNH – B18AT03 TRANG 6

DANH MỤC CÁC TỪ VÀ THUẬT NGỮ VIẾT TẮT

Từ viết

tắt Thuật ngữ tiếng Anh/Giải thích

Thuật ngữ tiếng Việt/Giải thích

cho web

Trang 7

MA CÔNG THÀNH – B18AT03 TRANG 7

sử dụng thư viên của bên thứ ba nên có thể tăng thêm chức năng cho website mà không phải code từ đầu

Nhưng cũng chính vì thế mà Javascript là nơi ẩn chứa rất nhiều vấn đề bảo mật hay các nguy

cơ bị tấn công do với mức độ phổ biến của mình, nó cũng sẽ thu hút lượng lớn hacker, scammer,

và những người có ác tâm luôn tìm kiếm những lỗ hổng và các lỗi bảo mật để lợi dụng nó Ngoài

ra, Javascript code snippets lớn dẫn đến việc làm chậm hoặc lag trình duyệt khi thực thi quá mức các gói thư viện của Javascript

Do đó, để khắc phục và hạn chế các khuyết - nhược điểm này, ngưởi ta sử dụng một số phương pháp như: rút gọn code (minify code), đóng gói code (packer code) hoặc mã hóa code (obfuscated code) khiến cho việc đọc hiểu code javascript sẽ trở nên khó và phức tạp hơn Vì vậy, các công cụ dịch ngược các đoạn code javascript bị “rút gọn” và “mã hóa” ra đời phục vụ cho các nhà phân tích lỗ hổng an ninh mạng cũng như các hacker Đặc biệt trong số đó chính là công cụ De4js – công cụ dùng để giả mã (deobfuscator) và giải nén (unpacker) code javascript

Và đây chính là nội dung mà bài tiểu luận muốn đề cập tới: Công cụ giải mã và giải nén mã lệnh javascript – De4js

Rất mong nhận được sự góp ý của thầy để giúp em có thể hoàn thiện hơn bài tiểu luận này

Em xin chân thành cảm ơn!

Trang 8

MA CÔNG THÀNH – B18AT03 TRANG 8

I Giới thiệu, lịch sử hình thành

1 Javascript:

1.1 Javascript là gì?

- JavaScript, theo phiên bản hiện hành, là một ngôn ngữ lập trình thông dịch được

phát triển từ các ý niệm nguyên mẫu Ngôn ngữ này được dùng rộng rãi cho các trang web (phía người dùng) cũng như phía máy chủ (với Nodejs) Nó vốn được phát triển bởi Brendan Eich tại Hãng truyền thông Netscape với cái tên đầu

tiên Mocha, rồi sau đó đổi tên thành LiveScript, và cuối cùng thành JavaScript

Giống Java, JavaScript có cú pháp tương tự C, nhưng nó gần với Self hơn

Java .js là phần mở rộng thường được dùng cho tập tin mã nguồn JavaScript

- JavaScript đã nhanh chóng trở thành ngôn ngữ của web Nó cung cấp năng lượng cho gần như mọi trang web đang tồn tại và sự gia tăng của các khung JavaScript

đa nền tảng như React Native và Ionic cho phép các nhà phát triển tạo các ứng dụng dành cho thiết bị di động và máy tính để bàn bằng cách sử dụng cơ sở mã JS được chia sẻ

Hình 1 Tỉ lệ sử dụng JavaScript

- Với mọi công ty trong danh sách Fortune 500 đều sử dụng JavaScript để phát triển ứng dụng của họ, ngày nay chúng ta thấy JS cung cấp năng lượng cho các ứng dụng quan trọng trong các lĩnh vực khác nhau như ngân hàng di động, thương mại điện tử và dịch vụ phát trực tuyến

1.2 Lịch sử hình thành JavaScript

- JavaScript được bắt đầu vào năm 1995 tại Netscape Communications Vào thời gian này, các nhà sản xuất Netscape browser nhận ra rằng, việc thêm một "glue language" để nâng cao trải nghiệm người dùng sẽ làm tăng sự tiêu thụ nội dung của người dùng Vì vậy, họ đã đưa Brendan Eich nhúng vào Scheme Programming language Tuy nhiên, tại thời điểm đó, Java hiện là một ngôn ngữ mới, nóng hổi của website, nên họ đã quyết định làm cho ngôn ngữ này gần gũi với cú pháp của Java Kết quả đem lại chính là JavaScript, với các tính năng của Scheme, định hướng đối tượng của SmallTalk và cú pháp của Java Phiên bản đầu tiên của ngôn ngữ này được đặt tên là Mocha vào tháng 5 năm 1995, đổi tên thành LiveScript vào tháng 9 năm 1995, và được đổi tên thành JavaScript vào tháng 12 năm 1995

Trang 9

MA CÔNG THÀNH – B18AT03 TRANG 9

- Năm 1996, JavaScript đã được gửi đến ECMA International để hoàn thiện trở thành, một đặc tính kỹ thuật tiêu chuẩn Vào tháng 6 năm 1997, đặc tính kỹ thuật chính thức đầu tiên cho ngôn ngữ được phát hành là ECMA-262 Phiên bản mới nhất của ngôn ngữ là ECMAScript 2017 được phát hành vào tháng 6 năm 2017

1.3 Cách hoạt động của JavaScript

- Khi web browser tải một web page, HTML parser bắt đầu phân tích cú pháp HTML code và tạo DOM Bất cứ khi nào trình phân tích cú pháp gặp một chỉ thị CSS hoặc JavaScript (inline hoặc externally loaded), nó sẽ được chuyển giao cho CSS parser hoặc JavaScript engine theo yêu cầu JavaScript engine tải các tệp JavaScript bên ngoài và inline code, nhưng không chạy mã ngay lập tức, mà đợi HTML và CSS phân tích hoàn tất Khi điều này được thực hiện, JavaScript được thực thi theo thứ tự chúng được tìm thấy trên trang web: các biến và hàm được xác định, các lời gọi hàm được thực thi, trình xử lý sự kiện được kích hoạt, Các hoạt động này dẫn đến việc DOM được cập nhật bởi JavaScript và được hiển thị ngay lập tức bởi trình duyệt

Hình 2 Cách JavaScript làm việc trên trang web

Trang 10

MA CÔNG THÀNH – B18AT03 TRANG 10

1.4 Điểm khác biệt giữa các ngôn ngữ lập trình khác và JavaScript là gì?

- Lý do vì sao JavaScript là một trong các ngôn ngữ lập trình phổ biến nhất là

nó rất linh hoạt Trên thực tế, có nhiều lập trình viên chọn nó làm ngôn ngữ chính và chỉ sử dụng các ngôn ngữ khác trong danh sách bên dưới nếu nóhọ cần dùng điều gì đó đặc biệt

- Hãy xem qua các ngôn ngữ lập trình phổ biến nhất bên dưới:

mà không phải code từ đầu

HTML

Viết tắt của “Hypertext Markup Language”, HTML là một trong số các ngôn ngữ lập trình phổ biến nhất trên web và xây dựng nên các khối chính của một trang web Ví dụ về HTML tags là <p> cho đoạn văn và

<img> cho hình ảnh

PHP

PHP là ngôn ngữ phía server, khác với JavaScript chạy trên máy client

Nó thường được sử dụng trong các hệ quản trị nội dung nền PHP như WordPress, nhưng cũng thường được dùng với lập trình back-end và có thể tạo ra kênh truyền thông tin hiệu quả nhất tới và từ database

CSS

CSS viết tắt của “Cascading Style Sheets”, nó giúp webmaster xác định styles và định nghĩa nhiều loại nội dung Bạn có thể làm vậy thủ công với mọi yếu tố trong HTML, nhưng nếu vậy bạn sẽ cứ lặp đi lặp lại thành phần đó mà bạn dùng ở nhiều nơi khác nhau

Bảng 1 Bảng so sánh JS với một số ngôn ngữ lập trình phổ biến

- Nếu xem ngôn ngữ lập trình như là việc xây ngôi nhà, HTML sẽ định dạng kiến trúc của căn nhà, CSS sẽ là thảm và tường để trang trí ngôi nhà đẹp hơn JavaScript thêm yếu tố tương tác trong ngôi nhà, như là việc mở cánh cửa và làm đèn sáng Bạn vẫn có thể làm web mà không có JavaScript nhưng rủi ro

là website của bạn trông như là những web thời những năm 1995

1.5 Khuyết điểm của JavaScript:

- Mọi ngôn ngữ lập trình đều có các khuyết điểm Một phần là vì ngôn ngữ đó khi phát triển đến một mức độ như JavaScript, nó cũng sẽ thu hút lượng lớn hacker, scammer, và những người có ác tâm luôn tìm kiếm những lỗ hổng và các lỗi bảo mật để lợi dụng nó Một số khuyết điểm có thể kể đến là:

❖ Dễ bị khai thác;

❖ Có thể được dùng để thực thi mã độc trên máy tính của người dùng;

❖ Nhiều khi không được hỗ trợ trên mọi trình duyệt;

Trang 11

MA CÔNG THÀNH – B18AT03 TRANG 11

❖ JS code snippets lớn;

❖ Có thể bị triển khai khác nhau tùy từng thiết bị dẫn đến việc không đồng nhất

1.6 Tại sao phải làm xáo trộn (Obfuscation) mã javascript:

- JavaScript là một ngôn ngữ thông dịch — vì vậy, JavaScript phía máy khách yêu

cầu một trình thông dịch trong trình duyệt để đọc nó, diễn giải nó và chạy

nó Điều này cũng có nghĩa là bất kỳ ai cũng có thể sử dụng trình gỡ lỗi trình duyệt để dễ dàng xem qua mã JS và đọc hoặc sửa đổi nó theo ý muốn

- Trong ví dụ dưới đây, bạn có thể thấy ai đó dễ dàng truy cập vào logic mã đằng

sau bàn phím ảo nơi khách hàng của ngân hàng nhập mật khẩu của họ

Hình 3 Ví dụ không dùng obfuscation

- Với khả năng truy cập dễ dàng vào mã JavaScript phía máy khách như vậy, kẻ tấn

công gần như dễ dàng lợi dụng điểm yếu bảo mật này và nhắm mục tiêu vào bất

kỳ mã nào không được bảo vệ

- Nếu bạn hiểu kiến thức cơ bản về bảo mật ứng dụng, bạn biết rằng bí mật mã phải

luôn được giữ trên các môi trường thực thi đáng tin cậy như máy chủ phụ trợ Nhưng đây là một trong những trường hợp mà thực hành được ưu tiên hơn lý thuyết Khi các công ty lưu trữ logic quan trọng này ở phía máy khách, họ thường làm điều đó vì họ không thể giữ mã này ở phía máy chủ một cách khả thi

- Một lý do phổ biến cho điều này là khi không có phần phụ trợ ngay từ đầu, như

trong trường hợp của một số ứng dụng di động Một ví dụ khác là khi có một số

mã liên quan đến trải nghiệm người dùng (như thuật toán phân tích) phải chạy ở

Trang 12

MA CÔNG THÀNH – B18AT03 TRANG 12

phía máy khách Tuy nhiên, lý do phổ biến nhất là hiệu suất Việc gọi máy chủ

mất thời gian và khi bạn có một dịch vụ mà hiệu suất là rất quan trọng — như nền tảng phát trực tuyến hoặc trò chơi HTML5 — thì việc lưu trữ tất cả JavaScript trên máy chủ không phải là một tùy chọn

- Dù là gì đi nữa, các công ty thường không muốn tiết lộ logic độc quyền của

họ Và họ chắc chắn không bao giờ muốn tiết lộ bí mật mã Đặc biệt là khi các đối thủ của họ có thể thiết kế ngược mã và sao chép các thuật toán độc quyền

- Bên cạnh hành vi trộm cắp tài sản trí tuệ, JavaScript phía máy khách cũng có thể

bị nhắm mục tiêu trong các cuộc tấn công tinh vi hơn như lạm dụng tự động, vi phạm bản quyền, gian lận và xâm nhập dữ liệu

2 Các phương pháp để mã hóa code javascript:

- Khi download các bộ thư viện trên Internet (đặc biệt là thư viện Jquery,

Javascript), thỉnh thoảng ta sẽ nhận được những file rất nhỏ, nội dung bên trong thì

bị minify và không có 1 chút meaning nào Đó chính là các kỹ thuật Obfuscated code

- JavaScript obfuscation là một loạt các phép biến đổi mã biến mã JS đơn giản, dễ

đọc thành một phiên bản sửa đổi cực kỳ khó hiểu cho con người và với các công

cụ dịch ngược

Hình 4 Obfuscation đoạn mã JavaScript

- Môt số phương pháp phổ biến để mã hóa code javascript:

• Rút gọn code (Minified Code)

• Tối ưu hóa code (Optimized Code)

• Nén code (Packed Code)

• Xáo trộn nội dung code (Obfuscated Code)

Trang 13

MA CÔNG THÀNH – B18AT03 TRANG 13

2.1 Rút gọn code (Minified Code):

- Sau khi viết được những File Javascript khá lớn (khoảng vài KB trở lên) nếu để

như thế mà triển khai cho website chạy trực tiếp thì sẽ không hiệu quả về

mặt băng thông.

- Vì các bạn cũng biết là code Javascript của các bạn viết ra có rất nhiều ký tự không cần thiết như khoảng trống, ký tự xuống hàng, comment…những ký tự này chỉ làm nặng thêm cho file chứ không có tác dụng gì cho trình duyệt nên chúng ta cần có cách hạn chế vấn đề này

- Nhu cầu đó dẫn đến khái niệm Minify hay mình gọi là rút gọn code.

- Minify là quá trình xóa tự động các ký tự không cần thiết và “làm nhỏ” đi file bằng nhiều cách để khi triển khai thực tế, kích thước của file có thể nhỏ đi rất nhiều (giảm khoảng 50-60% so với ban đầu), nên nếu bạn nào đã từng tìm hiểu nhiều thì sẽ thấy 1 số thư viện javascript hay plugin người ta vừa cho Phiên bản đầy đủ chứa nguyên văn script của tác giả và phiên bản Min là phiên bản đã trải qua quá trình minify

- Và phiên bản Min thường chỉ có 1 line

- Dưới đây là 1 ví dụ cho thấy 1 đoạn code đã được minify

function doSomething(b,a){return b+a} alert(344,999)

- Có khá nhiều cách để minify code, ta có thể làm bằng tay hoặc tự động Để

minify tự động thì có nhiều bộ thư viện cũng như phần mềm cho phép minify Các thư viện nổi tiếng như Minify (PHP5), JSMIN (Có source ở các ngôn ngữ C# , Java, JavaScript, Perl, PHP, Python, OCAML, Ruby), YUI Compressor(Yahoo – Java), Dojo ShrinkSafe (Java), Packer – Dean Edwards(Javascript, NET, PHP, Perl)

2.2 Tối ưu hóa code (Optimized Code):

- Trình tối ưu hóa mã chủ yếu được sử dụng để cải thiện hiệu suất mã (tốc độ và sử dụng bộ nhớ của ứng dụng) Đôi khi chúng vô tình cũng có thể làm cho mã khó đọc hơn, nhưng điều này không cung cấp sự bảo vệ (như chúng ta sẽ thấy ở phần sau)

2.3 Nén code (Packing Code)

- Trình nén và đóng gói mã giảm kích thước mã bằng cách sử dụng kỹ thuật mã hóa

và đóng gói nhưng chúng cũng không bảo vệ mã nguồn

- Nói đến minify thì thường nhắc kèm tới kỹ thuật Javascript Packer Đây cũng là một kỹ thuật rút gọn Code nhưng theo trường phái khác, sử dụng cơ chế của hàm eval() để thực thi, và đoạn code sử dụng cơ chế này sẽ thay đổi phần nào thứ

tự và các ký tự, làm cho đoạn code khó đọc hơn

- Không khuyến khích sử dụng kỹ thuật packer để làm Minify code

Trang 14

MA CÔNG THÀNH – B18AT03 TRANG 14

2.4 Obfuscated Code

- Obfuscate là 1 kỹ thuật trong nhóm minify như cũng được tách riêng ra để nói bởi

mục đích và tính chất của nó

- Obfuscate nói một cách dễ hiểu là “mã hóa giả” nội dung code Kỹ thuật này áp

dụng cho nhiều ngôn ngữ chứ không phải chỉ riêng cho Javascript

- Trong những tình huống bạn triển khai source ra bên ngoài, thì việc người khác có source là điều tất yếu Sử dụng kỹ thuật Obfuscate sẽ làm thay đổi các tên hàm,

tên biến thành các ký tự đơn giản (ví dụ như a(), b(), var c…) Khiến cho người

khác dù có nắm Source của bạn cũng khó lòng mà nắm tường tận hoặc Reverse Engineering cái source của bạn Nên lưu ý là kỹ thuật này có thể sẽ làm thay đổi code chứ không chỉ làm rút gọn như Minify

- Quá trình này không làm thay đổi Flow của code, khiến cho việc nếu obfuscate không cẩn thận có thể khiến đoạn javascript sau khi obfuscate trở nên vô tác dụng Hãy cẩn thận với quá trình obfuscate, nếu bạn sợ có vấn đề thì cứ làm Minify là an tâm

- Hiện tại cũng có nhiều phần mềm cho phép obfuscate javascript nhưng tốt nhất

là Jasob :: JavaScript Obfuscator Sử dụng phần mềm dạng này phức tạp hơn so với cách Minify

- JavaScript (JS) obfuscation là một sự chuyển đổi nhằm mục đích tạo ra một mã JS

bị che khuất với mắt người và không thể phát hiện được đối với máy quét Sự xáo trộn cản trở việc hiểu và phân tích nội dung mã JS Phương pháp chuyển đổi mã này tràn lan ở cả mã JS lành tính và độc hại Do đó, sẽ là sai lầm nếu hiển thị một cách ngây thơ mã JS là mã độc nếu nó chứa một số dạng gây nhiễu Obfuscation trong phần mềm và chương trình, chẳng hạn như mã JS và Ngôn ngữ đánh dấu siêu văn bản (HTML), trong số những lợi ích khác, bảo vệ mã độc quyền, nén mã, tối ưu hóa hiệu suất và kỹ thuật đảo ngược mã cubing Tuy nhiên, obfuscation cũng được sử dụng bởi những kẻ tấn công mạng để ngụy trang các mã JS có ý đồ xấu trong khi vẫn bảo toàn hành vi mã tổng thể Thuộc tính này, khi được sử dụng trong mã JS độc hại,

- Obfuscation tràn lan ở cả mã JavaScript (JS) lành tính và độc hại Nó tạo ra một

mã khó phát hiện và không thể phát hiện được, cản trở việc hiểu và phân tích

- Đây là một kỹ thuật để trả lời cho câu hỏi mà mình thường gặp của các bạn

developer mới vào nghề: “Làm sao để che giấu source code của mình?” Hãy thử xem ví dụ phía dưới, là một thuật toán được sử dụng để giới thiệu sản phẩm cho người mua hàng trên một trang web thương mại điện tử Nó tạo ra một danh sách các đề xuất sản phẩm cho một khách hàng cụ thể dựa trên lịch sử mua hàng trước

đó của khách hàng đó:

Trang 15

MA CÔNG THÀNH – B18AT03 TRANG 15

Hình 5 Đoạn mã rõ

- Đây có vẻ giống như một đoạn mã khá bình thường, nhưng hãy tưởng tượng rằng đây là một thuật toán độc quyền được phát triển bởi công ty này Nếu chúng tôi là một đối thủ cạnh tranh truy cập trang web của họ, chúng tôi có thể nhanh chóng tìm thấy mã này và làm những gì chúng tôi muốn với nó

- Là chủ sở hữu của mã này, chúng tôi hiểu rủi ro này và muốn bảo vệ nó Trước khi chúng ta đi vào giải mã JS thực tế, hãy xem việc thu nhỏ sẽ làm gì đối với mã:

Hình 6 Mã được minified

- Thoạt nhìn, bạn sẽ nói rằng đọc mã khó hơn Nhưng chỉ mất một giây để nhận ra rằng tất cả các hàm, đối tượng và biến của chúng ta đều ở đó trong tầm nhìn rõ ràng Một lần nữa, việc thu nhỏ không cung cấp bất kỳ loại bảo vệ mã nào

Trang 16

MA CÔNG THÀNH – B18AT03 TRANG 16

- Bây giờ chúng ta hãy xem mã trông như thế nào sau khi chúng ta thêm một kỹ thuật obfuscation duy nhất

Hình 7 Mã được làm rối obfuscation bằng một phương pháp duy nhất

- Trước hết, điều này thậm chí không có vẻ giống như mã JavaScript dễ nhận biết Nó đã bị xáo trộn với một thứ gọi là làm phẳng luồng điều khiển — một phép biến đổi Jscrambler độc đáo giúp làm phẳng luồng chương trình và che giấu mọi cấu trúc có điều kiện tự nhiên mà nếu không sẽ làm cho mã dễ đọc hơn

- Bây giờ chúng ta hãy xem xét một ví dụ về sự xáo trộn cực độ:

Hình 8 Mã được mã hóa cực độ

Trang 17

MA CÔNG THÀNH – B18AT03 TRANG 17

- Đây là một đoạn mã có sự xáo trộn không phải chữ và số, mà bạn không thường

tìm thấy trong tự nhiên Đối với mắt người, điều này dường như không thể thiết

kế ngược lại Nhưng nếu chúng tôi chạy mã này thông qua một công cụ thiết kế ngược tự động, chúng tôi sẽ nhận được mã gốc gần như ngay lập tức

- Thực tế, sự xáo trộn dường như cực kỳ nghiêm trọng này là một ví dụ tuyệt vời

về sự xáo trộn yếu có thể trông như thế nào

- Vì vậy, làm thế nào chúng ta có thể phân biệt giữa obfuscation yếu và mạnh? Để

trả lời điều đó, chúng ta cần hiểu các số liệu làm xáo trộn

- Số liệu làm xáo trộn mã JS: có 3 số liệu chính:

• Hiệu lực (potency)

• Khả năng phục hồi (resilience)

• Chi phí (cost)

- Tại sao cần phải Obfuscated code?

• Khi code được Obfuscated sẽ rất khó để đảo ngược lại định dạng ban đầu

• Ngăn chặn bất kỳ ai muốn copy/paste tác phẩm của bạn Điều này đặc biệt quan trọng đối với các dự án 100% phía máy khách, chẳng hạn như những game được viết bằng HTML5;

• Xóa các đoạn comment và khoảng trắng không cần thiết Làm cho nó tải nhanh hơn và khó hiểu hơn;

• Bảo vệ dự án chưa được thanh toán, bạn có thể cho khách hàng của mình biết rằng họ sẽ không có mã nguồn cho đến khi hóa đơn đã được thanh toán

• Dung lượng code được giảm xuống, tăng tốc độ xử lý, tiết kiệm băng thông

- Ta có thể thấy, với Obfuscated code, nó không những chỉ minify (cắt bỏ các đoạn xuống dòng, dấu cách không cần thiết làm giảm dung lượng file, tiết kiệm băng thông) mà nó còn thay đổi luôn cả tên lớp, tên hàm, tên biến, … thành những kí tự đơn giản vô nghĩa (VD: a(), var b,…) Vậy nên Obfuscated code còn được biết đến

với cái tên Việt là kỹ thuật xáo trộn hoặc làm rối code: người khác có thể có

thấy được code của bạn nhưng khó có thể hiểu hết toàn bộ ý nghĩa code mà bạn viết Obfuscated code được dùng trong rất nhiều ngôn ngữ chứ không chỉ riêng Javascript Thường thì đối với các source public họ sẽ chỉ minify để giảm dung lượng file khi load Còn Obfuscated chỉ dùng khi muốn cải thiện hiệu suất hơn nữa

và đặc biệt là dùng để giấu code Giấu code ở đây cũng không hoàn toàn là không dịch ngược lại được, tuy nhiên sẽ tốn khá nhiều thời gian

- Xáo trộn (Obfuscation) có giống với mã hóa (Encryption) không? Không, xáo

trộn (obfuscation) khác với mã hóa (encryption) ở một số điểm sau:

• Trong JavaScript, trình duyệt có thể thực thi encrypted code, trong khi trình duyệt sẽ thực thi obfuscated code

• Encrypted code luôn cần giải mã để được thực thi

Trang 18

MA CÔNG THÀNH – B18AT03 TRANG 18

• Obfuscated code không yêu cầu khử dữ liệu để thực thi

• Không giống như mã hóa, trong đó ta phải cung cấp mật khẩu được sử dụng

để giải mã, không có khóa giải mã nào trong quá trình xáo trộn JavaScript Trên thực tế, nếu bạn mã hóa JavaScript ở phía máy khách, đó sẽ

là một nỗ lực vô nghĩa — nếu chúng tôi có khóa giải mã mà chúng tôi cần cung cấp cho trình duyệt, khóa đó có thể bị xâm phạm và mã có thể dễ dàng truy cập

• Vì vậy, với sự xáo trộn, trình duyệt có thể truy cập, đọc và diễn giải mã JavaScript bị xáo trộn một cách dễ dàng như mã gốc, không bị xáo trộn Và

mặc dù mã bị xáo trộn trông hoàn toàn khác, nó sẽ tạo ra chính xác cùng một đầu ra trong trình duyệt

- Lưu ý khi xáo trộn mã (Obfuscator):

• Chỉ thay đổi những tên riêng, không thay đổi từ khóa, tên lệnh, hay các API của hệ thống

• Tránh xung đột tên Ví dụ: nếu thay tên lớp và tên biến giống nhau, chương trình có thể chạy không giống bình thường và thậm chí là không hiểu nó đang làm gì

• Nhất quán Khi thay đổi tên phải thay đổi toàn bộ các file nguồn có chứa cùng đối tượng đó Ví dụ: file abc.jsp chứa lớp tên ABC thì khi đổi tên lớp ABC, tất

cả các file khác có dùng lớp ABC cũng phải thay đổi theo

• Đặt tên mới càng ngắn càng tốt Làm như thế để dịch mã nhanh hơn, đỡ tốn công sức cho trình dịch

• Lọai bỏ dư thừa

- Cách để xáo trộn mã (Obfuscated code): Ta có thể tự làm bằng tay Tuy nhiên,

nên sử dụng các bộ thư viện, phần mềm hoặc một số tools online vì những công cụ này đã được viết để có thể Obfuscated code của bạn một cách tối ưu nhất Một số tools online:

• JavaScript HTML Code/Text Obfuscator

• Online Javascript Obfuscator DaftLogic

• Mã hóa dạng EVAL(FUNCTION(P,A,C,K,E,R):

Ví dụ

eval(function(d,e,a,c,b,f){b=function(a){return…

• Mã hóa dạng BASE64:

Trang 19

MA CÔNG THÀNH – B18AT03 TRANG 19

Ví dụ

PCFET0NUWVBFIGh0bWw+PEhUTUw+PGhlYWQ+PG1ldGEgY2hhcnNld D0idXRmLTgiPjx0aXRsZT5DU1MzIEJ1dHRvbiBHZW5lcmF0b3IgfCBCZXN 0IEJlYXV0aWZ1bCBDU1

• Mã hóa dạng VAR _{STRING};VAR_{STRING}:

Ví dụ:

var _6340;var _9546=’144D126A205E1697E1571A1673D1181C1571C1613C1619A1613A 1619F1181F1355D1181D1223C2621E48335E1181B1649A1607C1691E122 3E1343F’;var _4174=/[\x41\x42\x43\x44\x45\x46]/;var

_8299=2;var _2685=_9546.charAt(_9546.length-1);var _8877;var _5445=_9546.split(_4174);var

_7530=[String.fromCharCode,isNaN,parseInt,String];_5445[1]=_7530[_829 9+1](_7530[_8299](_5445[1])/21);var _6937=(_8299==8)?String:eval;_88 77=”;_11=_7530[_8299](_5445[0])/_7530[_8299](_5445[1]);for(_6340=3; _6340<_11;_6340++)_8877+=(_7530[_8299-

2]((_7530[_8299](_5445[_6340])+_7530[_8299](_5445[2])+_7530[_8299]( _5445[1]))/_7530[_8299](_5445[1])-

1));var _1040=’_6496′;var _5869=’_1040=_8877′;function _6874(_4650){_ 6937(_6251);_6874(_7995);_7995(_5869);_6874(_1040);}var _6251=’_6874

_7530[_8299](_5445[2])+_7530[_8299](_5445[1])-=_6937′;var _7995=’_7995=_6874′;_6874(_2685);

3 Phương pháp giải mã code javascript bị mã hóa:

- Trình tự các bước giải mã cụ thể sẽ được trình bày ở phần demo lab công cụ De4js, dưới đây là phần giới thiệu một số cách thông dụng để giải mã code

javascript đã bị mã hóa:

Trang 20

MA CÔNG THÀNH – B18AT03 TRANG 20

Hình 9 Luồng giải mã đoạn code bị làm rối

3.1 Giải mã bị xáo trộn (Deobfuscation code):

- Deobfuscation là quá trình phân tích và định dạng một mã JS bị xáo trộn để làm

cho nó có thể đọc lại được

3.2 Giải nén (Unpacking code):

- Mã JS được đóng gói hoặc mã hóa để che giấu tính độc hại của nó, do đó cản trở

việc diễn giải bằng phân tích tĩnh Khái niệm này cũng được sử dụng trong các

mã JS lành tính cho mục đích nén mã và bảo mật Các trình đóng gói mã JS rất đa dạng và phổ biến hơn với những kẻ tấn công cố gắng trốn tránh sự phát hiện Các công cụ này bao bọc toàn bộ mã bằng cách sử dụng hàm eval() nhận đàu vào là một chuỗi và cố gắng chạy nó dưới dạng mã JS Sau đó, mã được tải trong thời

gian chạy thông qua hàm

3.3 Giải mã (Decoding code):

- Là phương pháp giải mã các luồng dữ liệu được mã hóa dưới dạng Base64, RC4

hoặc thông qua các phương pháp xáo trộn mã (obfuscation code) về dạng có thể

đọc hiểu được

Ngày đăng: 09/02/2022, 16:13

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w