Professional Documents
Culture Documents
Crack
Crack
- Reverse engineering (kỹ thuật đảo ngược) là một quá trình phát hiện ra
các công nghệ cơ bản của một thiết bị, đối tượng hay một hệ thống thông
qua việc phân tích cấu trúc, chức năng và cách vận hành của chúng. Các
đối tượng ở đây có thể bao gồm: thiết bị cơ học, thiết bị điện tử, chương
trình phần mềm... Mục đích của việc này là tạo ra những thiết bị, chương
trình có tính năng như cái ban đầu nhưng không lấy bất cứ cái gì từ cái
ban đầu.
- Khái niệm Software cracking chỉ đơn giản là việc sửa hay can thiệp vào
phần mềm nào đó nhằm mục đích có được license (giấy phép) hay loại bỏ
module kiểm tra license của nó để có thể sử dụng đầy đủ các chức năng
một cách không chính thức. Do đó, các kiến thức lập trình tối thiểu là
điều yêu cầu phải có. Khi thực hiện việc crack phần mềm, chúng ta sẽ sử
dụng một kỹ thuật được gọi là reverse engineering (dịch ngược phần
mềm sang một loại ngôn ngữ nào đó - như assembly chẳng hạn) và khai
thác lỗ hổng của nó để viết crack, patch, keygen, ...!
- Bẻ khóa phần mềm có thể bị coi là một hành vi vi phạm bản quyền,
nhưng nó chỉ là một hạt cát trong sa mạc được gọi là Reverse
Engineering, kỹ thuật dịch ngược nhằm chỉnh sửa mã thực thi ở cấp thấp
(thập lục phân - Hex hay mã Assembly). Nhưng điều đáng nói là bất cứ ai
với một nền tảng cơ bản nhưng vững chắc về lập trình (không phân biệt
VB hay C/C++ "bác học"), về cách chuyển đổi giữa các hệ cơ số (nhị
phân, thập phân, thập lục phân)... đều có thể tiếp cận reverse engineering
- Như vậy, các Coder đóng vai chính trong một nhóm cracker. Họ có khả
năng lập trình tốt với các ngôn ngữ lập trình thông dụng nhất, trong đó
đặc biệt là ngôn ngữ lập trình Assembly (ASM). Họ có thể là một sinh
viên, một lập trình viên của công ty phần mềm nào đó,... Cracking đối với
họ thường chỉ nhằm thoả mãn sự đam mê, niềm vui song không loại trừ
những ngoại lệ: cracking với mục đích kinh tế.
2.3: Cracker
- Cracker (hay thợ khóa) là người có khả năng sửa đổi phần mềm để gỡ bỏ
các biện pháp bảo vệ bản quyền (như: chống sao chép, phiên bản dùng
thử giới hạn, kiểm tra số serial, kiểm tra CD hay các phiền toái trong
phần mềm như cửa sổ thông báo (screennag) và phần mềm quảng
cáo (adware). Họ làm ra các phiên bản cracks, patcher, keygen ...
Và đôi lúc, cracker còn thêm những phần mở rộng cho phần mềm thông
qua các phiên bản cracks của họ (các bản mod mở rộng chức năng/ thay
đổi 1 phần chương trình gốc)…
- Ngoài những lý do trên, với mục tiêu gây thiệt hại về tài chính cho công
ty đối thủ, có cả những trường hợp công ty A khuyến khích nhân viên của
mình dùng kỹ năng crack để bẻ khoá sản phẩm của công ty B rồi phân
phát bừa bãi trên mạng, lúc đó bên A mới tung ra sản phẩm của mình để
giành thị trường. Việc chơi xấu này diễn ra không phải là ít, đã và đang
diễn ra bằng hình thức này hay hình thức khác, phản ánh sự cạnh tranh
khốc liệt của thị trường.
- Những kiến thức về các ngôn ngữ lập trình bậc cao như Basic, Pascal, C+
+ sẽ giúp các cracker hiểu được quá trình hoạt động của phần mềm thông
quá các hàm chức năng. Tuy vậy, điều này không đóng vai trò thực sự
quan trọng bởi kiến thức cơ bản về Assembly mới là quan trọng nhất.
Đây cũng là điểm mấu chốt để bẻ khoá với một công cụ cực kỳ quan
trọng và cần thiết: debugger.
- Bằng cách sử dụng debugger, cracker có thể theo dõi phần mềm đó hoạt
động như thế nào, hay rõ hơn là quá trình mà khóa làm việc như thế nào?
Khi đó, vấn đề bẻ khoá chỉ còn là thời gian. Đối với những cracker nhiều
kinh nghiệm, việc bẻ khoá một phần mềm còn dễ dàng hơn ăn kẹo bởi họ
đều nắm rõ những thuật toán mà các loại khoá áp dụng. Công việc debug
đòi hỏi nhiều thời gian của cracker bởi nó ghi lại toàn bộ quá trình phần
mềm đó làm việc như thế nào. Sau khi cơ bản đã bẻ được cái khoá của
phần mềm, cracker sẽ tìm cách để phổ biến bản phá khoá này: Chỉ cần
viết một chương trình nho nhỏ (gọi là patch), có tác dụng sửa một số byte
của phần mềm sao cho sau khi sửa thì cái khoá không còn tác dụng nữa
(tựa như nhà sản xuất tung ra các bản sửa lỗi cho phần mềm của mình
vậy). Cao cấp hơn, cracker sẽ viết hẳn một chương trình tính toán ra số
serial hay gọi là key generator để làm công việc tương tự như việc nhà
sản xuất cung cấp số serial cho người dùng đăng ký hợp pháp.
- Tuy nhiên, trải qua nhiều kinh nghiệm và cũng nhiều lần chứng kiến phần
mềm của mình bị bẻ khoá một cách không thương tiếc, các nhà sản xuất
cũng đã và đang dần dần tìm cách nâng cấp, hay thay khoá bảo vệ của
mình tốt hơn. Bằng cách này hay cách khác, họ cố gắng trang bị cho phần
mềm những công cụ chống bẻ khoá ngày càng tối tân hơn: Chống dịch
ngược (disassembly), chống debug (anti debug), khoá cứng (hardlock),
nén lại (pack),... Mặc dù vậy, sự thành công không khả quan là bao bởi vì
không nhóm cracker này thì nhóm cracker khác cũng sẽ ra tay!
3. Các phần mềm thông dụng
3.1: OllyDbg
Ảnh 1:
- OllyDbg là một trình gỡ rối (ở tầng ring 3) ở cấp độ hợp ngữ trên nền
Windows 32-bit. Nó chú trọng đến việc phân tích mã nhị phân nên đặc
biệt hữu ích trong trường hợp không có mã nguồn. Nó dò xét các thanh
ghi, nhận diện các thủ tục, các lời gọi hàm API, các khóa chuyển, các
bảng, hằng số và các chuỗi, cũng như chỉ ra vị trí các routines từ các tập
tin đối tượng và các thư viện. Theo như trong tập tin trợ giúp của chương
trình, phiên bản 1.10 là bản cuối cùng của dòng phiên bản 1.x. Bản 2.0
được phát triển và được lập trình lại từ đầu. Phần mềm thì miễn phí (với
đầy đủ chức năng, không có giới hạn thời gian sử dụng, v.v...), nhưng có
thông báo đăng ký với tác giả như ở các dạng phần mềm dùng thử. Phiên
bản hiện tại của OllyDbg không thể thao tác được các tập tin biên dịch
cho các bộ vi xử lý 64-bit. OllyDbg thường được dùng cho việc reverse
engineering (kỹ thuật dịch ngược) các chương trình. Là công cụ yêu thích
của các cracker để bẻ khóa phần mềm của người khác. Trong việc phân
tích ngược cũng như bẻ khóa, OllyDbg là một trong những công cụ quan
trọng chính vì sự tiện lợi và sức mạnh của mình. Nó cũng là công cụ giúp
các lập trình viên phân tích và sửa chữa, kiện toàn chương trình của họ.
3.2: PeiD
3.3: WinHex
Thiết kế bởi: Stefan Fleischmann
Bản mới nhất: 15.6 (01/03/2010)
Hệ điều hành: Windows 2000/XP/2003/Vista*/2008*/7*
Nền tảng: 32-bit
Thể loại: Biên tập mã hex
Giấy phép: Phần mềm chia sẻ
Website: http://www.x-ways.net/winhex/
- WinHex là một phần mềm biên tập mã hex phổ dụng, đặc biệt hữu dụng
cho máy tính của bạn, có khả năng phục hồi dữ liệu, xử lý dữ liệu cấp
thấp, và bảo mật. Là một phần mềm cao cấp dùng hằng ngày và trong các
trường hợp khẩn cấp: kiểm tra và biên tập tất cả các kiểu tập tin, phục hồi
những tập tin bị xóa hay dữ liệu bị mất mát từ đĩa cứng với cả những hệ
thống tập tin bị hư hại hay từ thẻ nhớ của máy quay phim kĩ thuật số.
- Resource HackerTM là một tiện ích miễn phí để xem, sửa đổi, đổi tên, thêm,
xoá và trích xuất các resource trong tập tin thực thi (*.exe) và các tập tin
nguồn (*.res). Nó tích hợp một trình biên dịch mã nguồn nội bộ và trình
dịch ngược để làm việc trên các hệ thống Windows (32/64-bit)
- Xem thông tin các resource: Cursor, Icon, Bitmap, GIF, AVI, JPG và ảnh
PNG. Phát các audio resource như WAV và MIDI. Các Menu, Dialogs,
MessageTables, StringTables, Accelerators, Delphi forms, và các thông tin
phiên bản của resource có thể xem với trình biên dịch mã nguồn nội bộ.
Menu và Dialogs cũng có thể được xem đúng theo cách mà nó sẽ thể hiện
khi ứng dụng chạy.
- Sao lưu resource: Các resource có thể lưu được như tập tin hình ảnh (*.ico,
*.bmp…), các file script (*.rc), các tập tin binary resource (*.res), hoặc như
các tập tin untyped binary (*.bin)
- Sửa đổi resource: Resource có thể được sửa đổi bằng cách thay thế các
resource mặc định với một resource nằm trong tập tin khác (*.ico, *.bmp,
*.res…) hoặc bằng cách sử dụng trình biên dịch mã nguồn nội bộ (đối với
các menu, dialog…) Các dialog control có thể được di chuyển hoặc thay
đổi kích cỡ bằng cách click chuột và kéo các dialog control tương ứng
trước khi biên dịch lại với trình biên dịch nội bộ.
- Thêm resource: Các resource có thể được thêm vào một ứng dụng bằng
cách copy chúng từ các tập tin tài nguyên bên ngoài (*.res).
- Xóa resource: Hầu hết các trình biên dịch tự thêm các resource mà không
bao giờ được sử dụng vào ứng dụng. Removing unused resources can
reduce an application's size. Việc loại bỏ các resource không sử dụng này
có thể giúp giảm kích thước của một ứng dụng.
II. Kiến thức cơ bản lập trình hợp ngữ
2.1: Thanh ghi ESP (Con trỏ ngăn xếp - Stack pointer)
2.2: Thanh ghi EIP (Con trỏ chỉ dẫn - Instruction Pointer)
4. Stack
5. Câu lệnh cơ bản
5.2.2: Lệnh OR
5.4.4: Lệnh JS
5.4.7: Lệnh JO
5.4.9: Lệnh JB
5.4.11: Lệnh JL
1. Patching
- Patching (vá) là phương pháp tìm nơi mà chương trình kiểm tra xem nó
đã được đăng ký hay chưa(hay bất kỳ nơi nào quyết định cho phép hay
không cho phép bạn dùng chương trình) sau đó,ta sẽ sửa đổi tập tin chạy
của chương trình để làm cho nó luôn chạy như đã được đăng ký, hoặclà
chấp nhận mọi số serial mà ta nhập vào như là số serial chính xác.
2. Keygenning
- Keygenning (tạo key) là phương pháp tìm nơi chương trình kiểm tra số
serial đúng hay sai, và quy trình tạo số serial, rồi từ đó viết một chương
trình nhỏ để tạo ra số serial chính xác. Tất nhiên, số serial này là chính
xác nên chương trình luôn chấp nhận nó.
3. Serial Fishing
- Serial Fishing (câu serial) là phương pháp tìm nơi mà chương trình so
sánh số serial được nhập với số serial chính xác, rồi từ đó cố gắng thiết
lập sao cho số serial chính xác được tạo ra, tìm nó với các thông tin liên
quan, cuối cùng phát hành nó theo dạng chương trình nhỏ có hộp kiểm
Name/Serial.
4. Self-Keygenning
- Self-Keygenning (tạo key trong) là phương pháp pha trộn giữa Serial
Fishing và Patching. Về cơ bản, Self-Keygenning là phương pháp sửa đổi
chương trình để qua đó thay vì chương trình hiện thông báo lỗi khi nhập
số serial sai thì nó sẽ hiện cho người dùng biết số serial chính xác.
5. Unpacking
- Unpacking (giải nén) là phương pháp tạo ra một tập tin chạy không bị
nén. Về cơ bản, một tập tin chạy khi bị nén (tức packed) sẽ rất khó hay
không thể sử dụng các phương pháp cracking thông thường (Patching,
Serial Fishing, Self-Keygenning, Keygenning ...) để crack được. Vì vậy
cần phải có bước unpacking trước, rồi mới tiến hành các phương pháp
cracking thông thường trên được. Để hiểu thêm về thế nào là "một tập tin
chạy bị nén" tôi sẽ giải thích ở gần cuối bài viết này.
6. Inline-Patching
- Inline Patching (vá khi nén) là phương pháp cracking dành riêng cho các
tập tin chạy bị nén. Như ở trên, thông thường khi gặp một tập tin chạy bị
nén, thì cần phải unpack (giải nén bằng công cụ (unpack tools/ unpack
scripts) hay bằng thủ công (manual unpack)) rồi mới tiến hành phương
pháp cracking khác được. Nhưng với inline patching thì khác, nó là sự
pha trộn giữa Patching và Unpacking cùng với kinh nghiệm từng trải, tốt
nhất nếu bạn chưa có kinh nghiệm thì đừng động tới nó vì bạn sẽ hiểu
bạn sẽ có ít hơn là được.
Anti-Cracking Techniques