Debug Pesan Asli – teks/polos

Pendahuluan

Bulan lalu, pelanggan Perusahaan menghubungi untuk melaporkan bahwa ekstensi browser pihak ketiga yang mereka gunakan tidak berfungsi dengan benar. Investigasi ekstensi mengungkapkan bahwa ekstensi browser mengandalkan pendamping Native Messaging Host (NMH) yang berjalan di luar kotak pasir browser. Dalam meninjau log Monitor Proses yang disediakan oleh pelanggan, Insinyur Dukungan dan saya mengamati bahwa Host Pesan Asli yang dapat dieksekusi tiba-tiba keluar puluhan menit setelah dimulai. Setelah keluar yang tidak terduga itu, saat berikutnya ekstensi dalam browser mencoba memanggilnya, panggilan browser-ke-asli gagal, dan ekstensi browser tidak dapat menyediakan fungsionalitas yang dimaksudkan.

Sayangnya, saya tidak memiliki sumber (atau bahkan biner) untuk NMH yang dapat dieksekusi, dan tidak ada petunjuk yang jelas dalam log Monitor Proses (mis. registri yang gagal membaca atau menulis) yang mengungkapkan masalah mendasar. Saya mengeluh kepada Insinyur Dukungan bahwa saya benar-benar berharap kami dapat melihat pesan JSON dipertukarkan antara ekstensi browser dan NMH untuk melihat apakah mereka dapat mengungkapkan akar masalahnya.

Kami membutuhkan, seperti, Fiddler, tetapi untuk pesan NMH, bukan pesan HTTPS.”

Seberapa Sulitkah?

Secara teknis, saya tidak benar-benar memiliki apa pun yang terkait dengan ekstensi browser, jadi setelah mengesampingkan beberapa kemungkinan masalah yang dapat saya bayangkan sebagai penyebab utama, saya beralih ke tugas lain.

Tetapi penglihatan itu melekat pada saya sepanjang hari dan malam berikutnya: Fiddler, tetapi untuk Pesan Asli.

Seberapa sulitkah membangun itu? Seberapa berguna?

Saya belum pernah menulis banyak kode C# sejak meninggalkan Fiddler dan Telerik pada akhir tahun 2015, dan beberapa pengecualian (misalnya NetLog Importer) sebagian besar merupakan plugin untuk Fiddler daripada aplikasi yang berdiri sendiri. Tetap saja, Pesan Asli adalah jauh kurang rumit dari HTTPS, jadi seharusnya tidak juga keras, kan?

Kami menginginkan fitur berikut:

  1. Tampilkan pesan dari ekstensi browser ke aplikasi asli apa pun
  2. Aktifkan logging pesan-pesan ini ke file
  3. Izinkan menulis pesan sewenang-wenang di kedua arah
  4. (Peregangan tujuan) Izinkan modifikasi pesan

Selama beberapa malam berikutnya, saya membersihkan Visual Studio IDE saya dan berjuang untuk mengingat bagaimana pemrograman async C# bekerja di zaman modern (implementasi Fiddler adalah berat berulir dan sebagian besar mendahului alternatif yang lebih modern).

Memperkenalkan NativeMessaging Meddler

Sumber dan (segera) kode yang dikompilasi untuk NativeMessaging Meddler dapat diunduh dari GitHub.

NativeMessaging Meddler (NMM) adalah aplikasi Windows yang membutuhkan .NET 4.8. Garis tab di bagian bawah memungkinkan Anda untuk beralih antar tab; secara default, menjalankan .exe langsung hanya menampilkan teks bantuan:

Alat NMM dapat merespons NativeMessages dari ekstensi browser itu sendiri, atau dapat proxy pesan antara ekstensi yang ada dan NMH yang ada yang dapat dieksekusi.

Konfigurasikan Demo

Untuk menguji fungsionalitas dasar alat, Anda dapat menginstal Ekstensi Demo.

  1. Mengunjungi about://extensions
  2. Aktifkan Mode pengembang beralih
  3. Dorong Muat Dibongkar tombol
  4. Pilih sample-ext map
  5. Ikon “N” baru muncul di bilah alat

Setelah ekstensi demo diinstal, Anda sekarang harus mendaftarkan aplikasi NativeMessaging Host. Untuk melakukannya, perbarui manifes:

  1. Sunting manifest.json file menggunakan Notepad atau editor serupa
  2. Mengatur path bidang ke path lengkap ke .exe. Pastikan bahwa setiap garis miring terbalik digandakan.
  3. Mengatur allowed_origins bidang berisi nilai ID ekstensi dari about:extensions halaman.

