- กรณีศึกษาการวิเคราะห์และกู้คืนการทำงานของ ดองเกิลพอร์ตขนาน ที่ คอมไพเลอร์ 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 ความคิดเห็น
ความเห็นจาก Hacker News
ในยุคแรก ๆ ของ การป้องกันซอฟต์แวร์ มันเรียบง่ายมาก
เมื่อก่อนเคยมีแผ่นอัปเกรด Windows 3.11 ซึ่งตัวติดตั้งจะล้มเหลวถ้าไม่มีเวอร์ชันก่อนหน้าติดตั้งอยู่
วิธีแก้คือแค่สร้างไฟล์ข้อความเปล่าขึ้นมาแล้วบันทึกชื่อเป็น
win.comเพราะตัวติดตั้งสแกนทั้งดิสก์เพื่อหาแค่ไฟล์นั้นจริง ๆ แล้วในแผ่นอัปเกรดมีชุดติดตั้งเต็มรวมมาอยู่แล้ว สมัยนั้นมันง่ายมากจริง ๆ
สุดท้ายเลยต้องยืมเวอร์ชัน 3.x จากเพื่อนมาติดตั้ง และรู้สึกว่า ในทางศีลธรรมก็พอรับได้ เพราะมันไม่ตรงกับที่โฆษณาไว้
ดูรูปสินค้าที่เกี่ยวข้องได้จาก ลิงก์ eBay
ฉันพัฒนาซอฟต์แวร์สำหรับงานวิศวกรรมโยธาอยู่ (mes100.com)
ทุกวันนี้ก็ยังมีผู้ใช้ที่ชอบ ดองเกิลฮาร์ดแวร์ อยู่ พวกเขาบอกว่าต้องมีอุปกรณ์จริงจับต้องได้ถึงจะสบายใจ
เนื่องจากขายไลเซนส์แบบถาวร ถ้าดองเกิลพังก็ลำบากเพราะไม่มีอะไหล่ทดแทน ส่วนไลเซนส์คลาวด์นั้นหลายคนไม่ชอบ แต่ก็ทำให้เกิด รายได้แบบสมาชิกสมัครใช้บริการ ได้
แต่ต่อให้พยายามแค่ไหน เวอร์ชันแคร็กก็ยังหลุดอยู่บนอินเทอร์เน็ต และเพราะไม่มีทรัพยากรจะไปจัดการทางกฎหมาย การป้องกันจึงเป็นสิ่งจำเป็น
อีกส่วนหนึ่งก็แค่ชอบ ความเป็นอิสระ ที่ไม่ต้องพึ่งเซิร์ฟเวอร์ของบุคคลที่สาม
เพราะงั้น โมเดล SaaS จึงเหมือนหายนะสำหรับผู้ใช้ ฉันไม่ชอบซอฟต์แวร์เถื่อน แต่ก็ไม่ชอบ SaaS เหมือนกัน
สมัยก่อนการแคร็กง่ายกว่านี้มาก
แค่ เปลี่ยน JE หรือ JNE ให้เป็น JMP ก็เลี่ยงการป้องกันได้แล้ว
หัวใจสำคัญคือการหาให้เจอว่าโค้ดป้องกันอยู่ตรงไหนและทำงานอย่างไร
อย่างแรก นักพัฒนาคลุกกับโค้ดนี้มานานกว่าเรามาก ดังนั้นการป้องกันที่ซับซ้อนเกินไปจะทำให้ แก้บั๊ก ยาก
อย่างที่สอง แฮ็กเกอร์แต่ละคนจำเป็นต้องรู้แค่กลเม็ดไม่กี่อย่าง แต่ฝั่งนักพัฒนาต้องป้องกันทุกกลเม็ดเหล่านั้น
อย่างที่สาม ฟีเจอร์ป้องกันเป็นงานที่ไม่น่าสนุกและแทบไม่ได้รับการยอมรับ จึงมี แรงจูงใจต่ำ มาก
พอเอาไปกรอกก็กดเปิดใช้งานได้ทันที หลังจากนั้นฉันก็ไปซื้อของจริง
มันเป็นวิธีเซ็นแผ่นดิสก์ด้วยเลเซอร์ แต่จริง ๆ แล้วแค่ เด็กวัยรุ่น ที่อ่านแอสเซมบลีได้ก็เจาะได้ไม่ยาก
แถมบางทียังทำสำเนาได้ด้วยการเอาเข็มขูดแผ่นดิสก์เท่านั้นเอง สุดท้ายมันเป็น กรณีที่การตลาดนำหน้าเทคโนโลยี
ในยุค 80 ฉันเขียนโค้ด RPG II และในยุค 90 ก็ช่วยงานย้ายไปยังสภาพแวดล้อม emulation ของ S/36
ใช้ผลิตภัณฑ์ของบริษัทชื่อ California Software Products ซึ่งทำงานได้ดีพอสมควร จนบริษัทดำเนินต่อมาได้จนผู้ก่อตั้งเกษียณ
กับคำพูดที่ว่า “วิธีป้องกันการคัดลอกนี้มันง่ายเกินไปหรือเปล่า?” ฉันคิดว่าสำหรับยุคนั้นมันคือ วิศวกรรมที่เหมาะสมกับระดับปัญหา
ด้วย emulator และ decompiler มันอาจใช้เวลาแค่ไม่กี่วัน แต่ในเวลานั้นแม้แต่เครื่องมือพวกนี้ก็ยังไม่มี
ซอฟต์แวร์ 90% ในยุคนั้นง่ายแบบนั้นจริง ๆ ไม่ใช่ว่ามีอะไรซับซ้อนแล้วเครื่องมือพลาดไป
ตอนเด็ก ๆ เคยแคร็ก เกม Ultima
เพราะขี้เกียจใส่ฟลอปปีดิสก์ทุกครั้ง ตัวโค้ดถอดรหัสตัวเอง และอ่านที่อยู่เริ่มต้นจากเซกเตอร์เฉพาะบนดิสก์
เซกเตอร์นั้นคัดลอกด้วยเครื่องมือก๊อบปี้ทั่วไปไม่ได้ แต่แก้ปัญหาได้ด้วยการแก้ executable header
ช่วงต้นยุค 90 ฉันดูแลงานบำรุงรักษา ระบบต่ออายุไลเซนส์ ที่สำนักงานใหญ่แฟรนไชส์พัฒนาขึ้นเอง
แต่ละเดือนต้องต่ออายุผ่านฟลอปปีดิสก์ และสำนักงานใหญ่ก็มักบล็อกสาขาที่ไม่ชอบตามอำเภอใจด้วย
สุดท้ายหลายสาขารวมตัวกันฟ้องร้อง และฉันก็สร้าง ตัวสร้างไลเซนส์บน DOS เพื่อให้แต่ละสาขาโทรมารับโค้ดแล้วต่ออายุได้
หลังคดีความจบลง ก็มีการแจกแพตช์ที่ลบการตรวจไลเซนส์ออกทั้งหมด สักวันหนึ่งอยากลองเอามารันอีกครั้งใน DOSBox
อ่านเรื่องที่ว่า Windows 95 ยังถูกใช้งานจริงอยู่ก็รู้สึกน่าสนใจ
ต่างจากกระแส AI สุดหวือหวา เทคโนโลยีใน มุมที่น่าเบื่อของอุตสาหกรรม เปลี่ยนช้ามาก
มีแม้กระทั่งระบบที่ยังทำงานอยู่บน emulator ของ PDP-11
น่าประทับใจที่ซอฟต์แวร์และฮาร์ดแวร์นี้ยังถูกใช้อยู่ในบางบริษัท
เพราะแบบนี้การเผยแพร่เวอร์ชันแคร็กจึงอาจมี ความเสี่ยงทางกฎหมาย
บริษัทต่าง ๆ ยอมจ่ายเงินก้อนโตเพื่อรักษาระบบเก่าเอาไว้ ทำให้ การผูกติดกับผู้ขาย แบบนี้ยังคงอยู่
ถ้าสิทธิบัตรหรือทรัพย์สินทางปัญญายังมีผลอยู่ ก็ควรตรวจสอบให้แน่ใจก่อนเผยแพร่
ดองเกิลฮาร์ดแวร์ที่แค่คืนค่า ตัวเลขคงที่ กลับมานี่เป็นวิธีป้องกันที่ง่ายมากจริง ๆ
แต่ในยุคนั้นแค่นั้นก็เพียงพอแล้ว ทุกวันนี้ซอฟต์แวร์องค์กรหลายตัวยังใช้แค่ license key คล้าย ๆ กัน
สุดท้ายมันก็เป็นแนวคิดแบบฉบับยุค 80 ที่ว่า “ถ้าแค่ส่งสัญญาณว่ามีใบแจ้งหนี้อยู่ คนก็จะยอมจ่ายเงิน”