ฉันจะป้องกันการรายงานคะแนนผิดพลาดไปยังตารางคะแนนสูงสุดทั่วโลกได้อย่างไร


44

เบราว์เซอร์และเกมบนมือถือมักมีตารางคะแนนสูงสุดทั่วโลก นอกจากนี้ยังเป็นเรื่องธรรมดาสำหรับตารางเหล่านั้นที่จะมีคะแนน 2,147,483,647 คนที่คิดว่าการโทรทางเว็บเซอร์นั้นจะรายงานคะแนนและใช้เพื่อบันทึกคะแนนที่สมมติขึ้น

สำหรับเกมไขปริศนาง่ายๆเราสามารถป้องกันสิ่งนี้ได้โดยการรวมบันทึกการเคลื่อนไหวทุกครั้งที่ผู้เล่นทำ (และเมล็ดสุ่มที่ใช้ในการสร้างระดับ) ด้วยการเรียกคะแนนรายงาน เกมทั้งหมดนั้นสามารถทำซ้ำและตรวจสอบบนเซิร์ฟเวอร์

อย่างไรก็ตามสิ่งนี้กลายเป็นสิ่งที่ไม่สามารถทำได้อย่างรวดเร็วสำหรับสิ่งที่ใหญ่กว่า Pac-man

การโกงแบบนี้สามารถป้องกันได้อย่างไร


ฉันมีคำถามเดียวกันนี้เกี่ยวกับเกม iPhone โดยใช้เทคนิคเดียวกันเพื่อสร้างตารางคะแนนสูงสุดทั่วโลก
deft_code

คุณแน่ใจหรือไม่ว่าจะเป็นไปไม่ได้ที่จะส่งเล่นซ้ำ
o0 '

ใช่ฉันแน่ใจ. :)
teedyay

คำตอบ:


9

ระบบภายในที่เราใช้สำหรับ Moblox (แทนที่ภายหลังด้วย OpenFeint) ทำงานเช่นนี้:

  • ส่งข้อความ JSON ผ่าน HTTP ธรรมดา (ไม่ใช่ HTTPS) รวมแฮช MD5 ของทุกฟิลด์พร้อมด้วยสายเวทย์
  • บนเซิร์ฟเวอร์ตรวจสอบความสมบูรณ์ของข้อความด้วยการดำเนินการเดียวกัน

ในการถอดรหัสระบบคุณจะต้องค้นหาสายเวทย์มนตร์นี้ เป็นไปได้ด้วยวิศวกรรมย้อนกลับ แต่เจ็บปวด

OpenFeint, ScoreLoop และ CocosLive ทั้งหมดใช้เคล็ดลับเดียวกัน แต่ใช้ HTTPS ใช้งานง่ายมาก


29
ฉันค่อนข้างสงสัยว่าวิศวกรรมย้อนกลับเพื่อค้นหาสายเวทย์มนตร์ของคุณจะเป็นเรื่องยาก
Kylotan

4
นี่เป็นแอปพลิเคชัน Android ในภาษา C ++ ไม่มีสัญลักษณ์หรือดีบั๊กที่ใช้ได้ ดังนั้นคุณสามารถอ่านรหัส ARM ได้ แต่ไม่สามารถติดตามได้อย่างง่ายดาย คีย์ประกอบด้วยการดำเนินการหลายอย่างดังนั้นการค้นหาสตริงทั้งหมดไม่เพียงพอ นั่นไม่สมบูรณ์แบบ แต่ค่อนข้างเจ็บปวด
เอลลิส

3
แบบฝึกหัดระดับปริญญาตรีมาตรฐานอย่างน้อยในมหาวิทยาลัยของสหรัฐอเมริกาคือการใช้รหัสผ่านแบบวิศวกรรมย้อนกลับที่สร้างขึ้นตามที่คุณอธิบายโดยการอ่านรหัสประกอบy86 ( cgi2.cs.rpi.edu/~hollingd/comporg-spring2007/notes/Y86/… )

