1 คะแนน โดย GN⁺ 2026-02-02 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • กรณีศึกษาการวิเคราะห์และกู้คืนการทำงานของ ดองเกิลพอร์ตขนาน ที่ คอมไพเลอร์ RPG II สำหรับงานบัญชีในยุค 1990 ต้องใช้
  • ซอฟต์แวร์ต้นฉบับทำงานบน DOS console ในสภาพแวดล้อม Windows 98 และจะไม่ทำงานหากไม่มีดองเกิล
  • หลังย้ายดิสก์อิมเมจไปวิเคราะห์ในอีมูเลเตอร์ พบว่ามีการฝังรูทีนป้องกันการคัดลอกแบบเดียวกันไว้ในไฟล์ปฏิบัติการอย่าง RPGC.EXE และ SEU.EXE
  • จากการวิเคราะห์แอสเซมบลี พบว่ารูทีนนี้ คืนค่าคงที่เดิมเสมอ (7606h) และสามารถข้ามการตรวจสอบดองเกิลได้ด้วยการแพตช์ 4 ไบต์
  • ทำให้ คอมไพเลอร์ RPG II ของ Software West สามารถรันได้แม้ไม่มีดองเกิล นับเป็นผลงานที่มีความหมายในแง่การอนุรักษ์ซอฟต์แวร์คลาสสิก

การค้นพบซอฟต์แวร์บัญชียุคโบราณและดองเกิล

  • ซอฟต์แวร์งานบัญชีที่สร้างบน RPG และถูกใช้งานมานาน 40 ปี ยังคงเดินระบบอยู่บนพีซี Windows 98
    • RPG เป็นภาษาสำหรับคอมพิวเตอร์ระดับมิดเรนจ์อย่าง IBM System/3, System/32, AS/400 และต่อมาถูกพอร์ตมาสู่ MS-DOS
  • โปรแกรมนี้ต้องการ ดองเกิลฮาร์ดแวร์ป้องกันการคัดลอก ที่พอร์ตขนานเมื่อเริ่มทำงาน
    • บนดองเกิลยังมีร่องรอยจาง ๆ ของคำว่า “Stamford, CT” และโลโก้ “Software Security Inc.”
    • มีคำว่า “RUNTIME” แสดงอยู่ ซึ่งภายหลังจึงทราบความหมายจากการวิเคราะห์

การวิเคราะห์ดิสก์อิมเมจและโครงสร้างของคอมไพเลอร์ RPG

  • ดึงดิสก์อิมเมจจากระบบ Windows 98 แล้วนำไปรันในอีมูเลเตอร์
    • พบคอมไพเลอร์ RPG II สองเวอร์ชัน (ผลิตโดย Software West Inc.) และ ซอร์สโค้ด RPG ทั้งหมด ของซอฟต์แวร์บัญชี
    • อยู่ในรูปแบบระบบเมนูที่ประกอบด้วยหลายโมดูล RPG และไฟล์แบตช์ของ DOS
  • ตัวคอมไพเลอร์เองเป็นผู้ตรวจสอบดองเกิล และยังฝังรูทีนป้องกันแบบเดียวกันลงในไฟล์ปฏิบัติการที่สร้างขึ้นด้วย

รีเวิร์สเอนจิเนียริงรูทีนสื่อสารผ่านพอร์ตขนาน

  • วิเคราะห์ SEU.EXE ด้วย Reko disassembler
    • ช่วงแรกไม่พบคำสั่ง in/out แต่ต่อมาพบในเซกเมนต์อื่น (0800h)
    • รูทีนดังกล่าวอ่านที่อยู่พอร์ตขนานจาก BIOS data area และรับส่งข้อมูลผ่านพอร์ต LPT1
    • ค่าผลลัพธ์ถูกเก็บไว้ในรีจิสเตอร์ BX โดยไม่มีค่าอินพุต และคืนผลลัพธ์เดิมเสมอ

การอนุมานค่าคงที่และการแพตช์

  • ที่ส่วนท้ายของรูทีนพบว่าค่า BH ถูกตรึงไว้ที่ 76h
    • เหลือเพียงค่า BL ที่ยังไม่ทราบ และมีการค้นหาแบบ brute force ในช่วง 0~255
    • พบว่าชุดค่าที่ถูกต้องคือ BL=06h หรือก็คือ BX=7606h
  • จึงแทนที่ 4 ไบต์แรกของรูทีนด้วย MOV BX,7606h และ RETF เพื่อข้ามการตรวจสอบดองเกิล
    • หลังจากนั้นโปรแกรมก็เริ่มทำงานได้ทันที และสามารถใช้การแก้ไขแบบเดียวกันกับไฟล์ปฏิบัติการอื่นที่มีรูทีนเดียวกันได้

