สวัสดีครับ ไม่ได้พบกับเจ้าของบล๊อกกันนานนะครับ ฮาาา (ที่จริงเจอกันใน Facebook ได้นะเออ)
วันนี้ผมจะมาเขียนเรื่องเกี่ยวกับระบบ Anti Cheat ของเกมออนไลน์ที่ใช้อยู่ปัจจุบันครับ ยาวหน่อยนะครับไม่เหมาะสำหรับคนที่โควต้าการอ่านหมดแล้ว (จะสิ้นปีแล้วเนอะ…)
ตามที่สัญญากันไว้ใน FB ว่าจะเขียนบทความเกี่ยวกับเรื่องนี้ ก่อนอื่นเลย มีใครเคยเห็นปัญหาอะไรแบบนี้มั้ย?
– ทำไมมีระบบป้องกันโปร (Anti Cheat) แล้ว โปรถึงยังเกลื่อน?
– ซื้อระบบกันโปรมาตั้งแพง แต่กันไม่เห็นจะได้ผล
– บอทเต็มเซิฟ
– ฯลฯ
ก่อนอื่น เรามาย้อนอดีต ถึงความเป็นมา และนิยามของโปรแกรมที่เรียกว่า Anti Cheat กันก่อนครับ เอาประวัติศาสตร์สั้นๆ พอเนอะ (สาบานมั้ยว่าสั้นแล้ว)
ผมอยู่ในยุคที่เกมออนไลน์ในไทยเพิ่งเริ่มบูมใหม่ๆ สมัยนั้นคงไม่มีใครไม่พูดถึง Mu, Ragnarok เกมชื่อดัง (ซึ่งผมก็ทันเล่นทั้งสองเกม) และก็คงไม่มีใครไม่เคยเห็นไอหน้าจอ nProtect GameGuard ที่เด้งขึ้นมาเกือบทุกเกม เวลาเข้าเกมหรอกใช่มั้ยครับ?
นี่แหละครับ คือระบบ Anti Cheat สมัยแรกๆ เลย เกมออนไลน์ย่อมมากับของคู่กันคือการโกงครับ ซึ่งสมัยนั้น ยังไม่ค่อยมี hacker เก่งๆ มากหรอกครับ เครื่องไม้เครื่องมือก็จำกัด ทำให้การโกงเกม ต่อให้ไม่มี Anti Cheat ก็ทำได้ค่อนข้างยากอยู่แล้วหากเทียบกับสมัยปัจจุบัน
และการป้องกันแบบ Server Side Protection สมัยนั้นก็ยังไม่ค่อยมีตำราสอนเท่าใหร่ และ Server สมัยนั้นก็ไม่ได้แรงมาก เลยจำเป็นต้องโยนการประมวลผลส่วนใหญ่ไว้ที่ Client นั่นแหละครับ ซึ่งมันเป็นจุดอ่อนที่ทำให้เกิดการโกงขึ้นมาได้
จุดนี้ถึงจะทำให้โปรแกรม Anti Cheat ถือกำเนิดขึ้นมาครับ ในยุคสมัยแรกๆ จะเป็นการทำงานแบบโง่ๆ เลย นั่นก็คือ Pattern Scan, Process Name Detection, Window Detection ตามบล๊อกตามแก้กันเป็นงูกินหางอยู่ราวๆ 4-5 ปี จึงเกิดเป็น Generation ใหม่ขึ้นมา คือ Kernel Protection ครับ ป้องกันที่ต้นเหตุคือบล๊อก API ที่ตัวโปรแกรมโกงส่วนใหญ่มักจะใช้เลยครับ (OpenProcess, ReadProcessMemory, WriteProcessMemory) ซึ่งก็ได้ผล โปรแกรมหายไปเยอะอยู่ (แก้ยังไงก็รันไม่ได้ เพราะบล๊อกที่ API Call เลย)
แต่พวก Hacker ก็ไม่ยอมแพ้กันเท่านี้ ในเมื่อแก้โปรแกรมไม่ได้ ก็ Reverse Engineer ถอดระบบป้องกันแม่งออกเลยครับ ง่ายดีมั้ยละ (จริงๆ การถอดระบบป้องกัน มีมาก่อนหน้านี้นานแล้วแหละ)
เดือดร้อนถึง Vendor ต้องหาวิธีแก้ นั่นก็คือ Server Side SDK ซึ่งจะทำให้ Server คอยตรวจสอบ (เรียกว่า Heartbeat) การทำงานของตัวป้องกันฝั่ง client ตลอดเวลา โดยยุคแรกๆ จะทำงานง่ายๆ ประมาณ server จะคอยยิงคำสั่งว่า “เห้ย ยังทำงานอยู่มั้ย” จากนั้น client ก็อาจจะตอบกลับมาว่า “เออ ทำงานอยู่” ครับ แต่ hacker ก็สามารถจำลองการทำงานมันได้ ก็เลยต้องเปลี่ยนมาเป็นโค๊ดลับแทนครับ เช่น Server ยิงคำสั่งมาว่า “Alpha 2 ได้ยินแล้วตอบโค๊ดลับมาด้วย” ส่วน client ก็อาจจะตอบไป “น้ำชาอยู่ในอ่างมีผักชี” ซึ่งการทำแบบนี้ทำให้การ Reverse Engineer ยากขึ้นครับ
ยุคถัดไป ก็จะบล๊อกที่พฤติกรรมโปรแกรม และตรวจจับได้ละเอียดขึ้น เนื่องจากการแฮกเกมในปัจจุบัน ซับซ้อนและตรวจจับยากขึ้นเรื่อยๆ คอยเป็นแมวใล่จับหนูกันอยู่ถึงปัจจุบัน เอาล่ะ เล่าประวัติศาสตร์มาเยอะแล้ว มาเข้าเรื่องหัวข้อเลยดีกว่า
ทำไม Anti Cheat บางเกมกันได้ บางเกมมีแล้วโปรยังเกลื่อน?
ตอบแบบกำปั้นทุบดินก็คง Hacker มันเก่ง แต่จริงๆ มันมีเบื้องหลังเยอะกว่านั้นครับ จากประสบการณ์ที่เป็นทั้งผู้เล่น Hacker และผู้พัฒนาเกมมาแล้ว (และยังคงทำงานเกี่ยวกับเกมต่อไปอีกนาน)
อย่างแรกเลยคือ ผู้พัฒนาเกมไม่เข้าใจถึงคำว่า การโกงเกม ครับ
ใช่ครับ มี Dev ที่งี่เง่าขนาดนี้อยู่จริงๆ นะครับ คุยด้วยแล้วประสาทจะรับประทาน เขาไม่เข้าใจว่าทำไมถึงแฮกเข้ามาได้ และโบ้ยให้ Publisher ไปจัดการกันเอง (ซึ่งที่เกาหลี dev สบาย ใครแฮกเกมแจ้งตำรวจจับพอ) แต่ที่ต่างประเทศมันไม่ใช่แบบนั้น ทำให้เขาไม่สามารถแก้ไขอะไรได้เลย ก็คือโดนแฮก ก็ไม่รู้แล้วว่าควรจะแก้อะไรตรงใหน และป้องกันยังไง
อย่างที่สอง ระบบข้าแข็งแกร่งที่สุดในโลก
Dev ที่คุยด้วยแล้วประสาทจะแดกเป็นอันดับ 2 อีโก้สูงไม่ฟังใคร อันนี้ดีกว่าอันแรกนิดนึงตรงยังเข้าใจว่าการแฮกคืออะไร และพยายามป้องกัน แต่ป้องกันด้วยโค๊ดโง่ๆ 2-3 บรรทัด แล้วมาโม้ว่าระบบข้าแข็งแกร่งที่สุดในโลก ไม่มีใครหน้าใหนสามารถแฮกเกมข้าได้ CBT ไม่ถึงชั่วโมง โปรเดินเกลื่อนเมือง dev พวกนี้ถึงกับไปไม่เป็น แล้วก็แก้ไม่ได้ แล้วก็โบ้ยไป Anti Cheat เมิงกากเอง ส่วน AC โบ้ยมาที่ dev ว่า Server เมิงมีช่องโหว่ แก้ซะสิ โบ้ยกันไปๆ มาๆ ไม่จบซักที
อธิบายให้เข้าใจนิดนึง ว่าการ Reverse Engineer เกมคือการแปลง Machine Code ให้กลับมาเป็นระบบ Assembly เพื่อให้คนสามารถอ่านเข้าใจได้ ซึ่งถ้าคนเรียน x86 Instruction มานิดหน่อย ก็สามารถแกะไฟล์ .exe .dll ได้แล้วครับ ซึ่ง dev 2 จำพวกนี้จะเข้าใจว่าเมื่อ Build เป็น .exe แล้ว จะไม่สามารถทำอะไรได้เพราะ Source Code อยู่ที่ตัวเอง ซึ่งเป็นความเข้าใจที่ผิดมากๆๆ ยิ่งโปรแกรมสมัยใหม่ แปลงกลับได้ใกล้เคียง Source Code มากๆ เลยครับ (IDA Pro + HexRays) ซึ่งการป้องกันโปรอย่างได้ผลนั้น คือการประมวลผลผลการกระทำของ User ที่ฝั่ง Server และ Re-Check ทุกอย่างที่ user ส่งมาทุกครั้งว่ามีอะไรแปลกปลอม ผิด Logic ของเกมมั้ย ซึ่งส่วนนี้ dev ส่วนใหญ่จะทำไม่เป็นครับ
อย่างที่สาม ผู้ให้บริการ / Dev ไม่คิดจะสนใจ
ตามหัวข้อครับ don’t give a fu*k ไม่สนใจห่านอะไรทั้งสิ้น แฮกมาหรอ ตามสบาย…
ยกตัวอย่างมาแค่นี้พอละกัน หลักๆ เกมที่ป้องกันโปรได้ผลที่ผมเห็นคือ dev เขาจะเก่งมาก เมื่อเจอโปรเจาะ server มาก็ส่งไปบล๊อกให้โปรเข้าไม่ได้ (ชั่วคราว) เพราะเขารู้ว่ายังไงทาง Hacker ก็กลับเข้ามาได้อยู่แล้ว เวลาระหว่างนั้น dev ก็แก้ไขป้องกันการเจาะทั้ง client และ server ก็จะทำให้โปรพวกนี้หายไปได้อย่างถาวรเลย
การป้องกันให้ได้ผล หลักๆ คือทั้ง Dev และ Publisher ควรจะเข้าใจขอบเขตการทำงานของโปรแกรม Anti Cheat ว่ามันมีข้อจำกัดครับ มันไม่ได้ป้องกันตัว Server จากการโดนยิง (บางทีเซิฟโดนยิง โบ้ยไป AC ก็มี) มันป้องกันแค่การเอาโปรแกรมแปลกปลอม การแก้ไขค่าใน Memory ตัวเกม และ Reverse Engineer เท่านั้นเอง
ป.ล เข้าใจว่าอาจจะงงๆ อะไรบ้าง เพราะย่อไปซะเยอะ คอมเม้นถามได้เลยครับ จะพยายามมาตอบให้ครับ 😛