เป็นวิธีที่ดีที่สุดในการหยุดคนแฮกตารางคะแนนสูงสุดของ PHP ของเกม Flash อะไร


212

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

สิ่งที่ฉันต้องการจริงๆคือการเข้ารหัสที่แข็งแกร่งที่สุดที่เป็นไปได้ใน Flash / PHP และวิธีการป้องกันไม่ให้คนเรียกหน้า PHP อื่น ๆ นอกเหนือจากไฟล์ Flash ของฉัน ฉันได้ลองวิธีง่าย ๆ บางอย่างในอดีตของการโทรหลายครั้งเพื่อทำคะแนนเดียวและทำลำดับการตรวจสอบ / ฟีโบนักชี ฯลฯ และยังทำให้ไฟล์ SWF ยุ่งเหยิงด้วย Amayeta SWF Encrypt แต่พวกมันทั้งหมดถูกแฮ็กในที่สุด

ขอบคุณการตอบกลับของ StackOverflow ตอนนี้ฉันได้พบข้อมูลเพิ่มเติมจาก Adobe - http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.htmlและhttps://github.com/mikechambers/as3corelibซึ่งฉันคิดว่าฉัน สามารถใช้สำหรับการเข้ารหัส ไม่แน่ใจว่าจะพาฉันไปที่ CheatEngine ได้ไหม

ฉันจำเป็นต้องรู้วิธีแก้ปัญหาที่ดีที่สุดสำหรับทั้ง AS2 และ AS3 หากพวกเขาแตกต่างกัน

ปัญหาหลักดูเหมือนจะเป็นเช่น TamperData และ LiveHTTP headers แต่ฉันเข้าใจว่ามีเครื่องมือแฮ็คขั้นสูงเช่น CheatEngine (ขอบคุณ Mark Webster)


คุณควรกำหนดขีด จำกัด ของคะแนนโดยไม่มีเหตุผลว่าทำไมคุณถึงทำไม่ได้ต่อระดับโดยรวมแล้ว ...
mpm

ลิงก์แรกไม่สามารถใช้งานได้อีก
ไมค์

คำตอบ:


415

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

  • Flash เป็นวิธีที่ง่ายกว่าในการทำวิศวกรรมย้อนกลับมากกว่าที่คุณคิดว่าเป็นเพราะไบต์เป็นเอกสารที่ดีและอธิบายภาษาระดับสูง (Actionscript) --- เมื่อคุณเผยแพร่เกม Flash คุณจะเผยแพร่ซอร์สโค้ดไม่ว่าคุณจะ รู้หรือไม่

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

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

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

hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))

(คุณสามารถใช้คุกกี้เซสชันเพื่อให้มีผลเหมือนกัน)

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

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

hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))

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

hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))

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

ดังนั้นตอนนี้ผู้โจมตีถอดรหัสรหัส Flash ของคุณและค้นหารหัส AES อย่างรวดเร็วซึ่งดึงออกมาเหมือนนิ้วโป้งถึงแม้ว่ามันจะไม่ถูกติดตามลงใน 15 นาทีด้วยการค้นหาหน่วยความจำและการติดตาม ("ฉันรู้ คะแนนของฉันสำหรับเกมนี้คือ 666 ดังนั้นลองหา 666 ในหน่วยความจำแล้วจับการดำเนินการใด ๆ ที่แตะค่า --- ดูสิรหัสการเข้ารหัสคะแนนสูง! ") ด้วยคีย์เซสชันผู้โจมตีไม่จำเป็นต้องเรียกใช้รหัส Flash เธอคว้าโทเค็นการเปิดตัวเกมและคีย์เซสชันและสามารถส่งคะแนนสูงตามอำเภอใจกลับมาได้

คุณมาถึงจุดที่นักพัฒนาซอฟต์แวร์ส่วนใหญ่ยอมแพ้ --- ยอมแพ้หรือใช้เวลาสองสามเดือนในการยุ่งกับผู้โจมตีโดย:

  • การไขกุญแจ AES ด้วยการดำเนินการ XOR

  • การแทนที่อาร์เรย์ไบต์สำคัญด้วยฟังก์ชันที่คำนวณคีย์

  • การกระจายการเข้ารหัสคีย์ปลอมและการโพสต์คะแนนสูงตลอดทั้งไบนารี

