Bagaimana Saya Memecahkan Trivia Crack

Trivia Crack adalah game yang sangat populer untuk platform web dan seluler yang meniru Trivial Pursuit. Ini adalah kegemaran terbaru dalam permainan sosial, yang memungkinkan pengguna bersaing dengan teman dan orang asing dalam menjawab pertanyaan dari berbagai kategori. Meskipun saya tidak pernah tertarik bermain game, istri saya baru-baru ini menjadi penggemar berat Trivia Crack. Setelah menontonnya bermain sebentar, saya memutuskan untuk mendownloadnya dan melihat lebih dekat bagaimana penerapannya.

Saya mulai dengan memantau permintaan API web yang dibuat melalui jaringan saat menggunakan aplikasi Android. Dengan sangat cepat, saya menyadari sesuatu yang menarik selama pengoperasian game. Tampaknya aplikasi tersebut menerima kategori, pertanyaan, dan jawaban dari server Trivia Crack bahkan sebelum pengguna mulai memutar roda "kategori".

Di bawah ini adalah contoh respons yang diambil aplikasi sebelum menampilkan layar ini:

{ 

"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

}

}

Perhatikan kategori, pertanyaan, pilihan jawaban, dan kunci jawaban yang benar semuanya disertakan dalam jawaban. Artinya, akan mudah untuk mengidentifikasi jawabannya ketika ditanya dalam aplikasi untuk melakukan cheat game. Meskipun tidak sepenuhnya etis atau adil untuk penggunaan game, menurut saya ini akan menjadi penelitian yang menarik.

Rencana awal saya adalah merekayasa balik aplikasi Android dan menyediakan a Roti panggang pemberitahuan jawabannya. Saya memulainya dengan mendekompilasi aplikasi dan meninjau kode sumber. Saya menggunakan grep untuk mencari sumber beberapa kata kunci yang saya harap dapat membantu saya melacak aktivitas tanya jawab. Saat menelusuri beberapa hasil potensial, beberapa baris menarik perhatian saya.

 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();

Mengikuti kode tersebut, "ANSWERS_CHEAT" mengacu pada mode cheat tersembunyi dalam game. Daripada menemukan kembali rodanya, saya memutuskan untuk mencari tahu cara kerjanya. Menggunakan grep, saya menemukan semua referensi ke "ANSWERS_CHEAT" rangkaian dan dengan cepat telah menemukan referensi ke menu tersembunyi di aktivitas dasbor utama.

 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);

}

}

Kode ini tampaknya menangani pengaturan opsi mode cheat, tetapi saya masih tidak dapat mengakses menu itu sendiri. Dalam aktivitas yang sama, saya meninjau metode OnCreateOptionsMenu di bawah ini:

 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);

}

}

Sebagian besar fungsi mode cheat, termasuk menu tersembunyi, sepertinya bergantung pada nilai yang dikembalikan com.etermax.tools.f.a.a(). Kode untuk kelas itu ada di bawah:

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;

}

}

Tampaknya inilah titik keputusan yang saya cari. Mengubah tugas a = salah; ke BENAR seharusnya mengaktifkan menu tersembunyi. Saya membuka representasi kecil kelas dan menemukan tugas anggota boolean.

# 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

Saya mengubah baris 29 (cuplikan baris #7 di atas) menjadi konstanta/4 v0, 1, yang menyetel nilainya menjadi true. Saya kemudian mengkompilasi ulang aplikasi dan menginstalnya. Tombol menu kemudian berhasil menampilkan opsi tersembunyi di bawah ini:

"Answer Cheat" sekarang sepertinya diaktifkan secara default, jadi saya memulai permainan baru untuk diuji. Seperti yang diharapkan, permainan sekarang menambahkan nomor setelah pertanyaan, menunjukkan indeks berbasis nol dari jawaban yang benar.

Unduh APK yang ditambal Di Sini. Perlu diperhatikan bahwa ini hanya untuk tujuan penelitian; Saya tidak bertanggung jawab atas gameplay yang tidak bermoral!

Sunting:Cermin APK

Ini harus menjadi contoh yang baik bahwa privasi aplikasi klien tidak dapat dijamin dan pengembang harus berhati-hati tentang apa yang termasuk dalam rilis terkompilasi mereka.