ผลลัพธ์และความหมาย

  • พบว่าองค์ประกอบทั้งหมดของคอมไพเลอร์ RPG II มี โค้ดป้องกันการคัดลอกชุดเดียวกัน จึงสามารถแก้ไขได้แบบยกชุด
  • ดองเกิลมีโครงสร้างเพียงแค่คืนค่าคงที่ จึง ทำให้ใช้แพตช์เพียง 4 ไบต์ก็ปิดการทำงานได้
  • คอมไพเลอร์ที่แก้ไขแล้วทำงานได้ตามปกติโดยไม่ต้องใช้ดองเกิล และมีแผนจะเผยแพร่เป็น คลังซอฟต์แวร์ประวัติศาสตร์ หลังลบข้อมูลส่วนบุคคลออกแล้ว
  • เนื่องจากแทบไม่เหลือข้อมูลของ Software West Inc. บนออนไลน์ จึงหวังว่าจะได้ติดต่อกับผู้สร้างเพิ่มเติม

1 ความคิดเห็น

 
GN⁺ 2026-02-02
ความเห็นจาก Hacker News
  • ในยุคแรก ๆ ของ การป้องกันซอฟต์แวร์ มันเรียบง่ายมาก
    เมื่อก่อนเคยมีแผ่นอัปเกรด Windows 3.11 ซึ่งตัวติดตั้งจะล้มเหลวถ้าไม่มีเวอร์ชันก่อนหน้าติดตั้งอยู่
    วิธีแก้คือแค่สร้างไฟล์ข้อความเปล่าขึ้นมาแล้วบันทึกชื่อเป็น win.com เพราะตัวติดตั้งสแกนทั้งดิสก์เพื่อหาแค่ไฟล์นั้น
    จริง ๆ แล้วในแผ่นอัปเกรดมีชุดติดตั้งเต็มรวมมาอยู่แล้ว สมัยนั้นมันง่ายมากจริง ๆ

    • ตอนเด็ก ๆ พ่อซื้อ Windows 3.1 เวอร์ชันอัปเกรดมา ซึ่งบนกล่องเขียนว่า “อัปเกรดได้จากเวอร์ชัน 3.0 หรือต่ำกว่า” แต่ในความเป็นจริงมันตรวจเจอแค่ 3.x เท่านั้น
      สุดท้ายเลยต้องยืมเวอร์ชัน 3.x จากเพื่อนมาติดตั้ง และรู้สึกว่า ในทางศีลธรรมก็พอรับได้ เพราะมันไม่ตรงกับที่โฆษณาไว้
      ดูรูปสินค้าที่เกี่ยวข้องได้จาก ลิงก์ eBay
  • ฉันพัฒนาซอฟต์แวร์สำหรับงานวิศวกรรมโยธาอยู่ (mes100.com)
    ทุกวันนี้ก็ยังมีผู้ใช้ที่ชอบ ดองเกิลฮาร์ดแวร์ อยู่ พวกเขาบอกว่าต้องมีอุปกรณ์จริงจับต้องได้ถึงจะสบายใจ
    เนื่องจากขายไลเซนส์แบบถาวร ถ้าดองเกิลพังก็ลำบากเพราะไม่มีอะไหล่ทดแทน ส่วนไลเซนส์คลาวด์นั้นหลายคนไม่ชอบ แต่ก็ทำให้เกิด รายได้แบบสมาชิกสมัครใช้บริการ ได้
    แต่ต่อให้พยายามแค่ไหน เวอร์ชันแคร็กก็ยังหลุดอยู่บนอินเทอร์เน็ต และเพราะไม่มีทรัพยากรจะไปจัดการทางกฎหมาย การป้องกันจึงเป็นสิ่งจำเป็น

    • เหตุผลหนึ่งที่คนยังชอบดองเกิลแบบนี้คือเรื่อง สภาพแวดล้อมแบบ air gap ในงานที่จัดการข้อมูลออกแบบอ่อนไหว เช่น การทหารหรือนิวเคลียร์ จะเชื่อมต่อเครือข่ายภายนอกไม่ได้
      อีกส่วนหนึ่งก็แค่ชอบ ความเป็นอิสระ ที่ไม่ต้องพึ่งเซิร์ฟเวอร์ของบุคคลที่สาม
    • มีคนบอกว่าอุตสาหกรรมที่กฎระเบียบเปลี่ยนช้ามักไม่มีแรงจูงใจให้อัปเกรด ถ้าเป็นแบบนั้นก็อดสงสัยไม่ได้ว่าทำไมผู้ใช้ถึงต้องจ่ายเงินต่อไปเรื่อย ๆ
    • ตอนพ่อใช้โปรแกรมวิศวกรรมโยธาชื่อ ‘Cosmos’ ก็ใช้ดองเกิลแบบนี้เหมือนกัน บางทีก็ตรวจไม่เจอ และยังจำได้ว่า น่าหงุดหงิดมาก
    • จากมุมผู้ใช้ ท่าทีแบบ “ถ้ายังไม่เสียก็ไม่ต้องเปลี่ยน” ถือว่าสมเหตุสมผล
      เพราะงั้น โมเดล SaaS จึงเหมือนหายนะสำหรับผู้ใช้ ฉันไม่ชอบซอฟต์แวร์เถื่อน แต่ก็ไม่ชอบ SaaS เหมือนกัน
  • สมัยก่อนการแคร็กง่ายกว่านี้มาก
    แค่ เปลี่ยน JE หรือ JNE ให้เป็น JMP ก็เลี่ยงการป้องกันได้แล้ว
    หัวใจสำคัญคือการหาให้เจอว่าโค้ดป้องกันอยู่ตรงไหนและทำงานอย่างไร

    • มีหลายเหตุผลที่ทำให้การป้องกันเรียบง่ายแบบนี้เกิดขึ้น
      อย่างแรก นักพัฒนาคลุกกับโค้ดนี้มานานกว่าเรามาก ดังนั้นการป้องกันที่ซับซ้อนเกินไปจะทำให้ แก้บั๊ก ยาก
      อย่างที่สอง แฮ็กเกอร์แต่ละคนจำเป็นต้องรู้แค่กลเม็ดไม่กี่อย่าง แต่ฝั่งนักพัฒนาต้องป้องกันทุกกลเม็ดเหล่านั้น
      อย่างที่สาม ฟีเจอร์ป้องกันเป็นงานที่ไม่น่าสนุกและแทบไม่ได้รับการยอมรับ จึงมี แรงจูงใจต่ำ มาก
    • เคยเปิดซอฟต์แวร์เดโมด้วยดีบักเกอร์ แล้วเจอสตริง รหัสเปิดใช้งาน อยู่ตรง ๆ ใน memory dump
      พอเอาไปกรอกก็กดเปิดใช้งานได้ทันที หลังจากนั้นฉันก็ไปซื้อของจริง
    • เคยเจาะ ProLok “laser protection” ของ dBASE III มาแล้ว
      มันเป็นวิธีเซ็นแผ่นดิสก์ด้วยเลเซอร์ แต่จริง ๆ แล้วแค่ เด็กวัยรุ่น ที่อ่านแอสเซมบลีได้ก็เจาะได้ไม่ยาก
      แถมบางทียังทำสำเนาได้ด้วยการเอาเข็มขูดแผ่นดิสก์เท่านั้นเอง สุดท้ายมันเป็น กรณีที่การตลาดนำหน้าเทคโนโลยี
  • ในยุค 80 ฉันเขียนโค้ด RPG II และในยุค 90 ก็ช่วยงานย้ายไปยังสภาพแวดล้อม emulation ของ S/36
    ใช้ผลิตภัณฑ์ของบริษัทชื่อ California Software Products ซึ่งทำงานได้ดีพอสมควร จนบริษัทดำเนินต่อมาได้จนผู้ก่อตั้งเกษียณ

  • กับคำพูดที่ว่า “วิธีป้องกันการคัดลอกนี้มันง่ายเกินไปหรือเปล่า?” ฉันคิดว่าสำหรับยุคนั้นมันคือ วิศวกรรมที่เหมาะสมกับระดับปัญหา
    ด้วย emulator และ decompiler มันอาจใช้เวลาแค่ไม่กี่วัน แต่ในเวลานั้นแม้แต่เครื่องมือพวกนี้ก็ยังไม่มี

    • กลุ่มลูกค้าเป้าหมายสำคัญมาก ถ้ามีไว้เพื่อกันบริษัททั่วไปในอุตสาหกรรมที่ไม่ใช่สายเทคนิค ก็ไม่จำเป็นต้องกัน วิศวกรย้อนรอยมืออาชีพ
    • decompiler วิเคราะห์โค้ดป้องกันไม่ได้
      ซอฟต์แวร์ 90% ในยุคนั้นง่ายแบบนั้นจริง ๆ ไม่ใช่ว่ามีอะไรซับซ้อนแล้วเครื่องมือพลาดไป
    • ราวปี 2000 เคยทำ งานแฮ็ก คล้ายกันที่บริษัทโทรคมนาคมเล็ก ๆ แห่งหนึ่งในบัวโนสไอเรส ส่วนใหญ่ความยากก็ประมาณที่ OP อธิบาย
    • บริษัทไอทีของเราก็ป้องกันด้วยวิธีให้ magic number จากการเลื่อนไฟล์ต้องสงสัยแบบบิตชิฟต์ ไม่จำเป็นต้องซับซ้อน
  • ตอนเด็ก ๆ เคยแคร็ก เกม Ultima
    เพราะขี้เกียจใส่ฟลอปปีดิสก์ทุกครั้ง ตัวโค้ดถอดรหัสตัวเอง และอ่านที่อยู่เริ่มต้นจากเซกเตอร์เฉพาะบนดิสก์
    เซกเตอร์นั้นคัดลอกด้วยเครื่องมือก๊อบปี้ทั่วไปไม่ได้ แต่แก้ปัญหาได้ด้วยการแก้ executable header

  • ช่วงต้นยุค 90 ฉันดูแลงานบำรุงรักษา ระบบต่ออายุไลเซนส์ ที่สำนักงานใหญ่แฟรนไชส์พัฒนาขึ้นเอง
    แต่ละเดือนต้องต่ออายุผ่านฟลอปปีดิสก์ และสำนักงานใหญ่ก็มักบล็อกสาขาที่ไม่ชอบตามอำเภอใจด้วย
    สุดท้ายหลายสาขารวมตัวกันฟ้องร้อง และฉันก็สร้าง ตัวสร้างไลเซนส์บน DOS เพื่อให้แต่ละสาขาโทรมารับโค้ดแล้วต่ออายุได้
    หลังคดีความจบลง ก็มีการแจกแพตช์ที่ลบการตรวจไลเซนส์ออกทั้งหมด สักวันหนึ่งอยากลองเอามารันอีกครั้งใน DOSBox

  • อ่านเรื่องที่ว่า Windows 95 ยังถูกใช้งานจริงอยู่ก็รู้สึกน่าสนใจ
    ต่างจากกระแส AI สุดหวือหวา เทคโนโลยีใน มุมที่น่าเบื่อของอุตสาหกรรม เปลี่ยนช้ามาก

    • เคยเห็นบริษัทที่ยังรัน Windows 95 แบบ virtualized อยู่จนถึงปี 2014 เป็นซอฟต์แวร์ทางการแพทย์เก่า ๆ ที่ เสถียรจนน่าทึ่ง
    • ถ้าดูจากภาพหน้าจอ โปรแกรมน่าจะเป็นของ DOS มากกว่า บางที Windows อาจถูกใช้แค่เพื่อ แชร์ไฟล์ เท่านั้น
    • Win95 เพิ่งมีอายุแค่ 30 ปีเอง และยังรันได้บนฮาร์ดแวร์สมัยใหม่บางส่วน
      มีแม้กระทั่งระบบที่ยังทำงานอยู่บน emulator ของ PDP-11
  • น่าประทับใจที่ซอฟต์แวร์และฮาร์ดแวร์นี้ยังถูกใช้อยู่ในบางบริษัท
    เพราะแบบนี้การเผยแพร่เวอร์ชันแคร็กจึงอาจมี ความเสี่ยงทางกฎหมาย
    บริษัทต่าง ๆ ยอมจ่ายเงินก้อนโตเพื่อรักษาระบบเก่าเอาไว้ ทำให้ การผูกติดกับผู้ขาย แบบนี้ยังคงอยู่
    ถ้าสิทธิบัตรหรือทรัพย์สินทางปัญญายังมีผลอยู่ ก็ควรตรวจสอบให้แน่ใจก่อนเผยแพร่

  • ดองเกิลฮาร์ดแวร์ที่แค่คืนค่า ตัวเลขคงที่ กลับมานี่เป็นวิธีป้องกันที่ง่ายมากจริง ๆ
    แต่ในยุคนั้นแค่นั้นก็เพียงพอแล้ว ทุกวันนี้ซอฟต์แวร์องค์กรหลายตัวยังใช้แค่ license key คล้าย ๆ กัน
    สุดท้ายมันก็เป็นแนวคิดแบบฉบับยุค 80 ที่ว่า “ถ้าแค่ส่งสัญญาณว่ามีใบแจ้งหนี้อยู่ คนก็จะยอมจ่ายเงิน”