CÁCH MÀ MỘT PHẦN MỀM "CRACK" ĐƯỢC TẠO RA VÀ TẠI SAO CÁC NHÀ PHÁT TRIỂN KHÔNG THỂ NGĂN CHÚNG LẠI?
_________________________________ Người dịch:Hà Tiến Việt , thứ 4 ngày 29 tháng 8 năm 2018 bên Quora Việt Nam
#IT #Assembly #ComputerEthics
Dennis Babkin:
Các sản phẩm crack được tạo ra nhờ vào việc sử dụng trình gỡ rối (debugger). Đây là một loại chương trình đặc biệt được các lập trình viên dùng để tách cấu trúc chương trình của họ thành các phần cấu trúc nhỏ hơn với mục đích tìm kiếm lỗi và từ đó có thể sửa lỗi. Thêm vào đó trình gỡ rối còn có thể được sử dụng cho “kĩ thuật đảo ngược" (trans: reverse-engineering là một kỹ thuật áp dụng trong CNTT, cơ khí, điện tử bằng cách tách nhỏ các cấu trúc của thiết bị ra để hiểu về cấu trúc và thuật toán của nó), để nhìn vào bên trong phần mềm và học về logic của nó. Kĩ thuật thứ hai hầu hết được sử dụng bởi các nhà nghiên cứu “mã độc” với mục đích nghiên cứu mã độc (hay virus máy tính) làm gì bên trong máy tính. Nhưng nó còn được sử dụng bởi những kẻ tấn công với mục đích crack hay vượt qua hàng rào đăng ký bản quyền hợp pháp và thỉnh thoảng, còn thay đổi hành vi bình thường của phần mềm, ví dụ bằng cách tiêm vào nó “mã độc”.
Để ví dụ, tôi sẽ cho rằng phần mềm bị crack được chuyển về được dịch về ngôn ngữ máy(Native code) chứ không phải một ứng dụng nền tảng .NET hay Javascript. (Mặt khác thì nó khá là dễ dàng khi đọc code nguồn). Ngôn ngữ máy đã được biên dịch thì phải nói là hơi bị khó nhằn để nghiên cứu được. (Từ Native ở đây ý chỉ rằng mã đó được thực thi trực tiếp bởi CPU, GPU hoặc các phần cứng khác.)
Cho rằng giờ kẻ tấn công đang nhắm đến việc vượt qua rằng buộc về đăng ký và vì thế mà không phải trả tiền để dùng phần mềm. (Sau đó thì thế nào, mấy bạn này cũng post nó lên mấy diễn đàn hoặc torrent để mọi người down về xài miễn phí đổi lại mấy comment biết ơn và thả tym)
Giả định cho đơn giản rằng mã gốc được viết trên C++ và nó cái gì đó tương tự dưới đây:
Trong mẫu code này thì "RegistrationName" và "RegistrationCode" là các chuỗi kí tự đặc biệt mà người dùng hợp pháp của phần mềm sẽ nhận được sau khi mua. (Cái tên này thường là tên thật và email của người đó, và mã thì là một dãy kí tự đặc biệt mà sẽ gắn liền với cái tên này)
Với logic trên, hàm với tên "isRegistrationCodeGood()" sẽ kiểm tra xem "RegistrationName" và "RegistrationCode" có được chấp nhận bằng cách sử dụng một vài phương pháp kiểm tra quyền sở hữu. Nếu đúng, nó sẽ trả về true. Nếu không thì false. Kết quả cho ra sẽ quyết định nhánh nào hay mục tiêu xử lý nào sẽ được thực thi.
Vi thế logic trên có thể sẽ hoặc là hiện thị việc đăng kí sai và thoát:
"Sorry, your registration code is incorrect. Please try again"
Xin lỗi mã đăng kí sai. Vui lòng thử lại
Hoặc nếu mã đăng kí và tên phù hợp nhau, nó sẽ lưu thông tin đăng kí trong một nơi lưu trữ lâu dài (ví dụ như File hệ thống hoặc Sổ hệ thống) sử dụng hàm tên là "rememberRegistrationParameters()" và rồi hiện ra thông báo cảm ơn đã đăng ký:
Việc đăng kí hoàn tất. Cảm ơn
Người crack thì rõ ràng là muốn có được kết quả thứ hai cho bất kì mã đăng kí nào mà anh ta nhập. Nhưng có một vấn đề. Họ không có cái mã nguồn C++ , cái phần ví dụ ở trên (Mong là thế)
Vậy nên nguồn duy nhất cho những kẻ tấn công là tách mã nhị phân(một thứ mà luôn đi kèm với các phần mềm ở dạng file .exe hoặc .dll trên Windows, và hầu hết là các Unix thực thi trong gói .app trên Mac) Kẻ tấn công sẽ sử dụng trình gỡ rối để học về mã nhị phân và cố để xác định logic đăng kí mà tôi chỉ ra phía trên.
Tiếp theo bạn sẽ thấy bảng lưu đồ cho phần mã C++ ở trên, được hiển thị bằng trình gỡ rối bậc thấp. Hay có thể hiểu là sẽ đọc bằng mã nhị phân sau khi biên dịch:
(Cho dễ đọc tôi đã thêm phần chú thích vào bên phải với tên hàm và tên biến. Cái đó không hiển thị trên màn hình của kẻ tấn công.)
(Để hiểu cái được hiển thị ở trên bảng này kẻ tấn công phải có một lượng kiến thức tốt về Hợp ngữ để hiểu ngôn ngữ máy.)
Tôi cũng cần phải chỉ ra rằng một đoạn cấu trúc tách ra như trên là kết quả cuối cùng mà kẻ tấn công nhận được. Phần khó nhất giờ là tìm ra cái mình cần giữa hàng triệu các dòng mã na ná nhau. Và đây là thử thách chính của họ. Không phải ai cũng làm được nha nên vì thế mà crack phần mềm cũng là một tài năng khá ngầu đó.
Khi mà đã có được đoạn mã mà mình cần trong file nhị phân thì các cracker có hai lựa chọn:
1) Thay đổi hay ráp lại chuỗi nhị phân
2) Đảo ngược hàm "isRegistrationCodeGood()" và sao chép logic của nó để tạo ra một cái KeyGen (tự tạo mã sản phẩm)
Giờ thì xem qua cả 2 cách nào:
Lựa chọn thứ nhất khá là dễ hiểu. Vì kẻ tấn công đã đi xa đến đây rồi, chắc hẳn anh ta hoặc cô ta biết về Instruction Set của Intel x64 khá rõ (trans: đây là một chỉ số cấu trúc máy tính). Vì thế họ đơn giản đổi điều kiện cú nhảy từ "jnzshortloc_7FF645671430" trên địa chỉ 00007FF645671418 (khoang đỏ trên ảnh) trở thành vô điều kiện, hoặc "jmpshortloc_7FF645671430". Nó sẽ loại bỏ bất kì các đăng kí thất bại một cách hiệu quả và sau đó thì dù người dùng gõ gì thì sẽ đều được chấp nhận là một người dùng hợp pháp.
Cũng nên chú ý là sự thay đổi này có thể được thực hiện chỉ với việc thay đổi 1 byte trong mã nhị phân từ 0x75 thành 0xEB:
Nhưng cách tiếp cận này đến với một cái giá của việc thay đổi file nhị phân gốc. Vì điều đó kẻ tấn công cần bản vá của riêng mình (hoặc một file thực thi sẽ áp dụng điều chỉnh ở trên). Nhược điểm của phương pháp này cho kẻ tấn công là vá lại file thực thi gốc sẽ phá vỡ chữ kí ảo của phần mềm (trans: một loại khóa bảo mật được máy tính tạo ra để đảm bảo các thông tin gửi đi không bị thay đổi), điều này có thể được thông báo cho người dùng (end-user) hoặc nhà sản xuất. Thêm vào đó các bản vá file thực thi này có thể dễ dàng bị đánh cờ và chặn bởi các ứng dụng bảo mật, chống virus, hoặc thậm chí là đưa ra đầu mối cho các nhà điều tra tội phạm về danh tính kẻ tấn công.
Giải pháp thứ hai thì lươn lẹo hơn. Kẻ tấn công sẽ phải học kĩ về hàm "isRegistrationCodeGood()" và sao chép nó vào một chương trình của riêng mình mà sẽ nhân bản cái logic đặt trong phần mềm gốc một cách hiệu quả và từ đó cho anh ta tạo ra bất kì mã đăng kí nào với mọi cái tên, bất kì người dùng nào với khả năng đăng kí mà không cần trả bất cứ khoản tiền nào.
Nhà sản xuất của nhiều các ứng dụng thịnh hành hiểu về nguy cơ ảnh hưởng của phương pháp thứ hai và đã thử ngăn ngừa bằng cách yêu cầu một bước xác nhận “chính chủ”. Đơn giản là thêm một bước vào sau phần đăng kí, khi mà phần mềm gửi tên đăng kí lên trên mạng máy chủ của công ty mà trả về thông tin liệu cái mã vừa rồi có phù hợp hay không? Cái này được Microsoft áp dụng khi bản mua Windows (họ gọi nó là “Kích hoạt Win”) và cả các hãng như Adobe,... Bước thứ hai này được chạy ngầm khi mà ứng dụng bắt đầu chạy và thường dẫn đến hủy luôn cái mã đăng kí trước nếu như nó được cho là bất hợp pháp.
Giờ thì bạn chắc cũng hiểu qua về khái niệm và phương pháp “crack” rồi phải không?
Giờ là câu hỏi thứ hai tại sao không thể nào mà có thể ngăn ngừa triệt để vấn đề này. Nó đều dẫn ra một vấn đề là mọi mã phần mềm thì đều chạy bởi CPU(trong trường hợp mã máy) hay một trình biên dịch JavaScript hoặc một trình biên dịch JIT (trong trường hợp của JavaScript và .NET) Điều này có nghĩa là có một cách để đọc và biên dịch bất cứ thứ gì, không kể độ phức tạp, miễn là đủ kiến thức và tính kiên trì thì kẻ tấn công vẫn có thể đọc được và rồi phá nó.
Có vài ý kiến về việc các phần mềm trên cloud thì bảo mật hơn, thì đúng vậy vì mã nhị phân của nó lưu trên sever và các người dùng thì không thể truy cập trực tiếp nó được. Và mặc dù các phần mềm đám mây rõ ràng là công nghệ tương lai, nó vẫn có một vài nhược điểm lớn mà khiến nó không bao giờ thay thế hoàn toàn các ứng dụng kiểu truyền thống bây giờ. Liệt kê ra vài cái:
• Không phải ai cũng có kết nối Internet hoặc thoải mái với việc đưa dữ liệu lên Internet. Thêm vào đó đường truyền Internet có thể quá đắt đỏ hoặc quá chậm khiến ứng dụng chạy rất lag.
• Rồi thì có câu hỏi về việc phân phối tính toán. Ví dụ, Blizzard Entertainment sẽ không bao giờ để “World of Warcraft” chạy hoàn toàn trên sever vì một lượng tài nguyên khổng lồ cần phải xử lý với mỗi cảnh của từng người chơi. Vì thế họ thấy hợp lý nhất là để máy tính cá nhân người dùng xử lý cái này.
Là một kĩ sư phần mềm, tôi hoàn toàn không thích cái trò đánh cắp bản quyền này chút nào. Nhưng tôi vẫn phải chấp nhận và sống với nó thôi. Tin tốt là không có quá nhiều người thực sự ngồi mày mò tìm kiếm các bản crack phần mềm (trans: chắc chưa tới Việt Nam ). Vấn đề chính với những người xài crack là phải tải về một bản vá, hoặc KeyGen hay Patcher của người làm ra, họ phải tin tưởng hoàn toàn rằng người đó không cho bất cứ thứ gì mờ ám vào phần mềm mà không được nêu ra (những thứ như Trojan, mã độc hay keylogger). Vì thế câu hỏi đặt ra là liệu có đáng đánh đổi tiền mua bản quyền với nguy cơ nhiễm virus trên hệ thống hay không?
Xét về khía cạnh khác có rất nhiều các nhà phát triển phần mềm phản ứng rất tiêu cực với bất cứ nỗ lực nào để trộm bản quyền phần mềm của họ (Tôi cũng từng thế). Và rồi họ thể cài vào thêm các loại phương pháp phòng chống -- mọi thứ từ đánh lừa quy trình đảo ngược, hay thêm các “bẫy” trong mã mà có thể phá hoại nếu nó phát hiện đang bị gỡ ra, cho đến làm rối mã nguồn thậm chí là ép vào các sơ đồ DRM hoặc chặn người dùng từ một số quốc gia cố định. Tôi, theo quan điểm cá nhân tránh xa tất cả các thứ này. Và đây là lí do:
A) Bất cứ chiến thuật chống đảo ngược nào cũng sẽ bị vượt mặt nếu người đó đủ kiên trì. Vì thế sao tôi phải bận tâm và tốn thời gian của mình thay vì đầu tư nó để thêm những thứ hữu dụng cho người dùng hợp pháp?
B) Một vài gói mã thêm vào có thể gây ra cảnh báo trên các trình diệt virus, mà điều này thì rõ ràng là không tốt cho việc bán sản phẩm rồi. Nó cũng tạo nên sự phức tạp không cần thiết khi người phát triển muốn sửa lỗi.
C) Thêm các bẫy vào mã có thể hại chính những người dùng hợp pháp, mà điều đó không chỉ gây khó chịu và có thể dẫn tới kiện tụng.
D) Bất cứ sơ đồ DRM nào cũng sẽ bắt được khoảng 100 bản lậu và tạo sự bất tiện rất lớn cho 10000 bản hợp pháp. Vậy thì nó có ích gì cho các khách hàng thực sự của bạn nhỉ?
E) Thống kê của chúng tôi cho thấy 75% các phiên bản phần mềm lậu đến từ Trung Quốc, Nga, Brazil,... (Tôi hiểu lí do có thể là vì nguồn thu nhập thấp ở các nước trên). Vấn đề chính với chúng ta là nếu ra mạnh tay thêm vào các DRM hoặc các bước kiểm tra chính chủ nghiêm ngặt, nhiều người vẫn muốn sản phẩm miễn phí sẽ đơn giản là chuyển sang trộm mã thẻ tín dụng. Và việc này thì nằm ngoài tầm kiểm soát của bạn và tôi. Hệ thống của ta sẽ dùng nó để gửi họ những mã bản quyền hợp pháp. Kết quả là chúng ta mất tiền trả cho bản quyền, thêm vào đó các công ty tín dụng sẽ phải bồi thường một khoảng phí đến tài khoản của chúng ta từ 0.25 đến 20 đô mỗi lần giao dịch bất hợp pháp.
F) Một vài công ty còn có thể được lợi từ việc cho phép các bản lậu phần mềm lưu hành. Lấy Microsoft ra làm ví dụ, họ được quảng cáo miễn phí từ những người dùng hệ điều hành Windows, tương tự với Photoshop Adobe. Đây là một điểm tốt mà tôi đồng ý.
Vậy quan điểm của tôi là -- nếu ai đó muốn bỏ thời gian, công sức trộm phần mềm, cứ làm vậy đi. Họ dù sao đã phải tốn công làm vậy mà nên hẳn là có lí do. Nhìn vào mặt tích cực thì số lượng khách hàng biết ơn công sức chúng tôi bỏ ra làm phần mềm và sẵn sàng ủng hộ nó đông đảo hơn nhiều số không như vậy.