12
นี่เป็นเทคนิคที่อ่อนแออย่างมากซึ่งจะให้ความปลอดภัยแก่ผู้พัฒนาอย่างมาก
o0 '

2
นี่เป็นตัวอย่างที่ดีมากสำหรับen.wikipedia.org/wiki/Security_through_obscurity
kaoD

21

ในขณะที่คุณพูดถูกว่าเป็นไปไม่ได้ที่จะส่งการเล่นซ้ำทั้งหมดไปยังเซิร์ฟเวอร์สำหรับเกมที่ซับซ้อน แต่ระบบที่คล้ายกันสามารถใช้งานได้โดยให้เซิร์ฟเวอร์เป็นระยะ เกมกำลังเล่น

ตัวอย่างเช่นใน FPS ทุกนาทีคุณสามารถถาม "คุณมีฆ่ากี่คน?", "ศัตรูทุกคนอยู่ที่ไหน?" ฯลฯ หากลูกค้าไม่กลับมาพร้อมกับคำตอบที่เหมาะสมในการท้าทายใน จำนวนเวลาที่เหมาะสมพวกเขาจะโกง

แน่นอนว่าจะใช้งานได้เฉพาะเมื่อเกมออนไลน์ระหว่างช่วงการเล่นทั้งหมด เนื่องจากเป้าหมายที่นี่คือสามารถอัพโหลดไปยังกระดานผู้นำออนไลน์ฉันคิดว่ามันสมเหตุสมผล - อย่าเตะผู้เล่นออกจากเกมหากพวกเขาตอบผิดก็อย่าปล่อยให้พวกเขาอยู่ในรายการคะแนน

ฉันขอแนะนำให้คุณพิจารณาส่งการเล่นซ้ำอย่างไรก็ตาม สิ่งที่คุณต้องการจริงๆคือเมล็ดสุ่มเริ่มต้นและอินพุตที่ประทับเวลา นี่ควรจะเป็นไม่กี่ร้อย KB จริง ๆ เกมอาร์เคดจำนวนมากทำเช่นนี้แล้วเพื่อบันทึกรีเพลย์เพื่อวัตถุประสงค์ในการตรวจสอบผู้เล่น; มีเซิร์ฟเวอร์ของคุณตรวจสอบเหล่านี้อาจไม่สำคัญ แต่จะป้องกันการโกงทุกชนิดยกเว้นบอท


10

คุณสามารถ จำกัด การละเมิดที่เห็นได้ชัดที่สุดโดยการตรวจสอบผลลัพธ์สูงสุดในตารางคะแนนสูงสุด ขึ้นอยู่กับเกมของคุณคุณอาจมี "คะแนนสมบูรณ์แบบ" ด้านบนซึ่งคะแนนใด ๆ จะต้องเป็นการฉ้อโกง ถ้าไม่คุณสามารถคำนวณ "คะแนนที่เป็นไปไม่ได้" ต่ำสุด ผู้เล่นสามารถยิง 10 นัดต่อวินาทีเกมใช้เวลา 1 นาทีและศัตรูที่ถูกฆ่าแต่ละคนมีค่า 100 คะแนน? ดังนั้นคะแนนใด ๆ ที่สูงกว่า 60,000 จะต้องเป็นการฉ้อโกง

คุณสามารถช่วยบรรเทาปัญหาด้วยการส่งเมทาดาทาไปบางส่วน ไม่ใช่ประวัติเกมเต็มตามที่คุณอธิบาย แต่เป็นเพียงส่วนประกอบที่ประกอบขึ้นเป็นคะแนน พูดว่า: คะแนน 60000, 500 ศัตรูที่ถูกฆ่าตายและหนึ่งรายการโบนัสคว้า จากนั้นคุณสามารถทำการตรวจสอบง่าย ๆ นี่คือ "ความปลอดภัยผ่านความสับสน" และดังนั้นจึงไม่ปลอดภัยเลย แต่มันช่วยกำจัดผู้โจมตีที่ไร้เดียงสาที่สุด


