Chrono Mock
BahasaBahasa Indonesia

Bagaimana Anda tahu itu berhasil?

Dengan alat lain sejenis ini, Anda tidak tahu. Aplikasi menyala, menampilkan suatu tanggal, dan Anda berasumsi. Padahal aplikasi bisa membaca jam lewat jalur yang tidak dicegat apa pun - dan saat itu “pengujian lulus” sama sekali tidak berarti.

Kegagalan yang tidak punya gejala

Alat penggeser waktu yang melewatkan satu kanal tidak crash dan tidak memperingatkan. Aplikasi sekadar membaca tanggal asli lewat satu fungsi yang tidak di-hook siapa pun, dan berperilaku persis seperti pada sore biasa mana pun. Pengujian menjadi hijau. Bug dirilis.

RunAsDate jujur soal ini dalam dokumentasinya sendiri - ia menyatakan ia “tidak akan memengaruhi aplikasi yang mengambil tanggal/waktu saat ini dari sumber lain” - lalu membiarkan Anda mencari tahu sendiri apakah aplikasi Anda salah satunya. Alat ini memperlakukan kalimat yang sama itu sebagai sesuatu yang diukur.

Apa yang sebenarnya dilaporkan sebuah sesi

Keluaran nyata, dari menjalankan alat ini terhadap salah satu probe uji milik proyek ini - probe yang sengaja membuka koneksi jaringan:

$ chrono run "...\pnet-x64.exe" --at 2038-01-19T03:14:07 --report session.txt

Chrono Mock - session report
  target:   C:\ChronoMock\tools\probes\bin\pnet-x64.exe
  verdict:  WORKS - time substitution took effect  (processes: 1)
            every process that read time saw the session clock
  session:  fake clock reached 2038-01-19T03:14:10
            real elapsed 3.4s, fake elapsed 3.4s
  exited:   the target closed itself with code 0
  covered channels (substituted, with call counts, 4 calls in all):
            - pid 9152: GetSystemTimeAsFileTime (1 call)
            - pid 9152: NtQuerySystemTime (3 calls)
            ... every other channel, including the ones never called
  observed channels (hooked but left real):
            - pid 9152: NtCreateUserProcess (0 calls)
            - pid 9152: connect (1 call)
  warnings:
            - the target opened a network connection - it may read time from a
              server, which no local hook can cover (source.network_at_start)
  requested:  2038-01-19T03:14:07 (zone +02:00 (host default), mode flow)

Dua blok terakhir adalah intinya. Tidak ada yang gagal di sini - putusannya adalah berhasil - dan laporan tetap menyatakan, tanpa diminta, bahwa aplikasi ini berbicara dengan jaringan sebelum selesai, sehingga hook lokal mungkin bukan keseluruhan ceritanya. Kalimat itulah perbedaan antara pengujian yang dapat Anda percaya dan yang tidak.

Layar hasil Chrono Mock dengan What the application read terbuka: tabel berisi Function, Read from, dan Reads. NtCreateUserProcess ditandai dibaca dari jam nyata secara sengaja dan connect ditandai dibaca dari jam nyata secara sengaja serta di-hook terlambat, sedangkan baris lainnya - GetSystemTimeAsFileTime, NtQuerySystemTime, GetTimeZoneInformation, dan seterusnya - membaca dari jam palsu, masing-masing dengan hitungannya sendiri. Dua peringatan berada di bawah tabel.
Jawaban yang sama di jendela. Setiap fungsi yang dapat ditanyakan aplikasi, dari mana ia benar-benar membaca, dan berapa kali - termasuk yang sengaja dibiarkan pada jam nyata, yang disebutkan namanya, bukan diam-diam dihitung sebagai lulus.

Empat putusan, dan satu kode keluar untuk masing-masing

Putusan dicapai dari dalam proses yang berjalan, sebelum Anda mulai bekerja, dan merupakan kode keluar alat itu sendiri sehingga pipeline dapat bercabang berdasarkan itu.

