Tải bản đầy đủ (.pdf) (40 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.33 MB, 40 trang )

HỌC VIỆN CƠNG NGHỆ BƯU CHÍNH VIỄN THƠNG
----------

BÁO CÁO TIỂU LUẬN
CƠNG CỤ GIẢI MÃ JAVASCRIPT - DE4JS
HỌC PHẦN: AN TỒN MẠNG
Sinh viên thực hiện
Mã sinh viên
Nhóm mơn học
Giảng viên hướng dẫn

:
:
:
:

Ma Công Thành
B18DCAT235
01
TS. Đặng Minh Tuấn

Hà Nội, tháng 12/2021


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

MA CÔNG THÀNH – B18AT03

TRANG 2


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.


2.

3.

II.

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


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

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


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

3.

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

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

MA CƠNG THÀNH – B18AT03

TRANG 3


III.
1.

Bài lab ............................................................................................................................................ 29
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.
V.

Kết luận: ........................................................................................................................................ 39
Tài liệu tham khảo ............................................................................................................................ 40

MA CÔNG THÀNH – B18AT03

TRANG 4



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

MA CÔNG THÀNH – B18AT03

TRANG 5


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

JS


Javascript

Ngơn ngữ lập trình được sử dụng rộng rãi
cho web.

CTF

Capture The Flag

Cuộc thi kiến thức về bảo mật thơng tin

MA CƠNG THÀNH – B18AT03

TRANG 6


LỜI MỞ ĐẦU
Ngày này, mạng Internet đã trở thành một phần không thể thiếu của cuộc sống xã hội hiện
đại, mở ra một chương mới trong việc kết nối mọi người trên toàn thế giới. Rất dễ để nhận thấy
sự hiện diện của mạng Internet thông qua các thiết bị số chúng ta sử dụng hàng ngày, như: các
ứng dụng mạng xã hội Facebook, Zalo, Telegram, … giúp chúng ta có thể trị chuyện với nhau,
sử dụng các ứng dụng sàn thương mại điện tử như Shopee, Lazada, … để mua hàng và thơng qua
các trang web để có thể tìm kiếm, trao đổi thơng tin, … Tầm quan trọng của công nghệ đối với
cuộc sống hiện nay là không thể bàn cãi, tuy nhiên để giúp các phần mềm, ứng dụng, trang web
trên được hoạt động một các ổn định và hiệu quả thì khơng thể khơng nhắc đến vai trị của ngơn
ngữ lập trình Javascript. Đây là ngơn ngữ lập trình được sử dụng phổ biến nhất hiện nay trong
việc xây dụng các website và một số app mobile. JavaScript hoặc JS sẽ giúp tăng tính tương tác
trên website. Script này chạy trên các trình duyệt của người dùng thay vì trên server và thường
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 ln tìm kiếm những lỗ hổng và các lỗi bảo mật để lợi dụng nó. Ngồ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ể hồn thiện hơn bài tiểu luận này.

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

MA CÔNG THÀNH – B18AT03

TRANG 7


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

I.

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 ngun 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.

MA CÔNG THÀNH – B18AT03

TRANG 8


-

Năm 1996, JavaScript đã được gửi đến ECMA International để hồ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 hồ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

MA CÔNG THÀNH – B18AT03

TRANG 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ì?
- 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:
Ngơn ngữ
Đặc điểm
lập trình
JavaScript hoặc JS sẽ giúp tăng tính tương tác trên website. Script này
chạy trên các trình duyệt của người dùng thay vì trên server và thường sử
JavaScript
dụng thư vuiên của bên thứ 3 nên có thể tăng thêm chức năng cho website
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à

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 ln 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;

MA CƠNG THÀNH – B18AT03

TRANG 10


❖ 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 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
ln đượ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 ở

MA CƠNG THÀNH – B18AT03

TRANG 11


-

-

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)

MA CÔNG THÀNH – B18AT03

TRANG 12



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à q 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

MA CÔNG THÀNH – B18AT03

TRANG 13


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 ngồ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 q 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 tồ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 tố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 đó:

MA CƠNG THÀNH – B18AT03