คุณยังสามารถตั้งค่าสถานะผู้ใช้ (อาจเป็น IP) หากพวกเขาส่งคะแนนที่ไม่ตรงกับข้อมูลเมตา จากนั้นหากพวกเขาลองและส่งคะแนนอีกครั้งซึ่งมีข้อมูลเมตาที่ถูกต้องคุณสามารถตรวจสอบได้และอาจห้ามพวกเขาทั้งหมด นอกจากนี้คุณยังสามารถที่จะส่งข้อความกลับหน้าด้านจากที่นั่นส่งคำขอคะแนน :)
อดัมฮาร์ท

ฉันคิดว่าคำตอบนี้ดีกว่าคำตอบที่ยอมรับ เพียงแค่ค้นหาว่าผู้เล่นของคุณสามารถบรรลุจำนวนสูงสุดเท่าใด อะไรที่สูงกว่าเพียงแค่ทิ้ง

6
ดังนั้นหากผู้เล่นคนหนึ่งที่ไปที่กลโกงของมหาวิทยาลัยทุกคนในเครือข่ายตอนนี้เป็น "สิบแปดมงกุฎ"
AttackHobo

6

ในที่สุดคุณสามารถแยกแยะคะแนนที่สูงอย่างไม่น่าเป็นไปได้เพราะส่วนที่เหลือเป็นเพียงความไม่น่าเชื่อและอาจเป็นผู้เล่นที่ถูกต้องตามกฎหมาย

มิฉะนั้นคุณต้องพึ่งพาเทคนิคการทำให้งงงวย (เช่นการเข้ารหัสและการส่งสถิติอื่น ๆ นอกเหนือจากคะแนนเพียง)

คุณสามารถส่งคะแนนเป็นระยะ ๆ ขณะที่เกมกำลังเล่นซึ่งจะเพิ่มระดับความซับซ้อนในการโกง - นั่นคือเซิร์ฟเวอร์สามารถตัดสินใจได้ว่าเกมนี้เล่นมานานพอที่จะรับประกันคะแนนเฉพาะหรือไม่และให้แน่ใจว่ามีรายงานระดับกลางเพียงพอ ได้รับในช่วงเวลาเล่น (แค่อย่าทำให้ 100% หรือรถไฟเข้าไปในอุโมงค์ระหว่างทางกลับบ้านจะทำให้ฉันขว้างโทรศัพท์ออกไปนอกหน้าต่าง)

ในที่สุดใครบางคนจะหาทางทำลายมันดังนั้นอย่าฆ่าตัวตายพยายามหยุดพวกเขา


6

ฉันเพิ่มตารางคะแนนสูง / สกปรกอย่างรวดเร็วในโครงการของฉันสักครู่และไม่ได้มีความเชี่ยวชาญในการรักษาความปลอดภัยอินเทอร์เน็ต / ฯลฯ มันกลับกลายเป็นข้อบกพร่องทั้งหมด น่าประหลาดใจที่มีเกือบ 1,200,000 คะแนนที่บันทึกไว้ฉันอาจมีเพียง 5 หรือ 6 ครั้งของการทำคะแนนที่ไม่ถูกต้องอย่างโจ่งแจ้งถึงจุดสูงสุดของกระดาน คะแนนส่วนใหญ่ดูเหมือนความผิดพลาดในเกมมากกว่า "แฮ็ค" ที่แท้จริง

ดังนั้นฉันคิดว่าประเด็นสำคัญคือ: ตรวจสอบให้แน่ใจว่าระบบการให้คะแนนเกมของคุณนั้นมีการปิดบังอากาศหรืออย่างน้อยก็ทำการตรวจสอบความเป็นไปได้ของคะแนนที่ดีจริงๆ ตอนนี้เกมนี้ที่ฉันพูดถึงเป็นเกม Ludum Dare 48hr ดังนั้นมันจึงไม่ใช่สิ่งที่มีเสถียรภาพมากที่สุด .. แต่โดยรวมฉันคิดว่ามันมักจะเป็นไปได้มากกว่าที่ผู้เล่นทั่วไปจะค้นพบ / ใช้ประโยชน์จากความผิดพลาดในเกมมากกว่า มีคนที่ "แฮ็ค" กระดานผู้นำโดยตรง

