Apa yang saya pelajari meretas game Facebook Messenger Soccer

Baru-baru ini, selama Kejuaraan Sepak Bola Eropa terakhir, Facebook memperkenalkan permainan kecil di aplikasi Messenger yang membuat Anda kehilangan waktu berjam-jam meskipun sederhana.

Jika Anda tidak menyadarinya, baca artikel ini di Mashable.

Harus saya akui… Saya benar-benar payah dalam permainan ini, jadi skor terbaik saya adalah 9 .

Tapi, sebagai Pengembang, hal terbaik yang bisa saya lakukan adalah mengalahkan teman saya dengan meretas permainan.

Saya benar-benar berpikir ini akan sederhana.

Cara pertama: Dengarkan permintaan HTTP (s)

Saat mengembangkan aplikasi, Anda segera menyadari bahwa Anda memerlukan alat debugger HTTP untuk menganalisis lalu lintas masuk / keluar untuk API Anda.

Charlesadalah alat terbaik yang saya temukan untuk menyelesaikan tugas ini. Ini memiliki antarmuka yang sangat intuitif dan Anda dapat dengan mudah menggunakannya untuk keperluan debugging dan reverse engineering.

Ini seharusnya berakhir pada titik ini: Saya harus menganalisis API yang digunakan aplikasi Facebook dan hanya memutarnya dengan CURL sambil mengedit data dan skor yang dikirim ke server.

Tentu saja, panggilan API ada dalam HTTPS, jadi mereka dienkripsi .. tetapi Charles dapat digunakan sebagai proxy HTTPS man-in-the-middle, memungkinkan Anda untuk melihat dalam teks biasa komunikasi antara browser web dan server web SSL .

Sempurna! Jadi saya menginstal sertifikat root Charles di iPhone, dan saya mencoba untuk memeriksa lalu lintas. Tetapi semua panggilan HTTP ke server Facebook ditolak di muka selama fase handshake SSL.

Saat melakukan penelitian, saya menemukan bahwa beberapa aplikasi perusahaan seperti Facebook dan Google menggunakan lapisan keamanan ekstra untuk memastikan bahwa sertifikat yang diberikan oleh server jarak jauh adalah yang diharapkan. Teknik ini disebut Penyematan Sertifikat.

Anda dapat dengan mudah melakukan ini dengan memasukkan kunci publik dari sertifikat server jarak jauh dalam aplikasi, sehingga mudah untuk memvalidasi identitas klien untuk setiap permintaan HTTPS.

Teknik ini membatalkan Serangan Man in the Middle (MITM).

Kerja bagus Facebook! Tapi… (ingat, selalu ada tapi) ada cara untuk menonaktifkan penyematan sertifikat SSL menggunakan beberapa tweak sistem yang hanya tersedia pada perangkat yang di-jailbreak.

Cara pertama (ditingkatkan): Jailbreak perangkat dan instal iOS SSL Kill Switch

IPhone saya saat ini menjalankan iOS 9.x, jadi pada saat tulisan ini dibuat, tidak mungkin untuk melakukan jailbreak. Jadi saya mengambil iPad mini lama yang menjalankan iOS 8.3.x dan dengan mudah melakukan jailbreak menggunakan alat TaiG .

Saat mencari di web, saya menemukan SSL Kill Switch 2, alat Blackbox untuk menonaktifkan validasi sertifikat SSL dalam aplikasi iOS dan OS X.

Setelah dimuat ke dalam Aplikasi iOS atau OS X, SSL Kill Switch 2 menambal fungsi SSL tingkat rendah tertentu dalam Secure Transport API untuk menimpa, dan menonaktifkan validasi sertifikat default sistem serta segala jenis validasi sertifikat khusus (seperti penyematan sertifikat).

SSL Kill Switch menggunakan MobileSubstrate untuk menambal fungsi sistem seperti Secure Transport API. Mereka adalah implementasi TLS tingkat terendah di iOS.

Ini berarti bahwa menonaktifkan validasi sertifikat SSL di Secure Transport API akan memengaruhi sebagian besar (jika tidak semua) API jaringan yang tersedia dalam kerangka kerja iOS.

Tolong, bantulah diri Anda sendiri dan ikuti blog ini yang mencakup semua konsep ini.

Jadi, saya terhubung ke iPad menggunakan SSH dan menginstal paket:

wget //github.com/nabla-c0d3/ssl-kill-switch2/releases/download/0.10/com.nablac0d3.SSLKillSwitch2_0.10.deb --no-check-certificatedpkg -i com.nablac0d3.SSLKillSwitch2_0.10.debkillall -HUP SpringBoard

Setelah reboot, saya berharap melihat lalu lintas biasa, tetapi itu adalah visi yang optimis: Saya mendapat kesalahan yang sama.

Saya mencoba cara ini selama satu jam lagi. Saya pernah membaca bahwa Facebook dan Twitter menggunakan protokol SPDY untuk panggilan API mereka, dan ini bisa menjadi masalah bagi Charles. Jadi saya menginstal tweak lain yang (secara teoritis) menonaktifkan protokol SPDY, tetapi tidak berhasil.

Kelaparan.