Selanjutnya, perbarui registri agar browser dapat menemukan Host Anda:

  1. Sunting InstallRegKeys.reg file di Notepad, memperbarui jalur file untuk menunjuk ke lokasi manifest.json mengajukan. Pastikan bahwa setiap garis miring terbalik digandakan.
  2. Klik dua kali file InstallRegKeys.reg untuk mengimpornya ke registri.

Jalankan Demo

Dengan host dan ekstensi terpasang, Anda sekarang dapat menguji alat ini. Klik ikon “N” dari ekstensi di bilah alat untuk menavigasi ke halaman demonya. Sebuah instance dari NMM akan terbuka secara otomatis.

Jenis Halo Dunia! dalam Pesan Keluar kotak dan klik Kirim Pesan ke port. Pesan akan muncul di Memantau tab di dalam aplikasi NMM:

Jika Anda mencentang Refleksikan ke ekstensi opsi di kanan atas dan mengirim pesan lagi, Anda harus alat NMM menerima pesan dan kemudian mengirimkannya kembali ke ekstensi, di mana itu ditampilkan di Pesan masuk bagian:

Pergi ke Penyuntik tab di NMM dan ketik pesan JSON sederhana di kotak bawah. Kemudian klik Kirim ke Browser/Ekstensi tombol. Anda akan melihat pesan muncul di dalam browser di bagian Pesan Masuk:

Pada titik ini, kami sekarang telah berhasil menggunakan alat NMM untuk menerima dan mengirim pesan dari ekstensi Demo kami.

Pesan Proksi

Meskipun demo kami bagus untuk menguji Native Messaging, dan mungkin membantu sebagai tiruan jika kami mengembangkan ekstensi baru yang menggunakan Native Messaging, inti dari latihan ini adalah untuk memata-matai komunikasi dengan ekstensi dan host yang ada.

Mari kita lakukan itu.

Pertama, pergi ke Konfigurasikan Host tab, yang merendahkan registri untuk menemukan semua Host Pesan Asli yang saat ini terdaftar di PC Anda:

Rencananya adalah pada akhirnya membuat penyadapan Host apa pun menjadi pengalaman tunjuk dan klik, tetapi untuk saat ini, kami hanya menggunakan tab ini untuk menemukan lokasi Host yang ingin kami cegat. Jika entri muncul beberapa kali, pilih instans dengan skor Prioritas terendah.

Misalnya, katakanlah kami tertarik dengan Host “BrowserCore” yang digunakan dalam beberapa skenario otentikasi Windows-ke-Web. Kami melihat lokasi file manifes, serta nama EXE yang diekstraksi dari file manifes:

Dalam beberapa kasus, Anda mungkin menemukan bahwa Exe pertunjukan lapangan ??? seperti pada entri vidyo di atas. Ini terjadi jika file manifes gagal diuraikan sebagai JSON legal. Chromium menggunakan yang dipesan lebih dahulu Pengurai JSON dalam mode longgar untuk parsing manifes, dan itu mengizinkan komentar bergaya JavaScript. Alat NMM menggunakan parser JSON yang ketat dan gagal menguraikan komentar tersebut. Itu tidak terlalu penting untuk tujuan kita.

Catat lokasi file manifes dan buka di editor pilihan Anda. Catatan: Jika file berada di lokasi yang diistimewakan, Anda mungkin perlu membuka editor yang ditinggikan (sebagai Administrator).

Kiat: Anda bisa Alt+DblClick item atau hit Alt+Enter dengan itu dipilih untuk membuka Windows Explorer ke lokasi manifes).

Di dalam manifes, ubah path lapangan dengan memperkenalkan kata .proxy sebelum .exe di akhir nama file:

Simpan file.

Catatan: Dalam beberapa kasus, bahkan Administrator tidak akan dapat menulis file secara default. Dalam kasus seperti itu, Anda harus menggunakan izin Administrator untuk mengambil kepemilikan file untuk memberi diri Anda izin untuk memodifikasinya. Ada pendekatan lain yang tidak memerlukan perubahan izin sistem file, tetapi kami tidak akan membahasnya di sini.

Selanjutnya, salin nmf-view.exe file ke dalam folder dan ganti namanya menjadi nama file yang Anda tulis ke manifes:

Pada titik ini, Anda telah berhasil menginstal proxy NMM. Ketika ekstensi browser berikutnya mencoba meluncurkan Host Pesan Asli, itu malah akan mengaktifkan aplikasi NMM kami, yang pada gilirannya akan menelurkan Host asli (dalam contoh ini, BrowserCore.exe) dan proxy semua pesan di antara keduanya.