ทั้งหมดนี้ส่วนใหญ่เสียเวลา มันไปโดยไม่บอกว่า SSL จะไม่ช่วยคุณเช่นกัน SSL ไม่สามารถปกป้องคุณได้เมื่อหนึ่งในสองปลายทาง SSL นั้นเป็นสิ่งที่ไม่ดี

นี่คือบางสิ่งที่สามารถลดการฉ้อโกงคะแนนสูงได้จริง:

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

  • ปฏิเสธคะแนนสูงจากเซสชันเกมที่น้อยกว่าเกมจริงที่สั้นที่สุดเท่าที่เคยเล่นมา (สำหรับวิธีการที่ซับซ้อนยิ่งขึ้นลอง "กักกัน" คะแนนสูงสำหรับเซสชันเกมที่มีอายุน้อยกว่า 2 ส่วนเบี่ยงเบนมาตรฐานต่ำกว่าระยะเวลาเฉลี่ยของเกม) ตรวจสอบให้แน่ใจว่าคุณกำลังติดตามเซิร์ฟเวอร์ระยะเวลาเกม

  • ปฏิเสธหรือกักกันคะแนนสูงจากการเข้าสู่ระบบที่เล่นเกมเพียงครั้งเดียวหรือสองครั้งดังนั้นผู้โจมตีจะต้องสร้าง "เส้นทางกระดาษ" ของการเล่นเกมที่ดูสมเหตุสมผลสำหรับการเข้าสู่ระบบแต่ละครั้งที่พวกเขาสร้าง

  • คะแนน "Heartbeat" ในระหว่างการเล่นเกมเพื่อให้เซิร์ฟเวอร์ของคุณเห็นการเติบโตของคะแนนตลอดช่วงเวลาของการเล่นเกมหนึ่งครั้ง ปฏิเสธคะแนนสูงที่ไม่เป็นไปตามส่วนโค้งของคะแนนที่สมเหตุสมผล (เช่นกระโดดจาก 0 ถึง 999999)

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

  • ปิดใช้งานบัญชีของผู้ใช้ที่ไม่ผ่านการตรวจสอบความปลอดภัยของคุณ (ตัวอย่างเช่นโดยการส่งคะแนนสูงที่เข้ารหัสซึ่งไม่ผ่านการตรวจสอบ)

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


23
ฉันสร้างชุมชนเกมออนไลน์ขึ้นมาและเราออกแบบระบบรางวัลทั้งหมดของเราเพื่อให้คะแนนเปอร์เซ็นไทล์อันดับที่ 10 แทนที่จะเป็นผู้ทำคะแนนสูงสุดและทำผลงานได้ดีมากดังนั้นการพยายามก้าวเท้าเลี่ยงปัญหาช่วยด้วย!
grapefrukt

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

3
ผมคิดว่าหนึ่งยังสามารถเข้าสู่ระบบการกระทำทั้งหมดของผู้ใช้และเล่นกับพวกเขาในเซิร์ฟเวอร์การตรวจสอบ / ตรวจสอบคะแนนสูง
I3ck

25

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

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


2
นี่เป็นเทคนิคที่ฉันเคยใช้ในอดีตเช่นกันสำหรับระบบการลงคะแนน ไม่มีวิธีที่คุณสามารถป้องกันผู้คนจากการโกงสิ่งที่คุณสามารถทำได้คือบันทึกพฤติกรรมของพวกเขาเพื่อให้คุณสามารถตรวจสอบว่ามีการโกงหรือไม่ สำหรับระบบการลงคะแนนของเราเราใช้ในการจัดเก็บการประทับเวลาและที่อยู่ IP [ต่อ.]
ลูกา

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

19

