1 điểm bởi GN⁺ 2026-02-02 | 1 bình luận | Chia sẻ qua WhatsApp
  • Một trường hợp phân tích và khôi phục cách hoạt động của dongle cổng song songtrình biên dịch RPG II dùng cho kế toán trong thập niên 1990 yêu cầu
  • Phần mềm gốc chạy trong cửa sổ DOS của môi trường Windows 98 và sẽ không hoạt động nếu thiếu dongle
  • Sau khi chuyển ảnh đĩa sang trình giả lập để phân tích, phát hiện cùng một routine chống sao chép đã được chèn vào bên trong các tệp thực thi như RPGC.EXE và SEU.EXE
  • Qua phân tích assembly, xác nhận routine này luôn trả về một giá trị hằng cố định (7606h), và đã vượt qua bước kiểm tra dongle bằng một bản vá 4 byte
  • Nhờ đó, trình biên dịch RPG II của Software West có thể chạy mà không cần dongle, một kết quả có ý nghĩa trong góc độ bảo tồn phần mềm cổ điển

Phần mềm kế toán cổ xưa và phát hiện về dongle

  • Phần mềm kế toán dựa trên RPG đã được sử dụng suốt 40 năm vẫn còn đang vận hành trên một PC Windows 98
    • RPG là ngôn ngữ dành cho các máy tính tầm trung như IBM System/3, System/32, AS/400, và sau đó được chuyển sang MS-DOS
  • Khi chạy, chương trình này yêu cầu một dongle phần cứng chống sao chép ở cổng song song
    • Trên dongle vẫn còn mờ logo “Stamford, CT” và “Software Security Inc.”
    • Có in chữ “RUNTIME”, và ý nghĩa của nó được làm rõ ở giai đoạn phân tích sau đó

Phân tích ảnh đĩa và cấu trúc trình biên dịch RPG

  • Trích xuất ảnh đĩa từ hệ thống Windows 98 và chạy trong trình giả lập
    • Tìm thấy hai phiên bản của trình biên dịch RPG II (do Software West Inc. phát triển) cùng với toàn bộ mã nguồn RPG của phần mềm kế toán
    • Hệ thống có dạng menu, gồm nhiều mô-đun RPG và các tệp batch DOS
  • Chính trình biên dịch thực hiện kiểm tra dongle, và cùng routine bảo vệ đó cũng được chèn vào các tệp thực thi được tạo ra

Reverse engineering routine giao tiếp cổng song song

  • Phân tích SEU.EXE bằng trình disassembler Reko
    • Ban đầu không thấy lệnh in/out, nhưng sau đó phát hiện chúng trong một segment khác (0800h)
    • Routine này đọc địa chỉ cổng song song từ vùng dữ liệu BIOS, rồi gửi/nhận dữ liệu qua cổng LPT1
    • Giá trị kết quả được lưu trong thanh ghi BX; không có giá trị đầu vào và luôn trả về cùng một kết quả

Suy luận giá trị hằng và bản vá

  • Ở cuối routine, xác nhận giá trị BH được cố định là 76h
    • Chỉ còn BL là chưa rõ, nên đã duyệt brute-force toàn bộ phạm vi 0~255
    • Tổ hợp đúng được xác nhận là BL=06h, tức BX=7606h
  • Thay 4 byte đầu của routine bằng MOV BX,7606hRETF để vượt qua bước kiểm tra dongle
    • Sau đó chương trình chạy ngay lập tức, và có thể áp dụng cùng chỉnh sửa này cho các tệp thực thi khác có cùng routine

Kết quả và ý nghĩa

  • Phát hiện cùng một đoạn mã chống sao chép trong mọi thành phần của trình biên dịch RPG II, nên có thể sửa đồng loạt
  • Dongle có cấu trúc chỉ đơn giản là trả về một giá trị hằng, nên có thể vô hiệu hóa chỉ với bản vá 4 byte
  • Trình biên dịch sau khi chỉnh sửa vẫn hoạt động bình thường mà không cần dongle, và sau khi loại bỏ dữ liệu cá nhân sẽ được công bố như một kho lưu trữ phần mềm mang giá trị lịch sử
  • Gần như không còn tài liệu trực tuyến nào về Software West Inc., nên tác giả hy vọng có thể liên hệ thêm với những người đã tạo ra nó

