Apakah Anda melihat cara curang di Hat Dash?
Lihat juga: Hat Dash White Hat Hall of Fame dan Penyegaran Papan Peringkat
Perbarui 2021-01-13 : Semua hadiah telah diberikan (di posting ini atau yang lain), terima kasih semua telah berpartisipasi!
Seperti yang telah dilaporkan oleh beberapa pengguna, beberapa skor yang mencurigakan mulai muncul di hat dash. Saya memiliki beberapa heuristik dan aturan di tempat (lebih banyak yang akan datang juga) untuk menangkap beberapa di antaranya secara otomatis (atau dengan beberapa langkah manual dari saya). Meskipun demikian, saya tertarik untuk membuat hal-hal menyenangkan dan jujur untuk semua orang.
Jadi, jika Anda dapat (dalam jawaban atas pertanyaan ini) melaporkan cara untuk berhasil menyontek, sedemikian rupa sehingga skor muncul di papan (dan belum ada dalam daftar hal-hal yang harus saya perhatikan, seperti orang yang mendapat skor 999K dalam 20 detik), atau menyarankan heuristik baru yang efektif melebihi apa yang sudah ada untuk mendeteksi kecurangan, maka saya akan melakukan hal berikut:
- Berikan jawaban Anda hadiah (nilai TBD berdasarkan tingkat keparahan)
- Memberi Anda teriakan di bagian bawah papan peringkat dasbor topi
Cheating = baik melalui manipulasi langsung API, atau sesuatu dari sisi klien yang memungkinkan Anda menipu game agar bekerja tanpa benar-benar melompat dan semacamnya.
Juga, jika Anda terlibat dalam pengujian topi putih dan saya mencekal Anda karena itu (melihat perilaku yang mencurigakan), beri tahu saya di ruang obrolan WB .
Jawaban
Ya, saya lakukan!
Prosesnya cukup mudah. Pergi kehttps://winterbash2020.stackexchange.com/run-with-the-hatssecara langsung, dan membuka file JS cdn.sstatic.net hd.min.js
dengan debugger chrome.
(untuk alasan aksesibilitas, saya telah menyertakan nomor baris dalam teks. Perhatikan bahwa ini relatif murni bagaimana Chrome merasa ingin mempercantik file, dan sudah bervariasi antara FF dan Chrome)
Pertama, saya menambahkan breakpoint di sini (baris 526 dari file JS yang disebutkan sebelumnya):
... meskipun ini ternyata tidak ada gunanya, saya mengubah waktu mulai. Saya dan debugger Chrome bertengkar sedikit, yang mungkin menyumbang sebagian besar dari 67 detik yang digunakan. Saya kemudian melihat waktu ada di sini, jadi saya mungkin bisa mengubahnya nanti. Saya memodifikasi startAt time dan mengurangi 90000, meskipun saya ragu itu berpengaruh. Modifikasi ini dilakukan di konsol, menggunakan sistem debugging standar. Mungkin sudah lupa -=
saat saya memodifikasinya. /mengangkat bahu
Kedua, saya menambahkan breakpoint di sini (baris 629 dari file JS yang disebutkan sebelumnya):
di situlah kesenangan dimulai. Saya menaikkan distanceRan
variabel menjadi 9 juta hanya karena mengapa tidak. Setelah berkelahi dengan Chrome untuk melanjutkannya (ini agak bermasalah, mungkin artefak Flatpak, yang sepenuhnya salah saya, untuk menjadi jelas), kode terus dijalankan dan mengirimkan skor.
Saya mencoba menggunakan .trigger("gameStarted/gameEnded")
fungsi tersebut, tetapi tidak melakukan apa-apa. Juga mencoba mengubah permintaan XHR (dengan breakpoint lain - milik Firefox "break on XHR"), tetapi tampaknya validasi membuat saya tetap tidak masuk meskipun mencapai kedua titik akhir.
Round 2, karena ini sebenarnya menyenangkan: D
Sejalan dengan tiga jawaban lainnya, ini dia lagi. Ini adalah opsi AFK, dan hanya membutuhkan waktu. Skor konyol bisa dicapai.
- Buka debugger
- Lompat untuk memulai permainan, dan saat di udara, jeda eksekusi
- Konsol
this.config.GRAVITY = 0
,.
Permainan sekarang dapat dibiarkan di latar belakang untuk menggiling skor, karena pengaturan gravitasi ke 0 membuat unicorn dilepaskan kembali ke alam liar. Tidak ada unicorn yang dirugikan dalam pengujian bug ini. Mungkin
Setelah puas dengan skornya, hentikan permainan lagi dan panggil this.gameOver()
. Karena bug saat GRAVITY
disetel ke 0, satu-satunya cara untuk menghentikan permainan adalah memanggil fungsi secara manual. Sebagai bonus, kecuali Anda menambahkan beberapa jenis pemeriksaan kerusakan, ini tidak dapat diperiksa. Waktu dan skor meningkat seperti yang diharapkan, dengan satu-satunya perbedaan nyata yang tidak saya perlukan untuk bermain game.
Jika Anda menginginkan saran saya, jangan menerima skor apa pun yang dikirim jika konsol terbuka. Mendeteksi konsol yang dibuka, bagaimanapun, itu rumit. Sesuatu seperti ini mungkin berfungsi pada percobaan pertama, tetapi seperti yang Anda lihat sejauh ini, apa pun yang dimasukkan ke dalam JS, seseorang dengan konsol dapat memodifikasi. menggunakan waktu mungkin berhasil pada percobaan pertama, tetapi seseorang dapat dengan mudah mengatur breakpoint, mengubah waktu menjadi di bawah ambang batas, dan kemudian melanjutkan, melewati pengujian ini.
Ya selamanya!
Saya menulis skrip untuk terus memeriksa apakah Anda berada di puncak papan peringkat, dan jika bukan untuk mengirimkan skor yang menempatkan Anda di sana.
Saya membayangkan ini adalah pendekatan dasar yang sama dengan yang lain, tetapi yang saya lakukan hanyalah menghapus kode sumber, menyesuaikannya sedikit, dan membiarkannya berjalan di tab.
Untuk menyiasati heuristik, saya mencapai puncak dengan menetapkan skor yang saya inginkan, dan detik, menjadi satu lebih dari pemimpin saat ini.
Intinya - biarkan ini berjalan, dan itu akan terus memeriksa untuk melihat apakah Anda berada di puncak papan peringkat. Jika tidak, itu akan menjalankan permainan untuk menjatuhkan mereka dari posisi teratas, kemudian kembali ke pemeriksaan.
Sejauh yang saya tahu dengan API yang dirancang, tidak ada cara untuk mencegah kecurangan semacam ini, namun sesuatu yang mungkin membuatnya jauh lebih sulit adalah mengirimkan daftar waktu lompatan (milidetik sejak mulai) - yaitu stempel waktu untuk setiap pers dari bilah spasi. Jauh lebih sulit untuk disimulasikan secara efektif.
Babak 4! Saya ingin melakukan ini sejak kemarin tetapi tidak tahu caranya. Dan itu bukan permintaan XHR, tapi saya akan melakukannya dengan lebih baik.
Game ini memiliki satu kelemahan besar: Rintangannya tidak takut pada unicorn yang agung! Jadi uh, ya, saya memperbaiki permainan Anda untuk Anda: p Juga mendengar desas-desus kucing dan unicorn bekerja sama .
Beberapa kucing bergabung dengan unicorn dalam memperjuangkan kebebasan unicorn saat menguji bug ini
(ini kembali ketika saya pikir setiap 200 md sudah cukup, tetapi saat permainan dipercepat, itu terlalu dekat untuk kenyamanan, jadi saya menabraknya menjadi setiap 10 md)
var intv2 = setInterval(() => {
Runner.instance_.horizon.obstacles = []
}, 10);
Dan saat Anda siap untuk menang, clearInterval(intv2);
Untuk beberapa alasan, saya tidak bisa mendapatkan metode ini untuk bekerja jika saya melewati 10k poin terlalu banyak. Tidak yakin mengapa, mungkin pembatalan yang terlalu agresif, atau Anda hanya mengira tidak ada yang akan secara sah mendapatkan skor setinggi itu: P
Punya entri papan peringkat ini setidaknya:
Catatan: untuk beberapa alasan, saya hanya bisa mendapatkan ini untuk bekerja https://winterbash2020.stackexchange.com/run-with-the-hats
Bonus: Anda sekarang dapat berlari di bidang unicorn alih-alih berlari di atas dan di bawah topi.
Ya!
Saya melakukan sesuatu yang mirip dengan apa yang Zoe lakukan , saya membuka debugger Chrome. Saya mulai menjelajahi Runner
objek dan melihat bahwa Anda dapat langsung memanipulasi distanceRan
menggunakan konsol Chrome. Itulah yang saya lakukan untuk lari ke-2 saya. Tetapi Anda tidak bisa begitu saja mengatur Runner.instance_.distanceRan
ke apa pun yang Anda inginkan ... Jika Anda mencoba, itu akan dikalikan dengan 0,025 (mengaturnya menjadi 100.000 membuatnya berkurang menjadi 2.500) dan saya benar-benar tidak yakin mengapa ... Jadi saya lakukan Runner.instance_.distanceRan = 100000 / 0.025
untuk semacam itu "batalkan" itu dan tampaknya mengubah skor saya dengan benar ke apa yang semula saya inginkan, 100.000.
Lari kedua saya dilakukan dengan sedikit berbeda. Seperti yang ditunjukkan Zoë dalam jawabannya, ada gameOver()
fungsi yang dipanggil setiap kali Anda mengalami hambatan. Itu keren ... Jadi saya mencoba membatalkannya Runner.instance_.gameOver = null
tetapi itu hanya menyebabkan permainan macet ketika saya menabrak rintangan. Jadi, sebagai gantinya, saya mengaturnya ke function
penggunaan kosong Runner.instance_.gameOver = function() { /*nothing*/ }
yang membiarkan saya terus menerus mengalami kendala tanpa kehilangan.
Masalahnya adalah, bagaimanapun, bahwa sekarang saya tidak bisa mengakhiri permainan dan dengan demikian menguangkan skor konyol apa pun yang berhasil saya dapatkan saat saya berjalan pergi dan mengambil minuman untuk diri saya sendiri. Jadi saya menyalin konten fungsi dari file js dan mengatur gameOver
fungsi kembali ke konten sebelumnya dan membiarkan saya mengakhiri permainan ... Brutal, saya mungkin menambahkan. Saya bergerak sangat cepat pada saat itu sehingga saya tidak dapat beralih dan mencoba menyelamatkan diri. Saya memutuskan untuk menetapkan skor saya menjadi 50k untuk berada di papan peringkat untuk kedua kalinya pada run-through saya berikutnya.
Menemukan cara yang bagus untuk menipu, yang Anda tinggalkan dalam semalam.
Langkah-langkah untuk mereproduksi:
- Buka halaman Run with the Hats , klik kanan di mana saja dan klik "Inspect element".
- Klik tab "Konsol".
- Copy dan paste perintah ini ke dalam Console dan tekan Enter:
var original = Runner.prototype.gameOver
. - Lakukan hal yang sama dengan Langkah # 3, kecuali dengan perintah ini:
Runner.prototype.gameOver = function (){}
. - Pada baris berikutnya,
f (){}
akan muncul setelah Anda menekan Enter. Apa yang saya cukup yakin ini lakukan, adalah menggantigameOver
fungsi yang dipanggil saat Unicorn menabrak rintangan dengan fungsi kosong (f (){}
), jadi Unicorn saya saat ini lepas dari ikatan. - Salin dan tempel perintah
Runner.prototype.gameOver = original
ke Konsol untuk kembali normal dan memposting skor tinggi Anda (mungkin perlu beberapa saat untuk berhenti).
Babak 3, karena saya melihat Anda memperbaiki gravitasi, jadi saya sangat ingin mematahkannya lagi. import antigravity, Apakah saya benar? : P
Ini adalah sistem yang agak dinamis, karena tidak selalu berperilaku secara konsisten, untuk alasan apa pun. Saya mendapat beberapa skor menggunakannya.
Juga punya 30k satu, tapi yang satu itu dibuang oleh server karena suatu alasan. Tidak sepenuhnya yakin apa yang terjadi di sana, tetapi mungkin karena metode ini tidak disempurnakan dengan benar pada saat itu.
Beberapa unicorn dibebaskan dalam pengujian bug ini. #SaveTheUnicorns
Sama seperti percobaan lainnya, lompat untuk memulai permainan, jeda eksekusi, buka konsol.
this.tRex.config.DROP_VELOCITY = 0
this.tRex.config.GRAVITY = 0
this.tRex.config.INITIAL_JUMP_VELOCITY = -100
Dalam pengujian saya, ini memiliki beberapa keberhasilan yang bervariasi. Dalam beberapa kasus, unicorn menghilang. Dalam kasus lain, itu berhenti dan tidak jatuh kembali, dan masih dalam kisaran beberapa rintangan. Dalam hal ini, jeda ulang game, setel DROP_VELOCITY = -1
. Jendela harus tetap fokus dan situs web itu sendiri tidak dapat disentuh, tetapi saya mendapat 2,4k lagi di papan peringkat berkat itu.
Setelah menetapkan negatif DROP_VELOCITY
, Anda mungkin harus melompat ulang untuk terbang menjauh , tetapi juga terus memulai ulang, jadi jika gagal pada putaran 1, mudah untuk memulai kembali dan terbang jauh pada putaran 2.
Jika ada opsi pertama (unicorn menghilang), langkah pemutusan gravitasi terakhir dari jawaban saya sebelumnya masih berlaku; ketika senang dengan skornya, jeda eksekusi dan this.gameOver()
di konsol. Ini harus menghentikan permainan dan mengirimkan skor.
Mari retas JavaScript itu sendiri!
Langkah 1. Instal Resource Override
Bekerja di Microsoft Edge (berbasis Chromium) juga.
Penafian : Saya tidak berafiliasi dengan ekstensi Chrome ini.
Langkah 2. Buka Kode Microsoft Visual Studio (atau JetBrains WebStorm jika Anda mau)
Ambil file JavaScript dari sini: https://cdn.sstatic.net/Winterbash/js/hd.min.js. Simpan di suatu tempat.
Direkomendasikan : Gunakan formatter (seperti VSCode Prettier ) pada kode untuk navigasi yang lebih mudah.
Penafian 2 : Saya tidak berafiliasi dengan Microsoft VSCode atau JB WS, saya juga tidak berafiliasi dengan ekstensi VSCode Prettier.
Langkah 3. Edit file JavaScript yang Anda unduh dari Langkah 2
Asumsikan Anda mendandani file, kode berikut harus berada di baris 126:
function s(n, t, i, r, u, f, e)
Pergi ke fungsi ini (Tip Pro: Cari s(
dengan kecocokan seluruh kata dihidupkan), dan cari pernyataan berikut:
this.xPos = r.WIDTH + (e || 0);
Ubah (e || 0)
ke 0
dan simpan file.
Langkah 4. Buka Resource Override
Dalam bahasa sehari-hari, saya akan menyebut ekstensi ini sebagai RO selanjutnya.
Klik Add Ruleke kanan
Pilih
URL → File
, baris baru akan muncul di bawahMasukkan ini ke bilah URL:
https://cdn.sstatic.net/Winterbash/js/hd.min.js?*
Pilih
Edit File
di sebelah kanan bilah URL, dan tempel file yang diedit dari Langkah 3 masuk PilihSave & Close
di kanan bawah.
Langkah 5. Buka Hat Dash dan segarkan halaman. Mulai bermain
RO akan menggantikan JS dengan versi yang Anda edit. Sekarang tidak akan ada kendala.
Langkah 5.1. Tunggu beberapa saat hingga Anda mendapatkan skor yang diinginkan. Beralih ke hal lain selain browser Anda.
Ini akan mengakhiri permainan dengan skor saat ini. Selamat bersenang-senang!
Cara yang lebih cepat. Salin semua langkah-langkah dari saya metode lain curang , tapi kali ini, masukkan perintah lain: Runner.instance_.setSpeed(10000)
. Ini memutar kecepatan Unicorn, jauh ke atas. Ini akan melompat dari garis dengan sangat cepat, jadi Anda perlu menekan panah atas untuk membuatnya bergulir.
Bagi mereka yang tertarik dalam melihat Uni belakang hambatan, cukup tambahkan baris ini: Runner.instance_.setSpeed(-1)
.
Catatan: dengan heuristik anti-kecurangan yang baru, jawaban ini tidak lagi berfungsi. Lihat yang ini untuk metode kerja.
TL; DR:
(async () => {
Runner.gameStarted();
Runner.setCurrentScore(someScore);
await new Promise(resolve => setTimeout(resolve, seconds * 1000));
Runner.gameEnded();
})();
Ganti someScore
dan seconds
sesuai.
Lakukan ini dengan tangan
Ini adalah metode yang saya menipu, kemudian saya menyadari, itu persis sama dengan potongan kode di atas.
Pertama, saya mengamati bahwa beberapa POST
permintaan dilakukan saat permainan dimulai dan diakhiri: /hat-dash/start
dan /hat-dash/end
.
Permintaan pertama mengirimkan parameter
startedAt
yang merupakan waktu (milidetik sejak Epoch). Tanggapan adalah kunci auth:{"auth":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}
.Permintaan kedua memiliki beberapa parameter:
startedAt
: waktu, itu harus sama dengan permintaan sebelumnya.score
: poin total game.authKey
: kunci autentikasi yang Anda dapatkan di permintaan sebelumnya.durationMs
: durasi game dalam milidetik.- banyak
histKeys[]
parameter yang menyimpan kunci autentikasi sebelumnya termasuk yang terbaru, mungkin diperoleh darilocalStorage
. Jika Anda ingin melihat milik Anda, larilocalStorage.getItem('Game_AuthKeys').split('|');
.
Maka itu cukup mudah:
Mainkan permainan singkat, sehingga permintaan ini selesai.
Buka tab Jaringan → klik kanan pada
/hat-dash/start
permintaan terbaru → Salin → Salin sebagai pengambilan. Tempel di konsol dan ubah"body": "startedAt=xxxxxxx"
ke"body": "startedAt=" + new Date().getTime()
.Tunggu beberapa detik, agar skor yang kamu masukkan setelahnya terlihat nyata dan Yaakov tidak menyadarinya 😇.
Selanjutnya, salin
/hat-dash/end
permintaan terbaru dan:- Dapatkan
startedAt
dari/hat-dash/start
permintaan sebelumnya dan ganti dengan tanggal yang Anda dapatkan sebelumnya (Jaringan → Permintaan → gulir hingga Anda melihat Data Formulir). - Gantilah skor dengan skor yang Anda inginkan.
- Ganti
authKey
dengan nilai yang Anda dapatkan dari respons permintaan sebelumnya. - Ganti
...&durationMs=xxxxx...
ke...&durationMs=" + (new Date().getTime() - previousStartedAt) + "...
. - Biarkan sisa
histKeys[]
tidak berubah, tambahkan hanya&histKeys%5B%5D=newestAuthKey
ke string.
- Dapatkan
Daripada mengedit Javascript, mengapa tidak mengirim POST
permintaan? (Salin dan tempel ke konsol browser Anda)
var startedAtNow = Date.now();
var authkey = "";
var n = {};
$.ajax({ type: "POST", url: "hat-dash/start", data: { startedAt: Date.now() }, dataType: "json", success: function(t) { authkey = t.auth }, error: function(n) { console.log("error starting game"); console.log(n) }, done: function() { this.pendingGameStart = null } }) function doend() { $.ajax({
type: "POST",
url: "hat-dash/end",
data: {
startedAt: startedAtNow,
score: Number(6942069420), // You can change this
authKey: authkey,
durationMs: 12345, // You can change this
histKeys: localStorage.getItem("Game_AuthKeys").split("|")
},
dataType: "html",
success: function(t) {
authkey = null;
n.pendingGameEnd = !1;
n.pendingGameStartedAt && ($.ajax({ type: "POST", url: "hat-dash/start", data: { startedAt: Date.now() }, dataType: "json", success: function(t) { authkey = t.auth }, error: function(n) { console.log("error starting game"); console.log(n) }, done: function() { this.pendingGameStart = null } }))(); $(".js-stats-data").remove();
$(".js-personal-stats").append(localStorage.getItem("Game_AuthKeys"))
},
error: function(n) {
console.log("error ending game");
console.log(n)
}
})
}
setTimeout(doend, 12345); // 12345 should be >= durationMs
Saya baru saja memeriksa kode sumber dan menemukan. Komentar tersebut menjelaskan apa yang harus Anda ubah. Saya akan merekomendasikan Anda untuk mengatur waktu yang realistis untuk skor tersebut.
Pada dasarnya, score: Number(x)
adalah skor yang Anda dapatkan, x adalah skor yang Anda inginkan. durationMs: y
adalah berapa lama waktu yang Anda inginkan, y adalah jumlah milidetik. setTimeout(doend, z)
harus menunggu beberapa milidetik lagi daripada durationMs
mensimulasikan fakta bahwa proses sebenarnya terjadi dalam waktu nyata. Sisa kode diambil dari javascript yang sebenarnya . Ini hanya mengambil data dan mengirimkannya ke server Stack Exchange melalui jQuery AJAX POST.
Bukti:
Terima kasih telah mengizinkan kami bersenang-senang :-)
Inilah pendekatan saya:
const origGameOver = Runner.prototype.gameOver;
Runner.prototype.gameOver = function() {
if (this.runningTime > 133700) {
this.lastSurrentScoreText = "9001";
this.currentStartedAt = Date.now() - 133700;
return origGameOver.call(this);
}
}
Saya terus bertabrakan (secara tidak sengaja, tentu saja!) Dengan rintangan, tetapi permainan tidak akan berakhir sampai saya bermain selama 133,7 detik. Kalau tidak, saya bermain normal, dengan kode asli di tempat untuk mengumpulkan tombol yang ditekan dan mengirim permintaan standar.
Karena rintangan dibuat secara acak di klien, Anda tidak akan memiliki kesempatan untuk mendeteksinya di sisi server.
Sayangnya selama tes pertama saya belum menemukan cara yang benar agar waktu yang diharapkan dikirim ke server dengan benar (muncul sebagai 134-an detik), tetapi tidak menindaklanjutinya untuk menghindari mengotak-atik highscore terlalu banyak.
Anda juga dapat menggunakan perintah ini:
Runner.instance_.distanceRan = 100000 / Runner.instance_.distanceMeter.config.COEFFICIENT
Untuk memulai Unicorn dari skor tertentu, dalam hal ini, 100 ribu.
Saya tidak yakin apakah Anda mempertimbangkan untuk menggunakan tablet dengan keyboard yang curang atau hanya kombinasi mekanik yang cerdas, tetapi saya pikir saya akan menautkannya untuk berjaga-jaga:
https://meta.stackexchange.com/a/358130/718314
Memainkan game di layar sentuh dengan keyboard membuat game sedikit lebih mudah karena panah bawah yang terbang dapat dikonfigurasi agar lebih mudah.
(Jika ini curang, jangan hapus skor saya! Saya hanya menemukannya dalam setengah jam terakhir, jadi hanya lari terbaru saya yang dilakukan dengan ini 😅 Tidak ada yang masuk papan peringkat sepanjang waktu)
Pertama saya modifikasi kode anti cheat yang di fungsikan l()
untuk meminta url ( /bam-me...
) yang salah agar tidak di banned jika saya melakukan kesalahan.
Kemudian, saya mengubah kode untuk mengakhiri permainan saat colliding ( f ? (this.gameOver(), this.crashed || l('rewrote gameOver function')) : ...
) untuk mengubah kondisi menjadi f && !1
- ini berarti permainan tidak berhenti jika saya menabrak rintangan.
Selanjutnya, saya memainkan game seperti biasa untuk mencegah analitik sisi server memperhatikan saya. Ketika saya ingin mati, saya menekan alt-right untuk meninggalkan tab, yang memanggil gameOver()
(karena fokus hilang) dan memberi tahu server bahwa saya mati.
Tentu saja, semua hal di atas mengharuskan saya memasukkan JS kustom ke halaman. Untuk menghindari potensi masalah seputar reload event handler, saya menggunakan ekstensi FF 'Request Injector' yang memungkinkan saya untuk mengubah respons untuk permintaan apa pun. Saya bisa, tentu saja, menggunakan file lokal untuk memodifikasi HTML, tapi itu merusak semua URL relatif, jadi aset yang digunakan di halaman tidak dimuat dan saya tidak bisa melihat unicorn: '(. Dan menggunakan file JS lokal dalam HTML jarak jauh gagal karena perlindungan file: /// URL, jadi saya menggunakan del.dog untuk meng-host kode JS baru.
Saran saya untuk memblokir ini adalah dengan menambahkan integrity=...
atribut di <script src="sstatic...">
tag di HTML, yang setidaknya berarti orang harus berusaha mencari-menggantikan semua URL relatif untuk memodifikasi JS.
Server juga dapat memblokir semua permintaan untuk mengakses /run-with-the-hats
kecuali jika permintaan tersebut benar Referrer
, dan pemeriksaan sisi klien untuk itu dapat ditambahkan ke JS juga oleh document.referrer
(ini berguna sehingga Anda harus memasukkan jumlah maksimum halaman ke interseptor permintaan Anda, membuatnya lebih menjengkelkan untuk memodifikasi JS)
Saya pikir saya seharusnya tidak menulis ini sebagai jawaban, tetapi saya tidak menemukan tempat lain untuk menulisnya. 2 hari yang lalu saya curang dengan mengubah kecepatan lompatan (sudah diperbaiki sekarang). Tapi skor saya ada di papan peringkat:
Saya hanya ingin itu dihapus
Saat ini, saya tidak sengaja mengubah tab browser setelah menekan Space. Saya bergabung kembali dan unicorn itu hilang. Tapi permainan berjalan dan mengeluarkan suara.
Di Google Chrome, di Windows 10.
Anda bisa melihatnya di sini: https://youtu.be/8MZrcbZttHY
Menemukan cara sederhana untuk menipu yang tidak memerlukan pengkodean apa pun.
- Buka permainan: Berlari dengan topi
- Mulai bermain dan setelah beberapa saat, perbesar / perkecil halaman. Ini menyebabkan permainan berhenti
- Tunggu beberapa saat dan kemudian tekan spasi untuk melanjutkan permainan. Setelah permainan dilanjutkan, skor Anda akan lebih tinggi. (Semakin Anda menunggu semakin tinggi)
Iya! Saya dapat menghapus event listener dan objek default, dan menimpa Javascript sisi klien dengan versi yang dimodifikasi. Versi yang dimodifikasi memiliki baris tambahan:
n.livesLeft = 1000;
(di mana nilainya dapat diatur agak sewenang-wenang) yang saya masukkan (sekali lagi, agak sewenang-wenang) setelahnya
n.defaultDimensions = {
WIDTH: y,
HEIGHT: 150
};
dan mengganti logika deteksi tabrakan
if (f && ut(f, a, v), y) return [a, v]
dengan
if (f && ut(f, a, v), y) {
n.livesLeft--;
if(n.livesLeft<=0) {
return [a,v];
}
}
Ini sebagian besar berfungsi, tetapi akhirnya game tersebut mengalami bug. Secara khusus, dalam fungsi pembaruan, ada garis
this.currentSpeed < this.config.MAX_SPEED && (this.currentSpeed += this.config.ACCELERATION))
Karena perbedaan antara kecepatan awal dan kecepatan maks bukanlah kelipatan yang tepat dari parameter ACCELERATION default, hal ini dapat menyebabkan kecepatan melebihi kecepatan maksimum. Kemudian, saat melompat, fungsi startJump () memeriksa kecepatan saat ini terhadap MAX_SPEED dan memicu autoban untuk melompat terlalu cepat. Perbaikan untuk ini, yang seharusnya dalam aslinya, adalah mengubah segmen itu menjadi
(this.currentSpeed + this.config.ACCELERATION) < this.config.MAX_SPEED && (this.currentSpeed += this.config.ACCELERATION))
Meskipun dimungkinkan untuk menetralkan kode autoban dalam modifikasi skrip, hal itu tidak terlalu diperlukan, terutama setelah perbaikan bug.
Dengan modifikasi ini, Anda tetap harus memainkan game tersebut, dan skor akhir Anda akan terkait dengan seberapa baik Anda bermain. Perbedaannya hanyalah bahwa ini bukan permainan berakhir pada tabrakan pertama; itu cukup memaafkan dengan berapa banyak tabrakan yang bisa Anda miliki sebelum pertandingan berakhir.
Saya tidak yakin bagaimana teknik ini dapat dengan mudah dipertahankan dengan arsitektur saat ini dan jumlah informasi yang dikirim ke server.
Terkadang, kode validasi sisi server menandai game sebagai tersangka, tetapi mungkin saja berada dalam kategori umum "terlalu baik", atau mungkin membandingkan jumlah lompatan dengan jumlah rintangan yang diharapkan. Ini akan membutuhkan beberapa eksperimen atau melihat kode sisi server untuk mencari tahu apa frekuensi lompatan yang tepat, dan kemudian memodifikasi kode yang mengirimkan jumlah lompatan di pos pemeriksaan dan akhir permainan. Saya akan melakukan bagian itu sebelum menyelesaikan posting ini, tetapi cukup banyak minggu dan sisa Winter Bash telah berlalu tanpa menemukan waktu untuk melakukan itu, jadi saya akan melewatkan langkah terakhir yang dapat membuatnya tidak berfungsi. dari waktu ke waktu. Saya pikir itu masih memuaskan apa yang dicari posting itu.
Saya dapat mengubah skor dengan mengedit Number
fungsi. Ketika diganti, kode tersebut mencoba untuk mengubah string skor menjadi angka pada baris 1168 dari kode Firefox yang cukup dicetak dan menjalankan fungsi kustom sebagai gantinya. Tempel kode ini ke konsol JavaScript:
function Number(n) {
return 1000000;
}