आपको कैसे पता चलेगा कि यह काम किया?
इस तरह के बाकी हर टूल के साथ आपको पता नहीं चलता। ऐप्लिकेशन शुरू होता है, कोई तारीख़ दिखाता है, और आप मान लेते हैं। लेकिन वह घड़ी ऐसे रास्ते से पढ़ सकता है जिसे किसी ने रोका नहीं - और तब “परीक्षण पास हुआ” का कोई मतलब नहीं रह जाता।
वह विफलता जिसका कोई लक्षण नहीं
जो समय-बदलने वाला टूल कोई चैनल चूक जाता है, वह न क्रैश होता है न चेतावनी देता है। ऐप्लिकेशन बस उस एक फ़ंक्शन से असली तारीख़ पढ़ लेता है जिस पर किसी ने हुक नहीं लगाया, और ठीक वैसे चलता है जैसे किसी भी साधारण दोपहर को चलता। परीक्षण हरा हो जाता है। बग रिलीज़ हो जाता है।
RunAsDate अपने दस्तावेज़ में इस बारे में ईमानदार है - वह कहता है कि वह “उन ऐप्लिकेशन को प्रभावित नहीं करेगा जो मौजूदा तारीख़/समय किसी अन्य स्रोत से लेते हैं” - और फिर यह आप पर छोड़ देता है कि पता करें कि आपका उनमें से है या नहीं। यह टूल उसी वाक्य को नापने की चीज़ मानता है।
सत्र वास्तव में क्या रिपोर्ट करता है
असली आउटपुट, इस प्रोजेक्ट के अपने एक टेस्ट प्रोब के विरुद्ध टूल चलाने से - ऐसा प्रोब जो जानबूझकर नेटवर्क कनेक्शन खोलता है:
$ 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)
आख़िरी दो ब्लॉक ही मुद्दा हैं। यहाँ कुछ विफल नहीं हुआ - निर्णय काम करता है है - और फिर भी रिपोर्ट बिना पूछे बताती है कि इस ऐप्लिकेशन ने अपने ख़त्म होने से पहले नेटवर्क से बात की, इसलिए हो सकता है लोकल हुक पूरी कहानी न हो। वह वाक्य उस परीक्षण के बीच का अंतर है जिस पर आप भरोसा कर सकते हैं और जिस पर नहीं।
चार निर्णय, और हर एक का एक एग्ज़िट कोड
निर्णय चलती हुई प्रोसेस के भीतर से, आपके काम शुरू करने से पहले लिया जाता है, और वह टूल का अपना एग्ज़िट कोड है, ताकि पाइपलाइन उस पर शाखा ले सके।
| निर्णय | एग्ज़िट | अर्थ |
|---|---|---|
| काम करता है | 0 | समय पढ़ने वाली हर प्रोसेस ने सत्र की घड़ी देखी |
| आंशिक रूप से काम करता है | 10 | कुछ चैनल कवर हुए, कुछ नहीं - जो नहीं हुए उनकी सूची दी जाती है |
| काम नहीं करता | 11 | बदलाव प्रमुख चैनलों तक नहीं पहुँचा |
| अनिर्धारित | 4 | कवरेज स्थापित नहीं की जा सकी - एक ईमानदार “मुझे नहीं पता” |
जब निर्णय “काम नहीं करता” हो, प्रोसेस तुरंत रोक दी जाती है, इससे पहले कि आप उससे कुछ करें। निर्णय लॉन्च से पहले नहीं आ सकता, क्योंकि सच का एकमात्र स्रोत चलती हुई प्रोसेस के भीतर से लिया गया एक पाठ्यांक है। जो गारंटी है वह यह कि आपको काम शुरू करने से पहले सच पता चल जाएगा - यह नहीं कि विफल होने वाला लॉन्च कभी होता ही नहीं। आप ओवरराइड करके आगे बढ़ सकते हैं, और तब सत्र हर उस जगह अविश्वसनीय चिह्नित होता है जहाँ वह दिखता है, आपके निर्यात किए किसी भी सबूत समेत।
बाक़ी कोड बताते हैं कि गड़बड़ी प्रतिस्थापन में नहीं, ख़ुद रन में हुई - इस्तेमाल की ग़लती, ऐसा लक्ष्य जो शुरू नहीं हो सका, बीच में कटा रन, पहले से चल रहा कोई दूसरा सत्र - और इनमें से कोई भी निर्णय नहीं है। पूरी तालिका कमांड लाइन संदर्भ में है।
कवर किए गए, देखे गए, कवर नहीं हुए
चैनल तीन वर्गों में आते हैं, और बीच वाला सबसे दिलचस्प है।
- कवर किए गए - हुक लगा और बदला गया। ऐप्लिकेशन ने पूछा और उसे सत्र की घड़ी मिली। कॉल-गिनती बताती है कि कितनी बार।
- निगरानी वाले - रोके जाते हैं, गिने जाते हैं, और जानबूझकर सच बताने के लिए छोड़ दिए जाते हैं। ऑब्जेक्ट पर प्रतीक्षा यहाँ हैं, क्योंकि उनका टाइमआउट छोटा करने से किसी असली हैंडल पर टाइमआउट का दिखावा हो सकता है, और मल्टीमीडिया टाइमर भी, क्योंकि उसे स्केल करने से ऑडियो और MIDI की टाइमिंग खिसक जाएगी - दोनों पर तब नज़र रखी जाती है जब सत्र बीते समय की धुरी को स्केल करता है। नेटवर्क कनेक्शन और प्रोसेस बनाने का एक रास्ता हर सत्र में यहाँ हैं, क्योंकि वे सबूत हैं, घड़ियाँ नहीं। उच्च-रिज़ॉल्यूशन काउंटर इस समूह में नहीं है: जब तक आप
--scale-qpcसे न माँगें, उसे छुआ नहीं जाता, और माँगने पर वह कवर होता है। - कवर नहीं हुए - ऐसा चैनल जो ऐप्लिकेशन ने पढ़ा और जहाँ बदलाव नहीं पहुँचा। यही निर्णय को आंशिक रूप से काम करता है में बदलता है, और इसे सारांश में गुम करने की जगह नाम लेकर सूचीबद्ध किया जाता है।
शून्य की गिनती भी जानकारी है: चैनल पर हुक लगा था और ऐप्लिकेशन ने कभी पूछा ही नहीं। इसीलिए रिपोर्ट उन्हें छिपाने की जगह सूचीबद्ध करती है।
ऑडिट जो नहीं देख सकता
रिपोर्ट कवरेज के बारे में ईमानदार है, जिसका मतलब है अपनी सीमाओं के बारे में भी ईमानदार होना। ये बिना किसी रोके जा सकने वाले फ़ंक्शन कॉल के पढ़े जाते हैं, या पूरी तरह प्रोसेस के बाहर:
- साझा यूज़र-मोड डेटा पेज की सीधी रीडिंग - मान मेमोरी में बैठा है, इसलिए हुक लगाने को कुछ नहीं। सामान्य ऐप्लिकेशन में दुर्लभ, लाइसेंसिंग और छेड़छाड़-रोधी कोड में आम
- सीधे सिस्टम कॉल जो मानक एक्सपोर्ट को लाँघ जाते हैं - वही पैटर्न
- प्रोसेस के बाहर से, WMI, आउट-ऑफ़-प्रोसेस COM सर्वर या RPC के ज़रिए मिला समय
- नेटवर्क से आया समय - HTTP
Dateहेडर, NTP, किसी API का जवाब, या डेटाबेस सर्वर की अपनी घड़ी - कर्नेल ड्राइवर से आया समय
नेटवर्क वाला मामला वह है जिसे ऑडिट कम से कम भाँप सकता है, इसीलिए ऊपर की रिपोर्ट में वह चेतावनी है। बाकी के लिए, काम करता है निर्णय का मतलब है कि इस टूल को दिखने वाले चैनल कवर हुए - यह नहीं कि कोई और रास्ता मौजूद नहीं।
पाइपलाइन में
--json वही तथ्य मशीनी रूप में देता है, --report इंसानी संस्करण फ़ाइल में लिखता है, और जिस सत्र का निर्णय काम करता है के अलावा कुछ भी हो, उसकी फ़ाइल अविश्वसनीय सबूत की चेतावनी से शुरू होती है, उसे सबसे नीचे दबाने की जगह।
chrono run "C:\apps\test.exe" --at 2027-12-31T23:59:59 --json --report evidence.txt