1 bình luận

 
GN⁺ 2026-02-02
Ý kiến trên Hacker News
  • Bảo vệ phần mềm thời kỳ đầu thực sự rất đơn giản
    Ngày xưa tôi có đĩa nâng cấp Windows 3.11, và trình cài đặt sẽ thất bại nếu không phát hiện phiên bản trước đó đã được cài
    Cách giải quyết chỉ là tạo một file văn bản trống rồi lưu với tên win.com. Trình cài đặt quét toàn bộ ổ đĩa và chỉ tìm đúng file đó
    Thực ra đĩa nâng cấp đã chứa toàn bộ bộ cài. Thời đó đúng là rất đơn giản

    • Hồi nhỏ, bố tôi mua bản nâng cấp Windows 3.1, trên hộp ghi là “có thể nâng cấp từ phiên bản 3.0 trở xuống”, nhưng thực tế chỉ nhận bản 3.x
      Cuối cùng tôi phải mượn bản 3.x từ một người bạn để cài, và vì nội dung quảng cáo không đúng nên tôi thấy việc đó về mặt đạo đức là chấp nhận được
      Có thể xem ảnh sản phẩm liên quan tại liên kết eBay
  • Tôi phát triển phần mềm cho kỹ thuật xây dựng dân dụng (mes100.com)
    Đến giờ vẫn có người dùng thích dongle phần cứng. Họ cảm thấy yên tâm hơn khi có một thiết bị vật lý cầm nắm được
    Vì tôi bán giấy phép vĩnh viễn nên khi dongle hỏng thì rất phiền, vì không còn linh kiện thay thế. Tôi không thích giấy phép trên đám mây, nhưng nó lại cho phép tạo ra doanh thu dựa trên thuê bao
    Nhưng dù cố gắng thế nào thì bản crack vẫn trôi nổi trên mạng. Tôi cũng không có nguồn lực để xử lý pháp lý, nên việc bảo vệ là bắt buộc

    • Một trong những lý do họ thích loại dongle này là vì môi trường air-gap. Ở những nơi xử lý dữ liệu thiết kế nhạy cảm như quân sự hay điện hạt nhân, việc kết nối với mạng bên ngoài là không thể
      Ngoài ra, một số người đơn giản là thích tính tự chủ khi không phải phụ thuộc vào máy chủ của bên thứ ba
    • Có ý kiến rằng đây là ngành thay đổi chậm về mặt quy định nên ít động lực nâng cấp, vậy thì câu hỏi là tại sao người dùng phải tiếp tục trả tiền
    • Khi bố tôi dùng một chương trình kỹ thuật xây dựng dân dụng tên là ‘Cosmos’, ông cũng dùng kiểu dongle này. Tôi vẫn nhớ việc nó thỉnh thoảng không được nhận diện thật sự rất bực mình
    • Từ góc nhìn người dùng, thái độ “nếu chưa hỏng thì không cần thay” là hoàn toàn hợp lý
      Vì thế mô hình SaaS giống như thảm họa đối với người dùng. Tôi ghét vi phạm bản quyền, nhưng cũng ghét SaaS không kém
  • Ngày trước crack đơn giản hơn nhiều
    Chỉ cần đổi JE hoặc JNE thành JMP là đã có thể vượt qua lớp bảo vệ
    Điều cốt lõi là xác định được mã bảo vệ nằm ở đâu và nó hoạt động thế nào

    • Có nhiều lý do khiến kiểu bảo vệ đơn giản như vậy xuất hiện
      Thứ nhất, nhà phát triển làm việc với đoạn mã đó lâu hơn chúng ta rất nhiều, nên nếu cơ chế bảo vệ quá phức tạp thì sẽ gây khó khăn cho việc sửa lỗi
      Thứ hai, hacker mỗi người chỉ cần biết vài mánh là đủ, còn nhà phát triển thì phải chặn được tất cả các mánh đó
      Thứ ba, chức năng bảo vệ là việc nhàm chán và không được ghi nhận, nên thường thiếu động lực
    • Tôi từng mở một phần mềm demo bằng debugger, và trong memory dump, chuỗi mã kích hoạt vẫn nằm nguyên ở đó
      Tôi nhập nó vào và kích hoạt được ngay. Sau đó tôi đã mua bản chính thức
    • Tôi từng phá được ProLok “laser protection” của dBASE III
      Nó dùng cách ký đĩa mềm bằng laser, nhưng ngay cả một cậu thiếu niên biết đọc assembly cũng có thể phá dễ dàng
      Thậm chí chỉ cần cào đĩa mềm bằng đầu kim là đã có thể sao chép. Cuối cùng đây là một ví dụ mà marketing đi trước công nghệ
  • Tôi từng viết mã RPG II vào thập niên 80, và đến thập niên 90 thì giúp chuyển sang môi trường giả lập S/36
    Chúng tôi dùng sản phẩm của một công ty tên California Software Products, và nó hoạt động khá tốt, đủ để công ty tồn tại cho đến khi người sáng lập nghỉ hưu

  • Trước ý kiến “kiểu chống sao chép này chẳng phải quá đơn giản sao?”, tôi nghĩ vào thời đó đây là mức độ kỹ nghệ phù hợp
    Với emulator và decompiler thì chỉ vài ngày là xử lý xong, nhưng lúc ấy thậm chí còn chưa có những công cụ đó

    • Khách hàng mục tiêu mới là điều quan trọng. Nếu mục tiêu chỉ là ngăn các doanh nghiệp bình thường trong những ngành không mang tính kỹ thuật, thì không cần phải chặn được kỹ sư đảo ngược chuyên nghiệp
    • Decompiler không thể phân tích được mã bảo vệ
      90% phần mềm thời đó thực sự đơn giản như vậy. Không phải người ta bỏ sót thứ gì phức tạp hơn
    • Khoảng năm 2000, tôi từng làm những công việc hack tương tự ở một công ty viễn thông nhỏ tại Buenos Aires. Hầu hết đều có mức độ khó đúng như OP mô tả
    • Công ty IT của chúng tôi cũng bảo vệ bằng cách cung cấp magic number thông qua thao tác dịch bit trên một file nghi vấn. Không cần phải phức tạp
  • Hồi nhỏ tôi từng crack một trò chơi Ultima
    Lý do chỉ là tôi lười phải cho đĩa mềm vào mỗi lần chơi. Mã sẽ tự giải mã và đọc địa chỉ bắt đầu từ một sector cụ thể trên đĩa
    Sector đó không thể sao chép bằng các công cụ copy thông thường, nhưng tôi đã giải quyết bằng cách sửa header của file thực thi

  • Đầu thập niên 90, tôi từng bảo trì một hệ thống gia hạn giấy phép do trụ sở chính của một chuỗi nhượng quyền tự phát triển
    Mỗi tháng phải gia hạn bằng đĩa mềm, và trụ sở đôi khi còn tùy ý chặn những chi nhánh mà họ không thích
    Cuối cùng nhiều chi nhánh liên kết lại để khởi kiện, và tôi đã làm một trình tạo giấy phép trên DOS để mỗi chi nhánh có thể nhận mã qua điện thoại và tự gia hạn
    Sau khi vụ kiện kết thúc, tôi phát hành một bản vá loại bỏ hoàn toàn bước kiểm tra giấy phép. Một ngày nào đó tôi muốn thử chạy lại nó bằng DOSBox

  • Tôi thấy thú vị khi đọc rằng Windows 95 vẫn còn được dùng trong công việc thực tế
    Trái với các xu hướng AI hào nhoáng, ở những mảng nhàm chán của ngành công nghiệp thì thay đổi công nghệ diễn ra rất chậm

    • Tôi từng thấy một công ty vẫn chạy Windows 95 dưới dạng ảo hóa cho đến tận năm 2014. Đó là phần mềm y tế cũ nhưng ổn định đến đáng ngạc nhiên
    • Nhìn ảnh chụp màn hình thì chương trình có vẻ là dành cho DOS. Có lẽ Windows chỉ được dùng đơn thuần cho chia sẻ file
    • Win95 mới chỉ 30 năm tuổi và vẫn có thể chạy trên một số phần cứng hiện đại
      Thậm chí vẫn còn những hệ thống chạy bằng trình giả lập PDP-11
  • Việc phần mềm và phần cứng này vẫn đang được một số doanh nghiệp sử dụng là điều khá ấn tượng
    Vì vậy, việc công khai bản crack có thể mang lại rủi ro pháp lý
    Các doanh nghiệp sẵn sàng trả rất nhiều tiền chỉ để duy trì những hệ thống cũ, nên kiểu vendor lock-in này vẫn tiếp diễn
    Nếu bằng sáng chế hoặc quyền sở hữu trí tuệ vẫn còn hiệu lực, thì nhất định phải kiểm tra trước khi công khai

  • Chỉ là một dongle phần cứng trả về một con số cố định, đúng là cơ chế bảo vệ quá đơn giản
    Nhưng vào thời đó như vậy là đủ. Ngày nay phần mềm doanh nghiệp cũng thường chỉ dùng mức license key tương tự
    Cuối cùng thì đó chỉ là phiên bản của thập niên 80 cho ý tưởng “chỉ cần phát tín hiệu rằng có hóa đơn là người ta sẽ trả tiền”