Melihat masalah proyek, saya melihat bahwa ada orang lain yang memiliki masalah yang sama (//github.com/nabla-c0d3/ssl-kill-switch2/issues/13), tanpa resolusi.

Berhenti sebentar.

Cara kedua: Mensimulasikan peristiwa sentuhan dalam aplikasi

Saya menyadari bahwa ada banyak cheat game yang menggunakan pendekatan "manusia": mensimulasikan peristiwa sentuhan (salah satu game paling populer yang banyak digunakan oleh cheat game ini adalah Clash of Clans).

Menjelajahi web untuk alat yang mengotomatiskan operasi ini, saya menemukan perubahan luar biasa ini - AutoTouch. Itu dapat merekam peristiwa sentuhan manusia dan menyimpan data dalam skrip LUA. Anda kemudian dapat mengedit skrip yang dihasilkan ini dan mensimulasikan apa pun yang Anda inginkan di mana saja di perangkat Anda.

Setelah terinstal dengan Cydia, saya menyimpan screenshot BMP dari aplikasi Messenger dengan bola yang terlihat dan mendapatkan koordinat tempat untuk mengklik.

Apa yang saya pikirkan adalah, dengan mengklik tepat di tengah sumbu X bola, saya hanya perlu mensimulasikan peristiwa sentuhan berulang dalam koordinat yang sama dan kemudian menghentikan skrip ketika saya memiliki skor yang memuaskan.

Inilah yang saya tulis untuk mencapai tujuan ini:

adaptResolution(768, 1024);adaptOrientation(ORIENTATION_TYPE.PORTRAIT);
for i=1,2000 do
 touchDown(1, 544, 954); usleep(66000); touchUp(1, 544, 954);
 usleep(10000);
end

Tidak, itu tidak berhasil.

Mungkin, pengembang Facebook memperkenalkan kesalahan acak pada koordinat sentuh untuk mensimulasikan permainan dengan lebih baik, atau untuk mencegah jenis skrip ini.

Atau, mungkin saya hanya mengklik piksel yang salah.

Jadi, untuk kesempatan kedua, saya mencoba mensimulasikan beberapa klik di area yang lebih luas, tetapi tidak berhasil. Kadang-kadang, saya mensimulasikan begitu banyak peristiwa sentuh sehingga Springboard mogok karena kesalahan memori .

Daripada mengklik di koordinat yang sama setiap saat, saya mencoba pendekatan yang lebih baik.

Reading the AutoTouch documentation, I found the following two methods:

  • findColor (color, count, region) - Search the coordinates of the pixel points matching the specified color on the current screen.
  • getColor (x, y) - Get the color value of the pixel point of the specified coordinate on the current screen.

The idea was to find a unique color inside the ball, and use the findColor method to get the coordinates of the ball in that moment, to simulate a touch event.

adaptResolution(768, 1024);adaptOrientation(ORIENTATION_TYPE.PORTRAIT);
local c = getColor(544, 954);
for i=1,2000 do local r = findColor(c, 0, {400, 500, 768, 1024});
 for i, v in pairs(r) do touchDown(1, v[1], v[2]); usleep(66000); touchUp(1, v[1], v[2]); usleep(10000); end
end

I don’t know why, but it simply didn’t work. Maybe the findColor is too slow to intercept the ball, which then makes the script useless.

The third way: Reverse engineer the app

I don’t have good native skills in Objective C, but I remember (when I played with the jailbreak ~4 years ago) that there was a tool by Saurik that could inject itself into iOS processes.

It is released along with Cydia and was called Cycript.It allowed developers to explore and modify running applications on iOS, by injecting code at run time.

I read some basic tutorials on how to use it, and after a few struggles, I decided to follow this (another) way.

Once you login via SSH into your iOS device, you can easily attach to a process just by typing:

cycript -p Messenger

I tried to inspect some basic UI classes like UIApp, but didn’t find anything interesting. Then I made a complete class dump, filtering it for the keyword soccer.

var C = Object.keys(ObjectiveC.classes);var soccer_classes = []; for (var i = 0; i < C.length; i++) C[i].match(/soccer/i) && soccer_classes.push( C[i] );

It was a slow process.

Saya menemukan bahwa Facebook Messenger memiliki jumlah kelas yang sangat banyak.

Tapi, akhirnya, saya mendapat daftar kecil.

Setelah saya mendapatkan nama kelas, saya menggunakan skrip untuk mencetak semua metode kelas, dan, dengan memeriksa kelas MNSoccerGame , metode yang dihasilkan adalah:

Catatan: Saya masih tidak mengerti apa itu metode wasCheatDetected.

Sekarang saya memiliki daftar lengkap metode kelas, saya memutuskan untuk mengganti metode _setScore , berharap metode lain tidak menyadarinya.

Untuk melakukan ini, saya menggunakan MobileSubstrate dan metode MS.hookMessage -nya .

@import com.saurik.substrate.MS; 
var _setScore_pointer = {}; MS.hookMessage(MNSoccerGame, @selector(_setScore:), function(arg0) { return _setScore_pointer->call(this, 9999); }, _setScore_pointer);

Sekarang Anda bisa bermain, kalah , dan mencetak rekor baru.

Apa yang saya pelajari

Never stop yourself. Always try and discover new way to accomplish the same thing. I know, it’s just a game, but if you treat the problem you’re trying to solve like a challenge, you’ll get much more than the satisfaction of beating your friends.