Sekarang, kunjungi situs tempat Anda dapat masuk, seperti https://office.microsoft.com. Klik tombol masuk di kanan atas dan amati bahwa aplikasi kami muncul, mengumpulkan permintaan dari ekstensi Akun Windows 10, meneruskannya ke BrowserCore.exe Host, membaca balasan Host, dan meneruskannya kembali ke ekstensi. Kita dapat membaca teks lengkap dari pesan JSON di kedua arah:

Catatan: Tangkapan layar ini diedit karena mengandung rahasia

Cukup rapi, ya?

Merusak Pesan

Ketika saya mendapatkan semua ini bekerja, saya bersemangat. Tapi saya juga kecewa… rendering plaintext dari JSON tidak terlalu mudah dibaca, dan membangun UI untuk mengedit pesan akan membutuhkan banyak pekerjaan ekstra. aku menyesal sheesh… Saya sudah menulis semua kode yang saya inginkan lima belas tahun yang lalu untuk Fiddler. Ini memiliki rendering JSON dan pengeditan pesan… dan saya secara singkat mengeluhkan fakta bahwa saya tidak lagi memiliki Fiddler dan tidak bisa begitu saja menyalin sumbernya.

Dan kemudian saya punya pencerahan. Saya tidak perlu menyalin kode sumber dari Fiddler ke NMM. Mereka hanya bisa bekerja sama! NMM dapat meneruskan pesan yang diterimanya dari Ekstensi Browser dan Host Asli ke Fiddler saat diterima, dan jika Fiddler memodifikasi pesan, NMM dapat menggunakan pesan yang dimodifikasi.

Eureka!

Konfigurasikan Tampering

Pertama, edit ulang manifest.json file untuk menambahkan .fiddler komponen ke jalur, dan ganti nama menjadi .proxy.exe mengajukan ke .proxy.fiddler.exe, seperti:

Teks baru ini menandakan bahwa Anda ingin NMM memulai dengan Tamper using Fiddler kumpulan opsi. Untuk men-debug Host Asli single-shot seperti BrowserCore.exe, kita tidak bisa hanya menggunakan kotak centang di NMM UI, karena aplikasi memunculkan dan menyelesaikan tugasnya jauh lebih cepat daripada yang bisa kita lakukan dengan mengklik mouse.

Sekarang, mulai Fiddler, mungkin menggunakan -noattach argumen baris perintah sehingga tidak terdaftar sebagai proxy sistem. Jenis bpu ToApp di kotak QuickExec di bawah daftar Sesi Web dan tekan Enter.

Ini membuat breakpoint permintaan yang akan diaktifkan untuk semua permintaan yang urlnya berisi string ToApp, yang digunakan NMM untuk permintaan yang dikirim ke Host Asli asli:

Dengan menggunakan Inspektur, kita dapat memeriksa JSON pesan menggunakan tampilan hierarki JSON, atau Inspektur TextView atau SyntaxView:

Jika kami puas dengan pesan tersebut, klik tombol Jalankan hingga Selesai, dan aplikasi NMM kami akan mengirimkan pesan asli yang tidak dimodifikasi ke Host Asli asli. Namun, jika kami ingin mengutak-atik pesan, pilihlah respons yang berhasil seperti 200_SimpleHTML.dat dari tarik-turun:

Respons template akan muncul di Response TextView:

Timpa teks template itu dengan teks modifikasi yang ingin Anda gunakan sebagai gantinya:

… lalu dorong hijau Run to Completion tombol. Fiddler akan mengembalikan teks yang dimodifikasi ke proksi NMM, dan proksi NMM kemudian akan meneruskan pesan yang dimodifikasi itu ke Host Asli asli:

Dalam hal ini, Tuan Rumah Asli asli tidak tahu apa yang harus dilakukan dengan GetFiddledCookies permintaan dan mengembalikan kesalahan yang diteruskan kembali ke browser.

Tip: Jika tujuan Anda adalah untuk mengutak-atik pesan yang dikirim dari Host Asli ke ekstensi, masukkan bpu ToExt di kotak QuickExec Fiddler sebagai gantinya. Anda juga dapat menggunakan salah satu fitur gangguan Fiddler yang lebih kaya, sehingga hanya rusak pada pesan yang berisi teks tertentu, secara otomatis menulis ulang pesan tertentu, dll.

Selamat Mencampur!

-Eric