TRANG 14



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.

MA CÔNG THÀNH – B18AT03

TRANG 15


-

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 độ

MA CƠNG THÀNH – B18AT03

TRANG 16


-

Đâ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 tố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 tố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 tồ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 hồn tồ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 ln cần giải mã để được thực thi.

MA CÔNG THÀNH – B18AT03


TRANG 17







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 q 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 hồn tồ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 qn. 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
• Jsobfuscate

-

Một số cách Obfuscated code là:
• Mã hóa dạng HEX:
Ví dụ:
var _0x8662=["\x53\x61\x79\x48\x65\x6C\x6C\x6F","\x47\x65\x74\x43\x6F\x
75\x6E\x74","\x4D\x65\x73\x73\x61\x67\x65\x20\x3A\x20"
• 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…


MA CƠNG THÀNH – B18AT03


Mã hóa dạng BASE64:

TRANG 18


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[_82992]((_7530[_8299](_5445[_6340])+_7530[_8299](_5445[2])+_7530[_8299](
_5445[1]))/_7530[_8299](_5445[1])_7530[_8299](_5445[2])+_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
=_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:

MA CƠNG THÀNH – B18AT03


TRANG 19


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 tồ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

MA CƠNG THÀNH – B18AT03

TRANG 20


Hướng dẫn cài đặt và sử dụng DE4JS
1. Công cụ De4js:


De4js là một trình giải mã bị xáo trộn (deobfuscator) và giải nén (unpacker) mã
nguồn javascript được viết bởi tác giả Thành Thân Thiện.

Đặc điểm của De4js:
o Có thể hoạt động ngoại tuyến
o Làm cho mã nguồn có thẻ đọc được, trông đẹp mắt, làm nổi bật cú pháp.
o Làm cho mã bị xáo trộn có thể đọc được
o Được sử dụng để giải mã (de-obfuscates) các mã bị xáo trộn theo các tools,
services và methods sau:
▪ Eval (được sử dụng trong Packer, WiseLoop)
▪ Array (được sử dụng trong Javascript Obfuscator, Free JS Obfuscator)
▪ _Number
▪ Packer
▪ Javascript Obfuscator
▪ Free JS Obfuscator
▪ Obfuscator.IO
▪ My Obfuscate
▪ Кодирование URL (được sử dụng trong bookmarklet)
▪ JSFuck
▪ JJencode
▪ AAencodeWiseLoop

Trang chủ: />➢
Công cụ De4js chạy như một máy chủ nhỏ mà bạn có thể kết nối với trình duyệt
web. Tức là, chương trình có giao diện web.

II.

MA CÔNG THÀNH – B18AT03


TRANG 21


2. Cài đặt De4js:
2.1.
Cài đặt trên Kali Linux
- Cài đặt các gói bắt buộc:
1 sudo apt install npm ruby-dev zlib1g-dev
2 sudo gem install bundler

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

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

MA CÔNG THÀNH – B18AT03

TRANG 22


-

Lấy mã nguồn và cài đặt các phần phụ thuộc:
1 git clone />2 cd de4js
3 bundle install

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

-

Cài đặt Workbox CLI:

1 sudo npm install workbox-cli --global

MA CÔNG THÀNH – B18AT03

TRANG 23


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

-

Khởi động máy chủ:
1 npm start

-

Hoặc với đầu ra sử dụng thời gian thực:
1 npm run watch

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

-

De4js hiện đã được chạy trong trình duyệt web tại: http://localhost:4000/de4js/

MA CƠNG THÀNH – B18AT03

TRANG 24



Hình 15. Website local của de4js

-

2.2.
-

Build:
1 npm run build
Cài đặt trên BlackArch
Cài đặt các gói bắt buộc:
1 sudo pacman -S npm ruby zlib
2 sudo gem install bundler

-

Lấy mã nguồn và cài đặt các phần phụ thuộc:
1 git clone />2 cd de4js
3 bundle install

-

Cài đặt Workbox CLI:
1 sudo npm install workbox-cli --global

-

Khởi động máy chủ:
1 npm start


MA CÔNG THÀNH – B18AT03

TRANG 25


×