ฉันจะถอดรหัส Trivia Crack ได้อย่างไร

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

ฉันเริ่มต้นด้วยการตรวจสอบคำขอ Web API ที่สร้างขึ้นผ่านเครือข่ายขณะใช้แอป Android อย่างรวดเร็ว ฉันสังเกตเห็นบางสิ่งที่น่าสนใจระหว่างการทำงานของเกม ดูเหมือนว่าแอปจะได้รับหมวดหมู่ คำถาม และคำตอบจากเซิร์ฟเวอร์ Trivia Crack ก่อนที่ผู้ใช้จะเริ่มหมุนวงล้อ "หมวดหมู่" ด้วยซ้ำ

ด้านล่างนี้คือตัวอย่างการตอบสนองที่แอปดึงข้อมูลก่อนแสดงหน้าจอนี้:

{ 

"id": 2747994099,

"opponent": {

"id": 0,

"alerts_count": 0,

"username": "smartplay(tm)"

},

"game_status": "PENDING_APPROVAL",

"language": "EN",

"created": "03/23/2015 08:58:29 EST",

"last_turn": "03/23/2015 08:58:29 EST",

"type": "NORMAL",

"expiration_date": "03/26/2015 08:58:29 EST",

"my_turn": true,

"statistics": {

"player_one_statistics": {

"category_questions": [

{

"category": "GEOGRAPHY",

"correct": 1,

"incorrect": 0,

"worst": false

}

],

"correct_answers": 1,

"incorrect_answers": 0,

"challenges_won": 0,

"questions_answered": 1,

"crowns_won": 0

},

"player_two_statistics": {

"correct_answers": 0,

"incorrect_answers": 0,

"challenges_won": 0,

"questions_answered": 0,

"crowns_won": 0

}

},

"duelGameType": false,

"normalType": true,

"spins_data": {

"spins": [

{

"type": "NORMAL",

"questions": [

{

"question": {

"id": 14996887,

"category": "SPORTS",

"text": "Who was the first woman gymnast to score a perfect ten at the Olympics?",

"answers": [

"Nadia Comaneci",

"Mo Huilan",

"Tatiana Gutsu",

"Agnes Keleti"

],

"author": {

"id": 71534267,

"name": "Florentina Ionela Gagliano",

"username": "florentina.gagliano",

"facebook_id": "100000030456122",

"facebook_name": "Florentina Ionela Gagliano",

"fb_show_picture": true,

"fb_show_name": true

},

"correct_answer": 0,

"media_type": "NORMAL"

},

"powerup_question": {

"id": 8534934,

"category": "SPORTS",

"text": "In basketball, what does it mean to \"kiss it off the glass\"?",

"answers": [

"Make both free throws",

"Pass off someone's back",

"Dribble past two people",

"Hit a shot off the backboard"

],

"author": {

"id": 41439403,

"name": "tsan.819",

"username": "tsan.819",

"fb_show_picture": false,

"fb_show_name": false

},

"correct_answer": 3,

"media_type": "NORMAL"

}

}

]

}

]

},

"available_crowns": [

"SCIENCE",

"ARTS",

"HISTORY",

"ENTERTAINMENT",

"SPORTS",

"GEOGRAPHY"

],

"my_player_number": 1,

"available_extra_shots": 1,

"player_one": {

"charges": 1

},

"player_two": {

"charges": 0

},

"round_number": 1,

"sub_status": "P1_PLAYING_FIRST_TURN",

"previous_sub_status": "P1_WAITING_FIRST_TURN",

"is_random": true,

"unread_messages": 0,

"status_version": 1,

"new_achievements": false,

"my_level_data": {

"level": 1,

"points": 1,

"progress": 33,

"goal_points": 3,

"level_up": false

}

}

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

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

 v.setText(p); 

String s1 = "";

if (com.etermax.tools.f.a.a() && h.a("ANSWERS_CHEAT", true))

{

s1 = (new StringBuilder()).append(" (").append(r.getCorrectAnswer()).append(")").toString();

}

B.setText((new StringBuilder()).append(r.getText()).append(s1).toString());

A.setContentDescription(r.getText());

a(B);

u.setVisibility(0);

C.startAnimation(com.etermax.preguntados.ui.a.c.b());

x.setImageResource(com.etermax.preguntados.ui.game.duelmode.h.a(m).a(g, r.getCategory()));

LayoutInflater layoutinflater;

List list;

if (l != null && l == GameType.DUEL_GAME)

{

y.setVisibility(0);

y.setText(c(c.x().h()));

} else

{

y.setVisibility(8);

}

H.setEnabled(false);

layoutinflater = getLayoutInflater(getArguments());

d.a(e.d);

list = r.getAnswers();

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

 public boolean onOptionsItemSelected(MenuItem menuitem) 

{

if (com.etermax.tools.f.a.a() && menuitem.getItemId() == com.etermax.i.cheat)

{

if (j.a("ANSWERS_CHEAT", true))

{

j.b("ANSWERS_CHEAT", false);

menuitem.setTitle("Enable Answer Cheat");

return true;

} else

{

j.b("ANSWERS_CHEAT", true);

menuitem.setTitle("Disable Answer Cheat");

return true;

}

} else

{

return super.onOptionsItemSelected(menuitem);

}

}

ดูเหมือนว่ารหัสนี้จะจัดการการตั้งค่าตัวเลือกโหมดโกง แต่ฉันยังไม่สามารถเข้าถึงเมนูได้ ภายในกิจกรรมเดียวกัน ฉันได้ตรวจสอบวิธี OnCreateOptionsMenu ด้านล่าง:

 public boolean onCreateOptionsMenu(Menu menu) 

{

if (com.etermax.tools.f.a.a())

{

getMenuInflater().inflate(com.etermax.l.preguntados_debug_menu, menu);

return true;

} else

{

return super.onCreateOptionsMenu(menu);

}

}

ฟังก์ชั่นโหมดโกงส่วนใหญ่ รวมถึงเมนูที่ซ่อนอยู่ ดูเหมือนว่าจะขึ้นอยู่กับค่าที่ส่งคืน com.etermax.tools.f.a.a(). รหัสสำหรับชั้นเรียนนั้นอยู่ด้านล่าง:

public class a. 

{

private static boolean a;

private static String b;

public static void a(ApplicationInfo applicationinfo)

{

a = false;

}

public static void a(String s)

{

b = s;

}

public static boolean a()

{

return a;

}

public static String b()

{

return b;

}

public static boolean c()

{

return b != null;

}

}

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

# direct methods. 

.method public static a(Landroid/content/pm/ApplicationInfo;)V

.locals 1

.prologue

.line 29

const/4 v0, 0x0

sput-boolean v0, Lcom/etermax/tools/f/a;->a: Z

.line 30

return-void

.end method

ฉันเปลี่ยนบรรทัด 29 (ตัวอย่างบรรทัด #7 ด้านบน) เป็น const/4v0,1ซึ่งตั้งค่าเป็นจริง จากนั้นฉันก็คอมไพล์แอปใหม่และติดตั้ง ปุ่มเมนูจึงเปิดเผยตัวเลือกที่ซ่อนอยู่ด้านล่างได้สำเร็จ:

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

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

แก้ไข:เอพีเค มิเรอร์

นี่ควรเป็นตัวอย่างที่ดีว่าไม่สามารถรับประกันความเป็นส่วนตัวของแอปพลิเคชันไคลเอ็นต์ได้ และนักพัฒนาควรระมัดระวังเกี่ยวกับสิ่งที่รวมอยู่ในการเผยแพร่ที่คอมไพล์แล้ว