İşe yaradığını nereden bileceksiniz?
Bu türden başka her araçta bilemezsiniz. Uygulama açılır, bir tarih gösterir ve siz varsayarsınız. Oysa saati hiçbir şeyin yakalamadığı bir yoldan okuyabilir - ve o zaman “test geçti” hiçbir şey ifade etmez.
Belirtisi olmayan başarısızlık
Bir kanalı kaçıran bir zaman kaydırma aracı çökmez ve uyarmaz. Uygulama gerçek tarihi, kimsenin yakalamadığı tek işlev üzerinden okur ve sıradan herhangi bir öğleden sonra nasıl davranacaksa öyle davranır. Test yeşile döner. Hata yayına çıkar.
RunAsDate bu konuda kendi belgelerinde dürüsttür - geçerli tarih/saati “başka bir kaynaktan alan uygulamaları etkilemeyeceğini” söyler - ve sonra sizinkinin bunlardan biri olup olmadığını kendiniz bulmanıza bırakır. Bu araç aynı cümleyi ölçülecek bir şey olarak ele alır.
Bir oturum gerçekte ne bildirir
Gerçek çıktı; aracın bu projenin kendi test problarından birine karşı çalıştırılmasından - bilerek bir ağ bağlantısı açan bir prob:
$ 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)
Son iki blok asıl noktadır. Burada hiçbir şey başarısız olmadı - karar çalışıyor - ve rapor yine de, sorulmadan, bu uygulamanın işini bitirmeden önce ağla konuştuğunu, dolayısıyla yerel bir hook’un hikâyenin tamamı olmayabileceğini söylüyor. O cümle, güvenebileceğiniz bir test ile güvenemeyeceğiniz bir test arasındaki farktır.
Dört karar ve her biri için bir çıkış kodu
Karar, siz çalışmaya başlamadan önce, çalışan sürecin içinden verilir ve aracın kendi çıkış kodudur; böylece bir pipeline buna göre dallanabilir.
| Karar | Çıkış | Anlamı |
|---|---|---|
| çalışıyor | 0 | zamanı okuyan her süreç oturum saatini gördü |
| kısmen çalışıyor | 10 | bazı kanallar kapsandı, bazıları kapsanmadı - kapsanmayanlar listelenir |
| çalışmıyor | 11 | değişiklik kilit kanallara ulaşmadı |
| belirsiz | 4 | kapsama belirlenemedi - dürüst bir “bilmiyorum” |
Karar “çalışmıyor” olduğunda süreç hemen durdurulur; siz onunla etkileşime girmeden önce. Karar başlatmadan önce gelemez, çünkü tek gerçek kaynağı çalışan sürecin içinden alınan bir okumadır. Garanti edilen, çalışmaya başlamadan önce gerçeği öğrenmenizdir - mahkûm bir başlatmanın hiç olmayacağı değil. Geçersiz kılıp devam edebilirsiniz ve oturum, dışa aktardığınız her kanıt dahil göründüğü her yerde güvenilmez olarak işaretlenir.
Diğer kodlar, başarısız olanın ikame değil çalıştırmanın kendisi olduğunu söyler - bir kullanım hatası, başlatılamayan bir hedef, yarıda kesilen bir çalıştırma, zaten çalışan başka bir oturum - ve hiçbiri bir karar değildir. Tablonun tamamı komut satırı başvurusunda.
Kapsanan, gözlemlenen, kapsanmayan
Kanallar üç kovaya ayrılır ve ortadaki ilginç olanıdır.
- Kapsanan - yakalanmış ve değiştirilmiş. Uygulama sordu ve oturum saatini aldı. Çağrı sayısı kaç kez olduğunu söyler.
- Gözlenen - yakalanır, sayılır ve bilerek doğruyu söylemeye bırakılır. Nesne beklemeleri buradadır, çünkü bekleme süresini kısaltmak gerçek bir tanıtıcıda zaman aşımı taklidi yapabilir, ve çoklu ortam zamanlayıcısı da buradadır, çünkü onu ölçeklemek ses ve MIDI zamanlamasını kaydırır - ikisi de oturum geçen süre eksenini ölçeklediğinde izlenir. Ağ bağlantıları ve bir süreç oluşturma yolu her oturumda buradadır, çünkü bunlar saat değil kanıttır. Yüksek çözünürlüklü sayaç bu grupta değildir:
--scale-qpcile istemediğiniz sürece dokunulmaz, istediğinizde ise kapsanır. - Kapsanmayan - uygulamanın okuduğu ve değişikliğin ulaşmadığı bir kanal. Bir kararı kısmen çalışıyor yapan budur ve özetlenip geçilmek yerine adıyla listelenir.
Sıfır sayısı da bir bilgidir: kanal yakalandı ve uygulama hiç sormadı. Bu yüzden rapor onları saklamak yerine listeler.
Denetimin göremediği şeyler
Rapor kapsama konusunda dürüsttür; bu da kendi sınırları konusunda dürüst olmak demektir. Bunlar yakalanacak bir işlev çağrısı olmadan ya da tümüyle süreç dışında okunur:
- paylaşılan kullanıcı modu veri sayfasının doğrudan okunması - değer bellekte durur, yani yakalanacak bir şey yoktur. Sıradan uygulamalarda nadir, lisanslama ve kurcalama karşıtı kodda yaygın
- standart dışa aktarımları atlayan doğrudan sistem çağrıları - aynı örüntü
- süreç dışında, WMI, süreç dışı bir COM sunucusu ya da RPC ile elde edilen zaman
- ağdan gelen zaman - bir HTTP
Datebaşlığı, NTP, bir API yanıtı ya da bir veritabanı sunucusunun kendi saati - çekirdek sürücülerinden gelen zaman
Ağ durumu, denetimin en azından fark edebildiği durumdur; yukarıdaki raporda uyarının var olmasının nedeni budur. Geri kalanı için çalışıyor kararı, bu aracın görebildiği kanalların kapsandığı anlamına gelir - başka hiçbir yolun var olmadığı anlamına değil.
Bir pipeline’da
--json aynı bilgileri makine biçiminde verir, --report insan sürümünü bir
dosyaya yazar ve kararı çalışıyor dışında bir şey olan bir oturum, uyarıyı en alta gömmek
yerine dosyaya güvenilmez-kanıt başlığıyla başlar.
chrono run "C:\apps\test.exe" --at 2027-12-31T23:59:59 --json --report evidence.txt