ที่กล่าวว่าฉันกำลังทำงานในการเขียนของโครงการนี้ในขณะนี้และฉันจะออกไปด้วยความงุนงง ฉันจะไม่ลงรายละเอียดมากเกินไป แต่โดยทั่วไปฉันมีคะแนนทั้งหมดส่งค่าคีย์ตามค่าสุ่มและ hashing และสตริงมายากลจากนั้นคะแนนใด ๆ ที่ผ่านการตรวจสอบนั้นและสูงพอที่จะทำให้เป็นจริง " ลีดเดอร์ X อันดับต้น ๆ จะต้องผ่านการตรวจสอบอีกรอบ (ในครั้งนี้ด้วยค่าคีย์ที่หมดอายุซึ่งสร้างขึ้นที่ส่วนท้ายของเซิร์ฟเวอร์และการตรวจสอบสิทธิ์อย่างละเอียดยิ่งขึ้น)

ฉันยังแนะนำให้ใช้ตัวติดตามแพ็คเก็ตของการเรียงลำดับบางอย่างเพื่อทดสอบว่าสิ่งใดที่มองเห็นได้ (แต่เดิมฉันทำการยืนยันที่ง่ายกว่าซึ่งหมายความว่ามีใครบางคนสามารถใช้ตัวติดตามแพ็คเก็ตเพื่อค้นหาและทำซ้ำคำขอ http ของคะแนนที่อัปโหลด สตริงมายากลหรืออะไรก็ตาม (หมายความว่าคุณต้องการคะแนนที่ถูกต้องก่อน แต่คุณสามารถส่งคะแนนซ้ำได้มากเท่าที่คุณต้องการ .. )) ฉันใช้Wiresharkเพื่อทดสอบสิ่งนี้

นี่มันยาวไปหน่อย แต่หวังว่ามันจะช่วย ...


แน่นอนคือ ดูเหมือนกัญชาที่เค็มเป็นวิธีที่ดีที่จะไป ฉันไม่ได้พิจารณาว่าพวกเขาต้องการส่งคะแนนที่ถูกต้องซ้ำหลายครั้ง GUID และการประทับเวลาที่รวมอยู่ในแพ็คเก็ต (และในแฮช) ควรจะจ่ายให้ - ฉันสามารถตรวจสอบการหลอกบนเซิร์ฟเวอร์ ขอขอบคุณ.
teedyay

3

ฉันไม่ใช่ผู้เชี่ยวชาญในสาขานี้ แต่ถ้าฉันเป็นคุณฉันจะพยายามเข้ารหัสคะแนนด้วยรหัสที่ฝังอยู่ในรหัสของคุณ คนเหล่านั้นจะต้องนำวิศวกรรมย้อนกลับมาใช้กับรหัสของคุณแทนที่จะเป็นข้อความธรรมดาที่ใช้สำหรับบริการเว็บ


2
ฉันจะไปอีกหนึ่ง สร้างแฮชจากรหัสโดยการแฮชไฟล์ exe (หรือบางส่วน) เมื่อส่งคะแนนให้ส่งหมายเลขรุ่นและเซิร์ฟเวอร์สามารถตรวจสอบได้โดยใช้ตารางที่มีค่าคงที่แบบง่ายหมายเลข -> รหัสแฮช จากนั้นคุณจะได้รับโบนัสเพิ่มเติมว่าหากมีคนโกงโดยการปรับเปลี่ยนโปรแกรมคะแนนสูงของเขาจะไม่นับ
กำหนดค่า

7
หากใครบางคนกำลังปรับเปลี่ยนโปรแกรมพวกเขาสามารถส่งคีย์ใดก็ได้ที่พวกเขาต้องการ

2
@Joe Wreschnig พวกเขาสามารถส่งคีย์ใด ๆ ที่พวกเขาต้องการ แต่เซิร์ฟเวอร์ควรตั้งให้ยอมรับเฉพาะคีย์ที่ถูกต้องเท่านั้น
AttackHobo