วิธีง่ายๆในการทำเช่นนี้คือการให้แฮชการเข้ารหัสของค่าคะแนนสูงสุดของคุณพร้อมกับคะแนนที่เป็นของตนเอง ตัวอย่างเช่นเมื่อโพสต์ผลลัพธ์ผ่าน HTTP GET: http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095

เมื่อคำนวณผลรวมตรวจสอบนี้ควรใช้ความลับร่วมกัน ความลับนี้ไม่ควรส่งผ่านเครือข่าย แต่ควรเข้ารหัสอย่างหนักทั้งในส่วนแบ็คเอนด์ PHP และส่วนหน้าแฟลช การตรวจสอบด้านบนถูกสร้างขึ้นโดยการเติมสตริง " secret " เป็นคะแนน " 500 " และเรียกใช้ผ่าน md5sum

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

เพื่อป้องกันการโจมตีซ้ำไม่ให้เกิดขึ้นระบบการตอบสนองต่อความท้าทายบางประเภทจะต้องถูกสร้างขึ้นเช่นต่อไปนี้:

  1. เกมแฟลช ("ลูกค้า") ดำเนินการ HTTP GET ของhttp://example.com/highscores.phpโดยไม่มีพารามิเตอร์ หน้านี้ส่งคืนสองค่า: ค่าเกลือที่สร้างแบบสุ่มและแฮชการเข้ารหัสของค่าเกลือนั้นรวมกับความลับที่แชร์ ค่าเกลือนี้ควรเก็บไว้ในฐานข้อมูลท้องถิ่นของการสืบค้นที่ค้างอยู่และควรมีการประทับเวลาที่เกี่ยวข้องเพื่อให้สามารถ "หมดอายุ" หลังจากผ่านไปหนึ่งนาที
  2. เกมแฟลชรวมมูลค่าเกลือกับความลับที่ใช้ร่วมกันและคำนวณแฮชเพื่อตรวจสอบว่าตรงกับที่ระบุโดยเซิร์ฟเวอร์ ขั้นตอนนี้มีความจำเป็นเพื่อป้องกันการแก้ไขค่าเกลือโดยผู้ใช้เนื่องจากเป็นการตรวจสอบว่าเซิร์ฟเวอร์นั้นสร้างมูลค่าเกลือจริง
  3. เกมแฟลชรวมมูลค่าเกลือกับความลับที่แชร์ค่าคะแนนสูงและข้อมูลอื่น ๆ ที่เกี่ยวข้อง (ชื่อเล่น, ip, เวลาประทับ) และคำนวณแฮช จากนั้นจะส่งข้อมูลนี้กลับไปที่แบ็กเอนด์ PHP ผ่าน HTTP GET หรือ POST พร้อมกับค่าเกลือคะแนนสูงและข้อมูลอื่น ๆ
  4. เซิร์ฟเวอร์จะรวมข้อมูลที่ได้รับในลักษณะเดียวกับที่ใช้กับลูกค้าและคำนวณแฮชเพื่อตรวจสอบว่าตรงกับข้อมูลที่ลูกค้าให้ไว้หรือไม่ จากนั้นตรวจสอบว่าค่าเกลือยังคงใช้ได้ตามที่ระบุไว้ในรายการแบบสอบถามที่ค้างอยู่ หากเงื่อนไขทั้งสองนี้เป็นจริงจะเขียนคะแนนสูงลงในตารางคะแนนสูงและส่งคืนข้อความ "สำเร็จ" ที่เซ็นชื่อให้กับลูกค้า นอกจากนี้ยังลบค่าเกลือออกจากรายการแบบสอบถามที่ค้างอยู่

โปรดทราบว่าการรักษาความปลอดภัยของเทคนิคใด ๆ ข้างต้นจะถูกทำลายหากผู้ใช้สามารถเข้าถึงข้อมูลลับที่แบ่งปันได้

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


11

ฉันชอบสิ่งที่ tpqf พูด แต่แทนที่จะปิดใช้งานบัญชีเมื่อมีการค้นพบการโกงใช้ honeypot ดังนั้นเมื่อใดก็ตามที่พวกเขาลงชื่อเข้าใช้พวกเขาเห็นคะแนนแฮ็คและไม่เคยสงสัยว่าพวกเขาถูกทำเครื่องหมายว่าหมุนรอบ Google สำหรับ "phpBB MOD Troll" และคุณจะเห็นวิธีการอันชาญฉลาด


