Chrono Mock
DilTürkçe

İş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.

Chrono Mock sonuç ekranı, What the application read açık: Function, Read from ve Reads sütunlu bir tablo. NtCreateUserProcess tasarım gereği gerçek saatten okunan olarak, connect ise tasarım gereği gerçek saatten okunan ve geç yakalanan olarak işaretli; kalan satırlar - GetSystemTimeAsFileTime, NtQuerySystemTime, GetTimeZoneInformation ve diğerleri - sahte saatten okuyor, her birinin kendi sayısıyla. Tablonun altında iki uyarı var.
Aynı cevap pencerede. Uygulamanın sorabileceği her işlev, gerçekte neyden okuduğu ve kaç kez - bilerek gerçek saatte bırakılanlar dahil; onlar adlarıyla belirtilir, sessizce başarı olarak sayılmaz.

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ışıyor0zamanı okuyan her süreç oturum saatini gördü
kısmen çalışıyor10bazı kanallar kapsandı, bazıları kapsanmadı - kapsanmayanlar listelenir
çalışmıyor11değişiklik kilit kanallara ulaşmadı
belirsiz4kapsama 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-qpc ile 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 Date baş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

Deneyin