5
ฉันคิดว่าประเด็นของโจคือพวกเขาไม่จำเป็นต้องใช้แฮชของโปรแกรมที่เพิ่งปรับปรุงใหม่ แต่สามารถส่งแฮชก่อนหน้านี้ได้
Kylotan

1
@ gd1: นั่นช่วยได้อย่างไร
Kylotan

1

Speedruns นั้นทำการบันทึกการกดแป้นทุกครั้งและพวกเขากำลังบันทึกเกี่ยวกับเกมทั้งหมด ดังนั้นใช่คุณสามารถบันทึกเกมทั้งหมดมันไม่ได้เป็นไปไม่ได้ ใด ๆวิธีอื่นที่จะทำคือ crackable ผ่านทางวิศวกรรมย้อนกลับ (ฉันไม่สามารถความเครียดมันพอ: คุณไม่ได้เพิ่มการรักษาความปลอดภัยคุณกำลังเพิ่มความสับสน)

ถึงแม้ว่าคุณจะทำเช่นนี้ด้วยวิธีที่พวกเขาสามารถส่ง speedrun ได้ คุณไม่สามารถทำอะไรเพื่อป้องกันสิ่งนั้น


2
โดยปกติแล้วการเล่นไม่ใช่การบันทึกเป็นส่วนที่ไม่สามารถใช้ได้สำหรับเซิร์ฟเวอร์ ถ้าลูกค้าเล่นเกมมาสองสามชั่วโมงการ resimulation ฝั่งเซิร์ฟเวอร์อาจใช้เวลาหลายนาทีของ CPU หรือแย่กว่านั้น ไม่เป็นที่ยอมรับหากคุณมีคนส่งคะแนนจำนวนมาก

2
ขนาดของแพ็กเก็ตข้อมูลจะกลายเป็นปัญหาสำหรับเกมมือถือโดยเฉพาะอย่างยิ่งหากผู้เล่นจ่ายค่าแบนด์วิดท์เป็นไบต์
teedyay

โอ้สิ่งที่คุณทั้งคู่พูดว่าเป็นความจริง ยังไม่มีวิธีแก้ปัญหา "ของจริง" อื่น ๆ
o0 '

11
คุณไม่จำเป็นต้องตรวจสอบความถูกต้องของการบันทึกทุกครั้งที่ส่งคุณเพียงแค่ต้องตรวจสอบความถูกต้องของสิ่งที่บันทึกไว้ด้านบน 10. ไม่มีการโกงจุดที่จะกลายเป็น # 11 และคุณไม่ต้องทำแบบเรียลไทม์ กระบวนการแบทช์เป็นงวดจะไม่เป็นไร
สีเทา

@teedyay สมมติว่าผู้เล่นทำการเฉลี่ย 5 การกระทำต่อวินาทีและการกระทำแต่ละอย่างสามารถอธิบายได้อย่างสมบูรณ์ใน 32 บิต นั่นคือ 20 ไบต์ต่อวินาทีหรือ 72 kB ต่อชั่วโมง ราคาข้อมูลมือถือทั่วไปในสหรัฐอเมริกาอยู่ที่ $ 10 ต่อ GB หรือ 1 cent ต่อ 1,000 kB
Damian Yerrick

1

ในขณะที่คุณอยู่ที่นั่นมีคำถามว่าคะแนนสูงเป็นเพียงผู้เล่นที่พบว่ามีการใช้ประโยชน์ (ตัวอย่างเช่นถ้าบางสิ่งบางอย่างในเกมให้คะแนนโทษและข้อผิดพลาดทำให้คะแนนลบเพื่อ "ล้อมรอบ" ที่จะกลายเป็นบวกอย่างมาก ... หรือเพียงแค่ผู้เล่นที่พบสภาพเกมบางอย่างเช่นจุดที่ปลอดภัยบนกระดานที่พวกเขาสามารถนั่งที่นั่นและไม่ต้องกังวลเกี่ยวกับการสูญเสียอย่างไม่มีกำหนด)