1
ปัญหาเกี่ยวกับวิธีการนั้นคือการโกงเหล่านี้คุยโวกันบนกระดานข้อความ ฯลฯ ดังนั้นมันจะไม่ขัดขวางพวกเขาจริงๆ
Iain

7
ฉันไม่เห็นด้วย. ฟังดูเหมือนเป็นวิธีที่ฉลาดมาก
bzlm

4

ในคำตอบที่ได้รับการยอมรับ tqbf กล่าวถึงว่าคุณสามารถทำการค้นหาหน่วยความจำสำหรับตัวแปรคะแนนได้ ("คะแนนของฉันคือ 666 ดังนั้นฉันจึงค้นหาหมายเลข 666 ในหน่วยความจำ")

มีวิธีแก้ไขปัญหานี้ ฉันมีชั้นเรียนที่นี่: http://divillysausages.com/blog/safenumber_and_safeint

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

ลองดูวิดีโอจากคนที่อยู่เบื้องหลังเครื่องยนต์ PushButton ที่พูดถึงวิธีการต่าง ๆ ที่คุณสามารถต่อสู้กับการแฮ็คได้: http://zaa.tv/2010/12/the-art-of-hacking-flash- เกม / พวกเขาเป็นแรงบันดาลใจเบื้องหลังชั้นเรียน


4

ฉันได้วิธีแก้ปัญหา ... ฉันได้รับคะแนนเพิ่มขึ้น (คุณจะได้รับคะแนน +1 เสมอ) ก่อนอื่นฉันเริ่มนับจากตัวเลขสุ่ม (สมมติว่า 14) และเมื่อฉันแสดงคะแนนเพิ่งแสดงคะแนน var ลบ 14 นี่คือดังนั้นหากแครกเกอร์กำลังมองหาตัวอย่างสำหรับ 20 พวกเขาจะไม่พบมัน (มัน จะเป็น 34 ในหน่วยความจำ) ประการที่สองเนื่องจากฉันรู้ว่าจุดต่อไปควรเป็นอย่างไร ... ฉันใช้ไลบรารี adobe crypto เพื่อสร้างแฮชของจุดต่อไปที่ควรจะเป็น. เมื่อฉันต้องเพิ่มคะแนนฉันจะตรวจสอบว่าแฮชของคะแนนที่เพิ่มขึ้นเท่ากับแฮชที่ควรจะเป็นหรือไม่ หากแครกเกอร์เปลี่ยนคะแนนในหน่วยความจำแฮชจะไม่เท่ากัน ฉันทำการตรวจสอบฝั่งเซิร์ฟเวอร์และเมื่อฉันได้คะแนนที่แตกต่างจากเกมและจาก PHP ฉันรู้ว่าการโกงมีส่วนเกี่ยวข้อง นี่คือตัวอย่างโค้ดของฉัน (ฉันใช้ Adobe Crypto libraty MD5 class และเกลือการเข้ารหัสแบบสุ่ม callPhp () เป็นการตรวจสอบด้านเซิร์ฟเวอร์ของฉัน)

private function addPoint(event:Event = null):void{
            trace("expectedHash: " + expectedHash + "  || new hash: " + MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt) );
            if(expectedHash == MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt)){
                SCORES +=POINT;
                callPhp();
                expectedHash = MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt);
            } else {
                //trace("cheat engine usage");
            }
        }

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

