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.
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.
| Putusan | Keluar | Arti |
|---|---|---|
| berhasil | 0 | setiap proses yang membaca waktu melihat jam sesi |
| berhasil sebagian | 10 | sebagian kanal tercakup, sebagian tidak - yang tidak tercakup didaftarkan |
| tidak berhasil | 11 | penggantian tidak sampai ke kanal-kanal kunci |
| tidak dapat ditentukan | 4 | cakupan 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