เพื่อบอกความแตกต่างระหว่างการแฮ็คและการใช้ประโยชน์จากเกมการอัปโหลดอย่างน้อยข้อมูลการเล่นบางอย่างจะดี มันจะช่วยให้คุณแก้ไขการหาประโยชน์ได้อย่างน้อยที่สุด

สำหรับเกมบางเกม (โดยเฉพาะเกมเทิร์นเบส) คุณสามารถเล่นเกมผ่านเซิร์ฟเวอร์ได้โดยที่ตรรกะของเกมทั้งหมดอยู่ที่ฝั่งเซิร์ฟเวอร์และไคลเอนต์เป็นเพียงส่วนต่อประสาน สิ่งนี้ไม่เพียง แต่จะทำให้การแฮ็คคะแนนมากขึ้น แต่ยังช่วยให้คุณสามารถบันทึกการกระทำของผู้เล่นทั้งหมดบนเซิร์ฟเวอร์ได้เล็กน้อยและเล่นเกมใหม่ได้ตลอดเวลา ฉันตระหนักถึงสิ่งที่เป็นเหมือนนักเล่นแอคชั่นกระตุกนี่อาจเป็นไปไม่ได้


1

สร้างจุดกำเนิดแบบสุ่มทั้งหมดจากเมล็ดเดียวและเก็บอินพุตสำหรับทุกเฟรม เมื่อใดก็ตามที่คุณมีคะแนนสูงที่อ้างสิทธิ์ (พูดติด 50 อันดับแรก) ส่งเมล็ดพันธุ์และอินพุตแบบเต็มไปยังเซิร์ฟเวอร์ เล่นเกมบนเซิร์ฟเวอร์ซ้ำและอัปเดตกระดานแต้มนำถ้าคุณได้คะแนนสูง

หากคุณพิจารณาว่าสิ่งนี้เป็นไปไม่ได้สำหรับเกมที่มีความซับซ้อนมากขึ้นเนื่องจากขนาดของคำขอให้ดูตัวอย่างนี้

สมมติว่าเกมนี้มีอินพุต 8 ปุ่ม (1 แพดและ 4 ปุ่ม) และทำงานที่ 60fps อินพุตเกมหนึ่งชั่วโมงสามารถส่งด้วย 3.6KB โดยไม่มีการบีบอัด เซสชั่นของคุณอาจมีเวลาน้อยกว่าหนึ่งชั่วโมงและการบีบอัดควรลดขนาดลงมากเพราะการป้อนข้อมูลของมนุษย์มีความซ้ำซ้อนมาก

ความท้าทายคือทำให้เกมสามารถกำหนดค่าได้เล่นได้จากอินพุตที่บันทึกไว้และเรียกใช้งานได้บนเซิร์ฟเวอร์


0

ไม่เคยใช้งานมาก่อน แต่ ...

ส่งคะแนนเพิ่มขึ้นด้วยการประทับเวลา สิ่งนี้จะให้บันทึกเพื่อดูว่าคะแนนของคุณดีขึ้นหรือไม่รวมถึงวิธีการติดตาม "โมเมนตัม" ของคะแนนสูงสุด

จากนั้นคุณจะกำหนดเหตุการณ์สำคัญ / เกณฑ์สำหรับคะแนนของคุณ

ตัวอย่างเช่น: คะแนนที่มากกว่า 20,000 ไม่สามารถมาถึงใน 20 วินาทีแรกของเกม คะแนนที่สูงกว่า 250,000 ไม่สามารถมาถึงได้หากไม่มีคะแนนมากกว่า 200,000 คะแนน

สิ่งนี้ไม่เหมือนกับการส่งสถานะเกม แต่ใกล้เคียงกับมัน

ผลประโยชน์ด้าน: คิดถึงสถิติการเล่นเกมที่มีประโยชน์ทั้งหมดที่คุณจะได้รับจากสิ่งนี้ บางคนอาจจะจ่ายเงินที่ดีสำหรับสิ่งนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.