package  {

    import bassta.utils.Hash;

    public class ScoresEncoder {

        private static var ranChars:Array;
        private static var charsTable:Hash;

        public function ScoresEncoder() {

        }

        public static function init():void{

            ranChars = String("qwertyuiopasdfghjklzxcvbnm").split("")

            charsTable = new Hash({
                "0": "x",
                "1": "f",
                "2": "q",
                "3": "z",
                "4": "a",
                "5": "o",
                "6": "n",
                "7": "p",
                "8": "w",
                "9": "y"

            });

        }

        public static function encodeScore(_s:Number):String{

            var _fin:String = "";

            var scores:String = addLeadingZeros(_s);
            for(var i:uint = 0; i< scores.length; i++){
                //trace( scores.charAt(i) + " - > " + charsTable[ scores.charAt(i) ] );
                _fin += charsTable[ scores.charAt(i) ];
            }

            return _fin;

        }

        public static function decodeScore(_s:String):String{

            var _fin:String = "";

            var decoded:String = _s;

            for(var i:uint = 0; i< decoded.length; i++){
                //trace( decoded.charAt(i) + " - > "  + charsTable.getKey( decoded.charAt(i) ) );
                _fin += charsTable.getKey( decoded.charAt(i) );
            }

            return _fin;

        }

        public static function encodeScoreRand(_s:Number):String{
            var _fin:String = "";

            _fin += generateRandomChars(10) + encodeScore(_s) + generateRandomChars(3)

            return _fin;
        }

        public static function decodeScoreRand(_s:String):Number{

            var decodedString:String = _s;
            var decoded:Number;

            decodedString = decodedString.substring(10,13);         
            decodedString = decodeScore(decodedString);

            decoded = Number(decodedString);

            return decoded;
        }

        public static function generateRandomChars(_length:Number):String{

            var newRandChars:String = "";

            for(var i:uint = 0; i< _length; i++){
                newRandChars+= ranChars[ Math.ceil( Math.random()*ranChars.length-1 )];
            }

            return newRandChars;
        }

        private static function addLeadingZeros(_s:Number):String{

            var _fin:String;

            if(_s < 10 ){
                 _fin = "00" + _s.toString();
            }

            if(_s >= 10 && _s < 99 ) {
                 _fin = "0" + _s.toString();
            }

            if(_s >= 100 ) {
                _fin = _s.toString();
            }           

            return _fin;
        }


    }//end
}

จากนั้นฉันก็ส่งตัวแปรไปพร้อมกับ vars ปลอมอื่น ๆ และมันก็หายไประหว่างทาง ... มันเป็นงานที่ต้องทำมากมายสำหรับเกมแฟลชขนาดเล็กเท่านั้น หากคุณต้องการความช่วยเหลือใด ๆ เขียน PM ฉัน

ไชโย


3

การเข้ารหัสโดยใช้คีย์ย้อนกลับที่รู้จัก (ส่วนตัว) จะเป็นวิธีที่ง่ายที่สุด ฉันยังไม่หมด AS ดังนั้นฉันไม่แน่ใจว่ามีผู้ให้บริการการเข้ารหัสประเภทใด

แต่คุณสามารถรวมตัวแปรเช่นความยาวของเกม (เข้ารหัสอีกครั้ง) และจำนวนคลิก

ทุกสิ่งเช่นนี้สามารถย้อนกลับวิศวกรรมเพื่อพิจารณาการโยนในกลุ่มของข้อมูลขยะเพื่อโยนคนออกกลิ่น

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

มันอาจจะคุ้มค่ากับการใช้สเกลาร์เพื่อดูว่าคะแนนสูงสุดคือเท่าไรต่อวินาที / นาทีของการเล่น

ไม่มีสิ่งใดที่ไม่สามารถหลีกเลี่ยงได้ แต่มันจะช่วยให้มีตรรกะบางอย่างไม่ได้อยู่ในแฟลชที่ผู้คนสามารถมองเห็นได้


ทุกคนที่ทำตามวิธีการนี้จะต้องมีเวลาและตรวจสอบเวลามิฉะนั้นคุณอาจเสี่ยงต่อการเล่นซ้ำการโจมตี
Tom Ritter

3

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


12
แต่นั่นก็เป็นการลบข้อเสนอแนะในเชิงบวกของคะแนนสูงทันทีสำหรับผู้เล่นจริงดังนั้นคุณจึงลดคุณภาพการเล่นเกม
คริสการ์เร็ต

3

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

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


2

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

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


2

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