PutusanKeluarArti
berhasil0setiap proses yang membaca waktu melihat jam sesi
berhasil sebagian10sebagian kanal tercakup, sebagian tidak - yang tidak tercakup didaftarkan
tidak berhasil11penggantian tidak sampai ke kanal-kanal kunci
tidak dapat ditentukan4cakupan tidak dapat dipastikan - “saya tidak tahu” yang jujur

Ketika putusannya “tidak berhasil”, proses segera dihentikan, sebelum Anda dapat berinteraksi dengannya. Putusan tidak dapat mendahului peluncuran, karena satu-satunya sumber kebenaran adalah pembacaan yang diambil dari dalam proses yang berjalan. Yang dijamin adalah Anda mengetahui kebenarannya sebelum mulai bekerja - bukan bahwa peluncuran yang ditakdirkan gagal tidak pernah terjadi. Anda dapat menimpanya dan melanjutkan, dan sesi lalu ditandai tidak andal di mana pun ia muncul, termasuk pada bukti apa pun yang Anda ekspor.

Kode lain menyatakan bahwa yang gagal adalah jalannya itu sendiri, bukan penggantian - kesalahan penggunaan, target yang tidak bisa dijalankan, jalannya yang terpotong, sesi lain yang sudah berjalan - dan tidak satu pun adalah putusan. Tabel lengkapnya ada di referensi baris perintah.

Tercakup, diamati, tidak tercakup

Kanal terbagi dalam tiga kelompok, dan yang di tengah adalah yang menarik.

  • Tercakup - di-hook dan diganti. Aplikasi bertanya, dan mendapat jam sesi. Hitungan panggilan menyatakan berapa kali.
  • Diamati - dicegat, dihitung, dan sengaja dibiarkan berkata jujur. Di sini ada penantian objek, karena memperpendek batas waktunya bisa memalsukan habis waktu pada handle sungguhan, dan pewaktu multimedia, karena menskalakannya akan menggeser waktu audio dan MIDI - keduanya dipantau saat sesi menskalakan sumbu waktu berlalu. Koneksi jaringan dan satu jalur pembuatan proses ada di sini di setiap sesi, karena keduanya bukti, bukan jam. Penghitung resolusi tinggi tidak ada di kelompok ini: ia dibiarkan apa adanya kecuali Anda memintanya dengan --scale-qpc, dan saat itu ia tercakup.
  • Tidak tercakup - kanal yang dibaca aplikasi yang tidak dijangkau penggantian. Inilah yang mengubah putusan menjadi berhasil sebagian, dan ia didaftarkan namanya, bukan diringkas sampai hilang.

Hitungan nol juga informasi: kanal itu di-hook dan aplikasi tidak pernah bertanya. Itulah sebabnya laporan mendaftarkannya, bukan menyembunyikannya.

Apa yang tidak dapat dilihat audit

Laporan jujur soal cakupan, yang berarti jujur pula soal batasnya sendiri. Ini dibaca tanpa panggilan fungsi apa pun yang dapat dicegat, atau sepenuhnya di luar proses:

  • pembacaan langsung halaman data bersama mode pengguna - nilainya ada di memori, sehingga tidak ada yang bisa di-hook. Jarang pada aplikasi biasa, lazim pada kode pelisensian dan anti-tamper
  • system call langsung yang melewati ekspor standar - pola yang sama
  • waktu yang diperoleh di luar proses, melalui WMI, server COM di luar proses, atau RPC
  • waktu dari jaringan - header HTTP Date, NTP, respons API, atau jam server database itu sendiri
  • waktu dari driver kernel

Kasus jaringan adalah yang setidaknya dapat disadari audit, itulah sebabnya peringatan dalam laporan di atas ada. Untuk sisanya, putusan berhasil berarti kanal yang dapat dilihat alat ini tercakup - bukan bahwa tidak ada jalur lain.

Dalam pipeline

--json mengeluarkan fakta yang sama dalam bentuk mesin, --report menulis versi untuk manusia ke file, dan sesi yang putusannya selain berhasil membuka file itu dengan banner bukti tidak andal, bukan mengubur peringatan di bagian bawah.

chrono run "C:\apps\test.exe" --at 2027-12-31T23:59:59 --json --report evidence.txt

Cobalah