หากคุณต้องการหยุดการโกงเด็ก ๆ โดยใช้เครื่องมือง่ายๆเช่น TamperData คุณสามารถสร้างรหัสการเข้ารหัสที่คุณส่งผ่านไปยัง SWF เมื่อเริ่มต้น จากนั้นใช้บางอย่างเช่นhttp://code.google.com/p/as3crypto/เพื่อเข้ารหัสคะแนนสูงสุดก่อนที่จะส่งกลับไปที่โค้ด PHP จากนั้นถอดรหัสที่ปลายเซิร์ฟเวอร์ก่อนเก็บไว้ในฐานข้อมูล


2

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

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

ข้อเสียคือผู้ใช้สามารถส่งคะแนนสูงได้เพียงหนึ่งครั้งต่อการโหลดภาพยนตร์แฟลช - คุณต้องบังคับให้พวกเขารีเฟรช / โหลด SWF ใหม่ก่อนที่พวกเขาจะสามารถเล่นได้อีกครั้งเพื่อรับคะแนนใหม่


2

ฉันมักจะรวม "ข้อมูลผี" ของเซสชั่นเกมด้วยรายการคะแนนสูงสุด ดังนั้นถ้าฉันทำเกมแข่งรถฉันจะรวมข้อมูลการเล่นซ้ำ คุณมักจะมีข้อมูลเล่นซ้ำสำหรับฟังก์ชั่นเล่นซ้ำหรือฟังก์ชั่นการแข่งรถผี (เล่นกับการแข่งขันครั้งสุดท้ายของคุณหรือเล่นกับผีของเพื่อน # 14 บนกระดานผู้นำ)

การตรวจสอบเหล่านี้เป็นงานที่ต้องทำด้วยมือ แต่ถ้าเป้าหมายคือการตรวจสอบว่า 10 อันดับแรกของการประกวดนั้นถูกต้องหรือไม่นี่อาจเป็นประโยชน์ต่อคลังแสงของมาตรการรักษาความปลอดภัยที่คนอื่น ๆ ได้ชี้ไปแล้ว

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


2

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

ดูเหมือนว่าจะเป็นทางออกที่ดีถ้าคุณถามฉันไม่มีใครเห็นปัญหาเกี่ยวกับการใช้วิธีนี้หรือไม่? หรือวิธีที่เป็นไปได้รอบ ๆ มัน?


Wireshark Wireshark เป็นหลุมเสมอ
aehiilrs

ใช่ ive ลองใช้วิธีการที่แน่นอน ... ดี ... ฉันได้รับผู้ใช้ที่ถูกกฎหมายเป็น cheaters (ฟังก์ชั่นนี้ทำงานได้ตลอดเวลาบนคอมพิวเตอร์ของฉัน แต่มันไม่ทำงานบนคอมพิวเตอร์เครื่องอื่น) ... ดังนั้นตอนนี้ฉันแค่ ได้รับอนุญาตสำหรับการโกง ... ฉันบันทึกคนที่ไม่ผ่านการตรวจสอบข้างต้นและฉันบันทึกคนที่มีคะแนนสูงมากและจากนั้นก็ทำร้ายพวกเขาด้วยตนเอง ... โดยการให้คะแนน * -1: P พวกเขามักจะเล่นมุขดี
Sigtran

1
"วิธีหนึ่งในการทำเช่นนี้คือการกำหนดค่าสุ่ม 2 ค่าจาก php ลงในแฟลช (ซึ่งคุณไม่สามารถคว้าหรือดูแม้ว่าจะใช้ grabber flash data แบบเรียลไทม์)" - โปรดบอกฉันว่ามีวิธีการส่งค่าจาก php ไปยัง แฟลชโดยไม่มีการตรวจสอบโดย firebug หรือเครื่องมืออื่น ๆ ?
mkto

2

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


2

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


1

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


1

มันอาจจะเป็นความคิดที่ดีในการสื่อสารกับแบ็กเอนด์ผ่านAMFPHP มันควรกีดกันคนขี้เกียจอย่างน้อยพยายามผลักผลลัพธ์ผ่านคอนโซลของเบราว์เซอร์

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