<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Mario Hewardt on Medium]]></title>
        <description><![CDATA[Stories by Mario Hewardt on Medium]]></description>
        <link>https://medium.com/@marioh_78322?source=rss-f7af8c00afef------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*zs4Gt1K5tmGF9LYMmHICcg.jpeg</url>
            <title>Stories by Mario Hewardt on Medium</title>
            <link>https://medium.com/@marioh_78322?source=rss-f7af8c00afef------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 31 May 2026 17:33:14 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@marioh_78322/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Monitoring macOS Entitlements with Sysinternals listent (list entitlements)]]></title>
            <link>https://medium.com/@marioh_78322/monitoring-macos-entitlements-with-sysinternals-listent-list-entitlements-55e78880d436?source=rss-f7af8c00afef------2</link>
            <guid isPermaLink="false">https://medium.com/p/55e78880d436</guid>
            <category><![CDATA[listent]]></category>
            <category><![CDATA[sysinternals]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[macos]]></category>
            <dc:creator><![CDATA[Mario Hewardt]]></dc:creator>
            <pubDate>Tue, 14 Apr 2026 17:53:54 GMT</pubDate>
            <atom:updated>2026-04-14T17:53:54.364Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*1ECfYYlq0so4um2wM4NPWg.png" /></figure><p>Ever wonder what hidden privileges your macOS applications are quietly holding? We did too. That curiosity — along with a real-world security incident we’ll get to in a moment — led the Sysinternals team to build listent, a new command-line tool for macOS that discovers and lists the code-signing entitlements embedded in executable binaries. <a href="https://github.com/microsoft/Sysinternals-listent">[github.com]</a></p><p>Sysinternals is a suite of system utilities originally created by Mark Russinovich and Bryce Cogswell in 1996. While Sysinternals made its name on Windows, in recent years the team has been expanding into Linux and macOS — tools like ProcDump for Linux, Sysmon for Linux, and ProcDump for Mac are already out in the wild. Now, with listent 1.0 (published March 26, 2026), we&#39;re bringing that same Sysinternals ethos — powerful command-line diagnostics — to the world of macOS entitlement auditing. <a href="https://github.com/microsoft/homebrew-sysinternalstap">[github.com]</a> <a href="https://learn.microsoft.com/en-us/sysinternals/downloads/listent">[learn.microsoft.com]</a></p><p>Entitlements are embedded in an app’s code signature and define the capabilities it can request from the system. macOS enforces them as part of its layered security model — alongside sandboxing and user consent. Misconfigure them, and best case your app breaks; worst case, you create a security hole.</p><h3>The Problem: Why listent Exists</h3><p>The origin story of listent starts with a surprising security discovery made using another Sysinternals tool.</p><p>In 2025, security researcher Koh M. Nakagawa of FFRI Security was experimenting with ProcDump for Mac — our Sysinternals utility for creating process memory dumps. Nakagawa initially assumed the tool would be limited by macOS’s System Integrity Protection (SIP), but something unexpected happened. In Nakagawa’s own words:</p><blockquote>“When I heard about this tool, I thought that this tool must be useless because it cannot dump almost all processes due to System Integrity Protection. So, it must be valid only when SIP is disabled. But after downloading this tool and trying it, I noticed something strange. I could dump the process memory, including system processes, even when SIP was enabled. I was shocked about it.”<em> </em><a href="https://www.helpnetsecurity.com/2025/09/04/macos-gcore-vulnerability-cve-2025-24204/"><em>[helpnetsecurity.com]</em></a></blockquote><p>Digging deeper, Nakagawa discovered that ProcDump for Mac internally calls a macOS utility called /usr/bin/gcore. The problem? Apple had mistakenly granted gcore the com.apple.system-task-ports.read entitlement in macOS 15.0 (Sequoia). This single entitlement gave gcore the ability to read the memory of any process on the system, completely bypassing SIP.</p><p>Nakagawa demonstrated three distinct attack scenarios at Nullcon Berlin 2025:</p><ol><li><strong>Keychain decryption</strong> — By dumping the memory of the securityd process, Nakagawa extracted the Master Key used to encrypt the login keychain, allowing full decryption without a user password. <a href="https://www.helpnetsecurity.com/2025/09/04/macos-gcore-vulnerability-cve-2025-24204/">[helpnetsecurity.com]</a></li><li><strong>TCC bypass</strong> — Sensitive files opened by sandboxed apps (PDFs in Preview, contact data in Contacts) could be recovered from those apps’ memory dumps, bypassing Transparency, Consent, and Control protections. <a href="https://www.helpnetsecurity.com/2025/09/04/macos-gcore-vulnerability-cve-2025-24204/">[helpnetsecurity.com]</a></li><li><strong>FairPlay-encrypted iOS app decryption</strong> — On Apple Silicon Macs that run iOS apps natively, Nakagawa was able to dump running iOS app memory and recover decrypted binaries without a jailbroken iPhone. <a href="https://www.helpnetsecurity.com/2025/09/04/macos-gcore-vulnerability-cve-2025-24204/">[helpnetsecurity.com]</a></li></ol><p>This vulnerability was tracked as <strong>CVE-2025–24204</strong>. Apple removed the problematic entitlement from gcore in macOS 15.3.</p><p>A single misconfigured entitlement on a legitimate system utility created a gaping hole in macOS security. And here’s what really got us thinking: how would you even notice something like this?</p><p>That question — <em>how do we make monitoring entitlements turnkey and easy?</em> — is exactly what drove us to create listent. Rather than relying on ad-hoc manual inspection of code signatures, we wanted a tool that could systematically scan<strong> </strong>every binary on your system and monitor in real time as new processes launch, surfacing their entitlements instantly. The goal: make the invisible visible, so the next gcore-style misconfiguration gets caught early.</p><h3>Installation</h3><p>Getting listent up and running is straightforward. The tool is written in Rust, is open-source under the MIT license, and lives on GitHub at <a href="https://github.com/microsoft/Sysinternals-listent">microsoft/Sysinternals-listent</a>. <a href="https://github.com/microsoft/Sysinternals-listent">[github.com]</a></p><p><strong>Prerequisites:</strong> macOS 10.15+ (Catalina or later) and Xcode Command Line Tools (needed for the codesign utility that listent uses under the hood).</p><h4>Option 1: Homebrew (Recommended)</h4><p>We maintain a Homebrew tap for Sysinternals macOS tools. To install listent:</p><pre>brew tap Microsoft/sysinternalstap<br>brew install listent</pre><h4>Option 2: Build from Source</h4><p>If you prefer to compile yourself, you’ll need Rust 1.70 or later (install via <a href="https://rustup.rs):">https://rustup.rs):</a></p><pre>git clone https://github.com/microsoft/Sysinternals-listent.git<br>cd Sysinternals-listent<br>cargo build --release</pre><h3>Usage Examples</h3><p>listent operates in two primary modes — static scanning (audit files on disk) and real-time monitoring (watch processes as they launch). Let&#39;s walk through both.</p><h4>Static Scanning</h4><p>This is the default mode. Point listent at one or more directories and it will recursively find executable binaries, extract their code-signing entitlements via macOS&#39;s codesign, and present the results.</p><p>Basic scan (default location):</p><pre>~ % listent<br>✓ Processed 1145/1145 files (scanned: 1137, skipped: 8) - completed<br>...<br>...<br>...<br>/usr/bin/fontrestore:<br>  com.apple.private.tcc.allow: [&quot;kTCCServiceSystemPolicyAllFiles&quot;]<br><br>/usr/bin/footprint:<br>  com.apple.private.ioaccelmemoryinfo: true<br>  com.apple.private.iosurfaceinfo: true<br>  com.apple.private.kernel.get-kext-info: true<br>  com.apple.private.memorystatus: true<br>  com.apple.system-task-ports.read.safe: true<br><br>/usr/bin/fs_usage:<br>  com.apple.private.security.system-async-io: true<br>  com.apple.private.stackshot: true<br><br>/usr/bin/gcore:<br>  com.apple.private.amfi.version-restriction: 1<br>  com.apple.security.cs.debugger.read.root: true<br><br>/usr/bin/gktool:<br>  com.apple.private.security.syspolicy.package-installation: true<br><br>/usr/bin/hdiutil:<br>  com.apple.private.diskimages.kext.user-client-access: true<br><br>/usr/bin/heap:<br>  com.apple.developer.kernel.extended-virtual-addressing: true<br>  com.apple.private.dt.instruments.dtservicehub.client: true<br>  com.apple.private.iosurfaceinfo: true<br>  com.apple.private.security.storage.AppDataContainers: true<br>  com.apple.rootless.datavault.metadata: true<br>  com.apple.security.iokit-user-client-class: [&quot;IOSurfaceRootUserClient&quot;]<br>  com.apple.system-task-ports.read: true<br>  com.apple.system-task-ports.read.safe: true<br>...<br>...<br>...<br>Scan Summary:<br>  Scanned: 1137 files<br>  Matched: 179 files<br>  Duration: 5.88s</pre><p>Running listent with no arguments scans the default directory paths. The output will show each binary that has entitlements, listing the entitlement keys and values, followed by a summary of how many files were scanned and how many matches were found.</p><p>Scan specific directories:</p><p>Want to audit your entire /Applications folder and the system binaries in /usr/bin? Just pass multiple paths:</p><pre>listent /Applications /usr/bin</pre><p>Please note that directories with a large number of files (such as Applications) can take a while to complete scanning.</p><p>Filter by entitlement pattern:</p><p>You can use the -e flag with glob patterns to search for specific entitlements across all scanned binaries. For instance, want to know which binaries on your system request Apple security entitlements?</p><pre>~ % listent -e &quot;com.apple.security.*&quot;<br>✓ Processed 1145/1145 files (scanned: 1137, skipped: 8) - completed<br>...<br>...<br>...<br>/usr/bin/app-sso:<br>  com.apple.security.application-groups: [&quot;group.com.apple.KerberosExtension&quot;]<br>  com.apple.security.temporary-exception.mach-lookup.global-name: [&quot;com.apple.PlatformSSO.daemon-xpc&quot;,&quot;com.apple.AppSSO.service-xpc&quot;]<br><br>/usr/bin/brctl:<br>  com.apple.security.application-groups: [&quot;group.com.apple.CloudDocs&quot;,&quot;group.com.apple.iCloudDrive&quot;]<br>  com.apple.security.enterprise-volume-access: true<br><br>/usr/bin/eslogger:<br>  com.apple.security.iokit-user-client-class: [&quot;EndpointSecurityDriver&quot;,&quot;EndpointSecurityExternalClient&quot;]<br><br>/usr/bin/hpmdiagnose:<br>  com.apple.security.iokit-user-client-class: AppleHPMUserClient<br><br>/usr/bin/kmutil:<br>  com.apple.security.ts.tmpdir: true<br><br>/usr/bin/ktrace:<br>  com.apple.security.iokit-user-client-class: [&quot;AppleProcessorTraceUserClient&quot;]<br><br>/usr/bin/nc:<br>  com.apple.security.network.client: true<br>  com.apple.security.network.server: true<br><br>/usr/bin/nscurl:<br>  com.apple.security.network.client: true<br><br>/usr/bin/qlmanage:<br>  com.apple.security.cs.disable-library-validation: true<br>  com.apple.security.get-task-allow: true<br>  com.apple.security.network.client: true<br>...<br>...<br>...<br>Scan Summary:<br>  Scanned: 1137 files<br>  Matched: 76 files<br>  Duration: 5.90s</pre><p>The tool supports glob syntax with *, ?, and [] wildcards. You can also combine multiple filters using logical OR — just pass multiple -e flags or comma-separate them:</p><pre>listent -e &quot;*network*&quot; -e &quot;*debug*&quot;</pre><p>This would find any binary whose entitlements contain the word “network” <em>or</em> “debug” — important when you want when auditing for overly permissive capabilities.</p><p>JSON output for automation:</p><p>If you’re integrating listent into a CI pipeline or security automation workflow, add --json for structured output:</p><pre>~ % listent -e &quot;com.apple.security.*&quot; --json<br>✓ Processed 1145/1145 files (scanned: 1137, skipped: 8) - completed<br>...<br>...<br>...<br>  &quot;results&quot;: [<br>    {<br>      &quot;path&quot;: &quot;/usr/bin/IOAccelMemory&quot;,<br>      &quot;entitlements&quot;: {<br>        &quot;com.apple.security.iokit-user-client-class&quot;: [<br>          &quot;IOGPUMemoryInfoUserClient&quot;<br>        ]<br>      },<br>      &quot;entitlement_count&quot;: 1<br>    },<br>    {<br>      &quot;path&quot;: &quot;/usr/bin/IOMFB_FDR_Loader&quot;,<br>      &quot;entitlements&quot;: {<br>        &quot;com.apple.security.iokit-user-client-class&quot;: &quot;IOMobileFramebufferUserClient&quot;<br>      },<br>      &quot;entitlement_count&quot;: 1<br>    },<br>    {<br>      &quot;path&quot;: &quot;/usr/bin/aa&quot;,<br>      &quot;entitlements&quot;: {<br>        &quot;com.apple.security.cs.allow-dyld-environment-variables&quot;: false,<br>        &quot;com.apple.security.cs.disable-library-validation&quot;: false<br>      },<br>      &quot;entitlement_count&quot;: 2<br>    },<br>...<br>...<br>...<br></pre><h4>Real-Time Monitoring</h4><p>The second major mode lets you watch processes as they launch and immediately see their entitlements. This is invaluable for observing system behavior during testing, or for keeping an eye on what’s running in your environment.</p><p>Monitor all new processes:</p><pre>~ % listent monitor<br>Starting process monitoring (interval: 1.0s)...<br>Press Ctrl+C to stop monitoring.<br>[2026-04-14T15:51:07.824202000Z] New process detected: xpcproxy (PID: 80607)<br>  Path: /usr/libexec/xpcproxy<br>  Entitlements: com.apple.private.coreservices.canmanagebackgroundtasks, com.apple.private.exclaves.conclave-spawn, com.apple.private.security.storage.driverkitd, com.apple.private.spawn-driver, com.apple.private.spawn-panic-crash-behavior, com.apple.private.spawn-subsystem-root, com.apple.private.xpc.is.xpcproxy<br><br>[2026-04-14T15:51:07.824202000Z] New process detected: mdworker_shared (PID: 80605)<br>  Path: /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker_shared<br>  Entitlements: com.apple.private.accounts.allaccounts, com.apple.private.corespotlight.internal, com.apple.private.corespotlight.sender.importer, com.apple.private.disable-log-mach-ports, com.apple.private.security.restricted-application-groups, com.apple.private.security.storage.Mail, com.apple.private.security.storage.Suggestions, com.apple.private.tcc.allow, com.apple.security.application-groups, com.apple.security.personal-information.addressbook<br><br>[2026-04-14T15:51:07.824202000Z] New process detected: mdworker_shared (PID: 80606)<br>  Path: /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker_shared<br>  Entitlements: com.apple.private.accounts.allaccounts, com.apple.private.corespotlight.internal, com.apple.private.corespotlight.sender.importer, com.apple.private.disable-log-mach-ports, com.apple.private.security.restricted-application-groups, com.apple.private.security.storage.Mail, com.apple.private.security.storage.Suggestions, com.apple.private.tcc.allow, com.apple.security.application-groups, com.apple.security.personal-information.addressbook</pre><p>Once running, listent continuously polls for newly launched processes and displays their entitlements as they appear. Press Ctrl+C to stop cleanly.</p><p>By default the polling interval is 1.0 second, but you can tune it anywhere from 0.1 to 300.0 seconds. For more responsive monitoring:</p><pre>listent monitor --interval 0.5</pre><p>Please note that increasing the polling interval will consume more CPU resources.</p><p>Monitor with entitlement filtering:</p><p>Just like in static scanning, you can filter in real time. Suppose you only want to see processes that request network-related entitlements:</p><pre>listent monitor -e &quot;com.apple.security.network.*&quot;</pre><p>For persistent, always-on monitoring, listent can run as a background daemon integrated with macOS launchd. You can start a foreground daemon for testing:</p><pre>~ % listent daemon run<br>🚀 listent daemon starting...<br>✅ listent daemon started successfully<br>  Polling interval: 1s<br>  View logs: listent daemon logs<br>  Check status: listent daemon status<br>  Stop daemon: listent daemon stop</pre><p>Or install it as a persistent system service:</p><pre>sudo listent daemon install</pre><p>The daemon supports a TOML configuration file for customizing polling intervals, path filters, and entitlement filters. This lets you set up continuous system-wide entitlement monitoring without having to keep a terminal window open — listent quietly runs as a watchdog in the background.</p><h4>Where Do the Daemon Logs Go?</h4><p>When running as a background service, listent doesn&#39;t write to a separate log file — it uses macOS&#39;s Unified Logging System (Apple&#39;s modern replacement for the traditional syslog). Specifically, listent logs all its events under the subsystem com.microsoft.sysinternals.listent. All entitlement findings and daemon activity are sent to this system log, which means you can view listent&#39;s output using either the standard macOS log command-line tool or via the built-in listent daemon logs convenience commands.</p><pre><br># Stream live listent log entries (info level and above)<br>log stream --predicate &#39;subsystem == &quot;com.microsoft.sysinternals.listent&quot;&#39; --level info<br><br># Show all listent log entries from the past hour<br>log show --predicate &#39;subsystem == &quot;com.microsoft.sysinternals.listent&quot;&#39; --last 1h<br><br># Filter only error-level entries from listent (past 24h)<br>log show --predicate &#39;subsystem == &quot;com.microsoft.sysinternals.listent&quot;&#39; --last 24h</pre><p>Here is an example of the output from a daemon log:</p><pre>Filtering the log data using &quot;subsystem == &quot;com.microsoft.sysinternals.listent&quot;&quot;<br>Skipping info and debug messages, pass --info and/or --debug to include.<br>Timestamp                       Thread     Type        Activity             PID    TTL<br>2026-04-14 10:26:04.756390-0700 0x161f03f  Default     0x0                  80635  0    listent: [com.microsoft.sysinternals.listent:listent::daemon::logging] New process detected: /Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge | {&quot;entitlement_count&quot;:14,&quot;entitlements&quot;:[&quot;com.apple.application-identifier&quot;,&quot;com.apple.developer.associated-domains&quot;,&quot;com.apple.developer.associated-domains.applinks.read-write&quot;,&quot;com.apple.developer.team-identifier&quot;,&quot;com.apple.developer.web-browser.public-key-credential&quot;,&quot;com.apple.security.application-groups&quot;,&quot;com.apple.security.device.audio-input&quot;,&quot;com.apple.security.device.bluetooth&quot;,&quot;com.apple.security.device.camera&quot;,&quot;com.apple.security.device.print&quot;,&quot;com.apple.security.device.usb&quot;,&quot;com.apple.security.personal-information.location&quot;,&quot;com.apple.security.personal-information.photos-library&quot;,&quot;keychain-access-groups&quot;],&quot;event_type&quot;:&quot;process_detected&quot;,&quot;name&quot;:&quot;Microsoft Edge&quot;,&quot;path&quot;:&quot;/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge&quot;,&quot;pid&quot;:61840,&quot;timestamp&quot;:&quot;2026-04-14T17:25:57.314838000Z&quot;}</pre><p>These commands leverage Apple’s unified log database to fetch listent&#39;s records using predicate filtering on the subsystem identifier.</p><p>Using the built-in listent daemon logs wrapper:</p><p>In practice, the listent daemon logs command is a convenient shorthand that queries the same Unified Logging backend for you. It defaults to showing recent entries, with options for time ranges, output format, and live tailing:</p><pre><br># View daemon logs (default: last 1 hour)<br>listent daemon logs<br><br># Logs from the last 30 minutes<br>listent daemon logs --since 30m<br><br># Logs since a specific timestamp<br>listent daemon logs --since &quot;2025-01-15 10:00&quot;<br><br># JSON output (useful for piping to jq or other tools)<br>listent daemon logs --format json<br><br># Follow logs in real-time (like tail -f)<br>listent daemon logs -f</pre><h3>Conclusion</h3><p>The story of CVE-2025–24204 taught us something fundamental: entitlements are a critical attack surface. A single misconfigured entitlement on Apple’s own gcore utility broke System Integrity Protection, exposed Keychain data, bypassed TCC, and allowed iOS app binary decryption — all without requiring a jailbreak or elevated privileges. And as Nakagawa pointed out, similar issues likely exist in other binaries.</p><p>listent is our answer to that risk. Whether you&#39;re a developer<strong> </strong>verifying your app isn&#39;t requesting more privileges than it needs, a security researcher hunting for the next entitlement misconfiguration, or an IT administrator auditing your fleet for compliance — listent gives you a fast, flexible lens into what macOS applications <em>can</em> do on your system.</p><p>The tool processes everything locally with no network communication so you can run it with confidence on sensitive systems. It’s free, open-source under the MIT license, and we welcome contributions and feedback on <a href="https://github.com/microsoft/Sysinternals-listent">GitHub</a>.</p><p>Give it a try — run a scan, fire up monitor mode, and let us know what you uncover. Happy entitlements hunting!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=55e78880d436" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ZoomIt Adds Animated GIF Support: Lightweight, Shareable Screen Captures Made Easy]]></title>
            <link>https://medium.com/@marioh_78322/zoomit-adds-animated-gif-support-lightweight-shareable-screen-captures-made-easy-a790496b7097?source=rss-f7af8c00afef------2</link>
            <guid isPermaLink="false">https://medium.com/p/a790496b7097</guid>
            <category><![CDATA[sysinternals]]></category>
            <category><![CDATA[zoomit]]></category>
            <dc:creator><![CDATA[Mario Hewardt]]></dc:creator>
            <pubDate>Tue, 11 Nov 2025 20:53:33 GMT</pubDate>
            <atom:updated>2025-11-11T20:53:33.321Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/128/1*aFHUlAiO5aTmLChdLI0VYA.png" /></figure><p>We’re thrilled to introduce a new recording format in Sysinternals ZoomIt (v9.2): animated GIFs!</p><p>ZoomIt has long supported MP4 recording for high-quality screen captures, but sometimes you need something faster, lighter, and easier to share. That’s where animated GIFs come in.</p><h4>Why GIF?</h4><p>Animated GIFs are perfect for quick, loopable screen recordings that:</p><ul><li><strong>Show a short workflow or UI interaction</strong> without needing a video player</li><li><strong>Embed easily in emails, bug reports, or documentation</strong></li><li><strong>Auto-play in chat apps and browsers</strong> for instant visibility</li><li><strong>Keep file sizes small</strong> for fast sharing and loading</li></ul><p>Whether you’re demonstrating a repro step, highlighting a UI glitch, or creating a looping tutorial for a teammate, GIFs are a fast and frictionless way to communicate visually.</p><h4>How It Works</h4><p>The new feature is available in the <strong>Options dialog</strong> under the <strong>Record tab</strong>. Just:</p><ol><li>Right click ZoomIt in the tray.</li><li>Select O<strong>ptions &gt; Record.</strong></li><li>Choose <strong>GIF</strong> as your recording format.</li><li>Start recording as usual using the same recording shortcut key!</li></ol><p>As with MP4 recording, you can chose to record the full screen, window or a user defined part of the screen using the same recording shortcut keys.</p><p>ZoomIt will capture your screen and save the output as an animated GIF, ready to drop into your next Teams message, GitHub issue, or internal doc.</p><h4>Use Cases</h4><p>Here are a few ways ZoomIt users might take advantage of GIF recording:</p><ul><li><strong>Developers</strong>: Capture a bug repro or UI behavior to share with QA or PMs.</li><li><strong>Support engineers</strong>: Show customers how to navigate a setting or reproduce an issue.</li><li><strong>Designers</strong>: Share a quick animation of a design prototype or interaction.</li><li><strong>Educators</strong>: Create short, looping visual aids for training materials.</li></ul><h4>Lightweight, Loopable, and Built Right In</h4><p>This update makes ZoomIt even more versatile for recodring workflows. No need to reach for third-party tools — just record, save, and share.</p><p>We can’t wait to see how you use it!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a790496b7097" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Navigating Linux Directories with Sysinternals jcd (jump change directory)]]></title>
            <link>https://medium.com/@marioh_78322/navigating-linux-directories-with-sysinternals-jcd-jump-change-directory-dd889893bb9c?source=rss-f7af8c00afef------2</link>
            <guid isPermaLink="false">https://medium.com/p/dd889893bb9c</guid>
            <category><![CDATA[shell-script]]></category>
            <category><![CDATA[sysinternals]]></category>
            <dc:creator><![CDATA[Mario Hewardt]]></dc:creator>
            <pubDate>Wed, 17 Sep 2025 17:45:07 GMT</pubDate>
            <atom:updated>2025-09-17T17:45:07.633Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*A2R4KBNFi_DuqTgAtAlbHQ.jpeg" /></figure><p>Ever find yourself buried in a deep directory tree, wishing for a quicker way to cd around? We did too. That’s why the Sysinternals team is excited to introduce <strong>Sysinternals jcd</strong> (jump change directory) – a new open-source tool that turbocharges your command-line directory navigation. In short, jcd is like the traditional cd command, but with superpowers. It’s a Rust-powered utility that lets you jump to directories by typing just a few characters of the name, with smart auto-selection and search capabilities. And yes – jcd is cross-platform and works on macOS as well (so Mac terminal warriors can rejoice too!).</p><h3>What Problem Does jcd Solve?</h3><p>Navigating complex file systems can be cumbersome. If you’ve ever spent ages typing out long paths or performing multiple cd .. hops to climb out of directories, jcd is here to save you time. The problem is simple: cd requires an exact path, but sometimes you only remember part of a folder name or you want to quickly jump up or down the directory tree. jcd brings a seamless, integrated solution as part of the Sysinternals suite. It addresses common pain points:</p><ul><li>Partial Name Matching: With jcd, you don’t need to type a full directory name. It will find directories by substring.</li><li>Jumping Up and Down: Unlike cd, jcd searches both down into subfolders and up the directory tree for matches. That means you can also ascend to a parent directory by name.</li><li>Smart Selection with Tab Completion: What if multiple directories match your query? jcd has you covered with an interactive tab completion system. Type a partial name and hit Tab — jcd will cycle through the possible matches, showing each match in turn.</li><li>Case Sensitivity Control: By default, searches are case-sensitive (just like your filesystem). But if you’re not sure about capitalization, jcd offers the -i flag for case-insensitive matching.</li><li>Ignore Junk Directories: One of jcd’s superpowers is ignoring directories that you probably don’t want to dive into. Build outputs, dependency folders, caches — e.g. node_modules, target, bin, etc. – can clutter your search. jcd uses ignore patterns (similar to a gitignore) to skip these by default.</li></ul><p>In essence, jcd streamlines the act of changing directories, turning it from a tedious chore into a quick jump. It’s especially handy for developers, DevOps engineers, or anyone who frequently works in deeply nested terminal paths. No more losing your flow because you had to painstakingly navigate the filesystem.</p><h3>Installation and Setup</h3><p>Because jcd is part of the Sysinternals suite, we’ve made installation as easy as possible on popular platforms. You can of course build from source if you like (see the BUILD.md in the <a href="https://github.com/microsoft/Sysinternals-jcd">repo </a>for instructions), but most users can install a ready-made package through the varius package managers. For example, to install jcd on Ubuntu, first register the Microsoft package feed, then install jcd using apt:</p><pre><br># 1. Register the Microsoft apt repository and key  <br>wget -q https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb  <br>sudo dpkg -i packages-microsoft-prod.deb  <br><br># 2. Install jcd from the repo  <br>sudo apt-get update  <br>sudo apt-get install jcd</pre><p>Once installed, you need source jcd : source /usr/bin/jcd_function.sh</p><p>On macOS: We’ve made jcd available via Homebrew for Mac users. If you use Homebrew (a popular package manager on Mac), you can install jcd in two quick steps. First, add the Sysinternals tap (if you haven’t before), then install jcd :</p><pre><br># Add the Sysinternals Homebrew tap (if not done already)<br>brew tap microsoft/sysinternalstap<br><br># Install jcd via Homebrew<br>brew install jcd</pre><p>Once jcdis installed, the last step you will need to do is source the jcd_function.sh file:</p><pre>source /opt/homebrew/bin/jcd_function.sh</pre><h3>Usage Examples: Jumping Around with jcd</h3><p>Let’s walk through a few scenarios to demonstrate jcd in action. Once you’ve installed it, you invoke jcd by typing jcd followed by part of the directory you want to go to. Here are some common uses:</p><ul><li>Suppose you have a directory somewhere under the current path called ProjectApollo. Instead of typing the whole name or navigating step by step, just do: jcd Proj by tab and jcd will search the current directory, subdirectories, and also parent directories for any directory name containing Proj. In this case, it will find ProjectApollo.</li><li>Now imagine you have two directories, frontend and frontend-old, in the same folder, and you want to jcd to one of them. You type: jcd front and hit Tab. jcd will complete to frontend/ first, but if that’s not the one you wanted, just hit Tab again to cycle to frontend-old/. You can also toggle back and forth with Shift+Tab. This interactive cycling through matching directories is a huge time-saver. It’s like a mini navigation menu right in your terminal. Once the suggestion showing is the directory you want, press Enter, and you’ll teleport to that directory. No more ambiguity when multiple folders share similar names!</li><li>Case-Insensitive Search: By default, if you search for jcd src, it will match srcexactly (and Srcor SRCwould not match). If you don’t recall the exact capitalization, use the -i flag: jcd -i src which results in a case insensitive search.</li><li>Jump to Parent by Name: jcd isn’t limited to searching downward. It can also look upward. Let’s say you are deep inside projects/webapp/src/utils/ and you want to quickly go back to the projects directory near the top. Simply run: jcd projects and jcd will detect that projects is an ancestor directory and instantly take you up to projects. This saves you from doing cd ../../.. multiple times or retyping the full path. This up-tree search is super useful for jumping to a known parent directory by name.</li></ul><p>These examples just scratch the surface. Essentially, anytime you know the name (or part of the name) of a directory you want to jump to, jcd &lt;name&gt; will get you there in one command. It’s like an intelligent teleport for your terminal sessions. And because it’s part of Sysinternals, we’ve paid attention to performance – even with lots of files and deep trees, jcd Rust core is optimized to search quickly, so you’re not left waiting long for results (the animated dots will let you know if a search is taking more than a split-second).</p><h3>Conclusion: Jump into jcd Today</h3><p>jcd (jump change directory) is a small tool that can have a big impact on your command-line productivity. It removes the friction of moving around complex directory structures, letting you focus on your actual work rather than navigation. We built jcd to scratch our own itch (who hasn’t lost patience with cd at some point?), and we’re thrilled to share it with the community as part of the Sysinternals suite.</p><p>You can find the source code, documentation, and installation instructions on the <a href="https://github.com/microsoft/Sysinternals-jcd">jcd GitHub repo</a> — it’s open source (MIT licensed) and ready for you to try. We welcome feedback, bug reports, and contributions. If you’re on Linux or macOS and spend a lot of time in the terminal, give jcd a go and let us know what you think! We hope it makes your daily workflow just a little bit easier (and a lot faster). Happy jumping through directories!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dd889893bb9c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Unlocking the Power of Symbol Resolution in Sysinternals Tools]]></title>
            <link>https://medium.com/@marioh_78322/unlocking-the-power-of-symbol-resolution-in-sysinternals-tools-d578b5442c0c?source=rss-f7af8c00afef------2</link>
            <guid isPermaLink="false">https://medium.com/p/d578b5442c0c</guid>
            <category><![CDATA[windows]]></category>
            <category><![CDATA[sysinternals]]></category>
            <category><![CDATA[process-explorer]]></category>
            <dc:creator><![CDATA[Mario Hewardt]]></dc:creator>
            <pubDate>Mon, 23 Jun 2025 17:45:11 GMT</pubDate>
            <atom:updated>2025-06-23T17:45:11.398Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*A2R4KBNFi_DuqTgAtAlbHQ.jpeg" /></figure><p>Symbol resolution in Sysinternals tools is a powerful capability that converts raw memory addresses into human-readable function names — and when available, even source file paths. This feature is indispensable for deep diagnostics, performance tuning, and malware analysis. In this story, we’ll explore some of the challenges involved in symbol resolution, focusing on Process Explorer as a primary example — though the insights apply across other Sysinternals tools that support symbols.</p><h3>What Is Symbol Resolution?</h3><p>When a process runs, its threads execute code from various modules — such as EXEs and DLLs. Without symbol resolution, tools like Process Explorer can only display raw memory addresses in call stacks. But with symbol resolution enabled, those addresses are translated into meaningful function names using symbol files (PDBs).</p><p>For example, in Process Explorer, if you right-click a process, choose Properties, go to the Threads tab, and double-click a thread, you might see call stack frames like:</p><pre>ntdll.dll+0x1a2b3<br>kernel32.dll+0x3c4d5</pre><p>But once you enable symbol resolution (via Options &gt; Configure Symbols), and point it to the Microsoft Symbol Server, those same entries might now look like:</p><pre>ntdll.dll!RtlUserThreadStart<br>kernel32.dll!BaseThreadInitThunk</pre><p>This instantly reveals what the thread is doing — whether it’s in a system call, looping in user code, or blocked on a synchronization object.</p><p>To enable this feature, Process Explorer also requires access to a helper DLL: dbghelp.dll. You can change this path via Options-&gt;Configure Symbols:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/798/1*9_YryHa-3b2Vfwo_ytQgEg.png" /></figure><p>By default, it looks for this DLL in C:\Windows\System32. This built in Windows version has some limitations that we will explore —and how to work around them—in the sections below.</p><h3>More Than Just dbghelp.dll: Required Supporting DLLs</h3><p>While Process Explorer<strong> </strong>only prompts you to configure the path to dbghelp.dll via Options &gt; Configure Symbols, the reality is that dbghelp.dll<strong> </strong>relies on additional supporting DLLs to enable full functionality—especially when accessing remote symbol or source servers.</p><p>The most important of these are:</p><ul><li>symsrv.dll – Enables symbol server support, including downloading symbols from the Microsoft Symbol Server or a local cache.</li><li>symsrc.dll – Supports source server functionality, allowing tools to retrieve indexed source code.</li></ul><p>In this post — and in general discussions — we often refer to “dbghelp.dll” as shorthand for dbghelp.dll and symsrv.dll. To ensure everything works correctly, it&#39;s best to keep both of those DLLs in the same folder, and point Process Explorer to that folder when configuring symbol support.</p><h3>Symbol Resolution and the In-Box Windows dbghelp.dll</h3><p>Windows includes a built-in version of dbghelp.dll—the library responsible for handling symbol resolution in many tools, including the Sysinternals suite. While convenient, this in-box version has significant limitations:</p><ul><li>It does <strong>not support symbol server access</strong>, meaning it cannot download symbols from remote sources like the Microsoft Symbol Server.</li><li>It can <strong>only resolve symbols from local </strong><strong>.pdb files</strong> already present on disk.</li></ul><p>As a result, if you rely solely on the default dbghelp.dll that ships with Windows (typically located in C:\Windows\System32), tools like Process Explorer are unable to resolve symbols for most system modules. This leads to incomplete stack traces and missing function names, particularly for kernel or user-mode components that don&#39;t have local PDBs.</p><p>To ensure complete and accurate symbol resolution, it’s recommended to download a newer version of dbghelp.dll and configure Process Explorer to use it via Options &gt; Configure Symbols. Below, we’ll explore a few ways to obtain a newer version of dbghelp.dll.</p><h3>Installing dbghelp.dll via the Windows SDK Debugging Tools</h3><p>One of the easiest and most reliable ways to get a newer version of dbghelp.dll is by installing Debugging Tools for Windows, which is included as an optional component in the Windows SDK. These tools include WinDbg, Microsoft’s powerful debugger, as well as an updated version of dbghelp.dll .</p><p>When installing the SDK, make sure to select the “Debugging Tools for Windows” component. Once installed, you’ll find dbghelp.dll and its dependencies in the SDK directory—typically under a path like:</p><pre>C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\</pre><p>After installation, open Process Explorer, go to Options &gt; Configure Symbols, and set the Dbghelp.dll path to the location of the newer DLL. For example, on my machine, I point it to:</p><pre>C:\x64\dbghelp.dll</pre><blockquote>(Your actual path may vary depending on where you installed the SDK or copied the files)</blockquote><p>With this setup, Process Explorer can connect to the Microsoft Symbol Server and resolve function names, even for system modules, providing much deeper visibility into what your processes and threads are doing.</p><h3>WinDbg from the Microsoft Store</h3><p>Another convenient way to get the latest version of dbghelp.dll is by installing WinDbg from the Microsoft Store. This modern version of WinDbg includes the same updated symbol-handling DLLs as the Windows SDK version, including full support for symbol servers.</p><p>However, there’s a catch: Windows Store apps are sandboxed, meaning their installation directories are protected by the system. As a result, tools like Process Explorer cannot load dbghelp.dll directly from a Store app&#39;s directory, even if you know the path—Windows will block access unless the calling process has the necessary permissions.</p><p><strong>Workaround: Copy the DLL to a different location</strong></p><p>To work around this limitation, you can manually copy dbghelp.dll<strong> </strong>from the WinDbg Store app’s installation directory to a location you control—such as:</p><pre>C:\Tools\DbgHelp\</pre><p>Once copied, open Process Explorer, go to Options &gt; Configure Symbols, and set the Dbghelp.dll path to point to the copied DLL in your local folder.</p><p>This lets you benefit from the latest symbol resolution features without needing to install the full Windows SDK, while still avoiding the sandboxing limitations of Store apps.</p><h3>Getting dbghelp.dll via NuGet</h3><p>Another way to obtain an up-to-date version of dbghelp.dll—without installing the full Windows SDK or WinDbg—is through the <a href="https://www.nuget.org/packages/Microsoft.Debugging.Platform.DbgEng"><strong>Microsoft.Debugging.Platform.DbgEng</strong></a> NuGet package. This package includes a recent version of dbghelp.dll along with other related debugging libraries.</p><p>To use this method:</p><ol><li>Install the package using a NuGet client (e.g., nuget.exe, Visual Studio, or the dotnet CLI).</li><li>Extract the contents (you can use a tool like <a href="https://github.com/NuGetPackageExplorer/NuGetPackageExplorer">NuGet Package Explorer</a> or manually rename the .nupkg file to .zip and extract it).</li><li>Locate dbghelp.dll and copy it to a convenient local path.</li><li>In Process Explorer, go to Options &gt; Configure Symbols and set the Dbghelp.dll path to the location where you placed the extracted DLL.</li></ol><p>Please note that you will want to also download the <a href="https://www.nuget.org/packages/Microsoft.Debugging.Platform.SymSrv">https://www.nuget.org/packages/Microsoft.Debugging.Platform.SymSrv</a> nuget, extract and copy the symsrv.dll to the same location as dbghelp.dll.</p><p>This is a lightweight and developer-friendly approach, especially if you’re already using NuGet in your workflow or want to avoid installing large toolsets just for symbol support.</p><h3>Looking Ahead: Built-in Support for Symbol Resolution</h3><p>As outlined above, enabling full symbol resolution in Process Explorer today requires installing either the Windows SDK or the WinDbg app from the Microsoft Store — just to get access to the required helper DLL dbghelp.dll. While these workarounds are effective, they aren’t ideal, especially for users who want a streamlined, zero-dependency experience. Furthermore, the Sysinternals tools have always been designed to be xcopy-friendly — requiring no installation — so relying on additional components runs counter to that core philosophy.</p><p>To improve this, we’re planning a future update to Process Explorer that will include dbghelp.dll directly in the download package. This means you’ll be able to enable full symbol resolution out of the box—no additional installations required.</p><p>We believe this will make advanced diagnostics more accessible and eliminate one of the most common setup hurdles for users who rely on Process Explorer for performance analysis, debugging, and malware investigation.</p><p>We’d love to hear your thoughts — whether you’ve run into symbol issues, have suggestions, or want to share how you use this feature.</p><p>Your feedback helps guide our roadmap!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d578b5442c0c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Troubleshooting Azure DevOps Pipelines with Sysinternals: Introducing the ProcDump Task]]></title>
            <link>https://medium.com/@marioh_78322/troubleshooting-azure-devops-pipelines-with-sysinternals-introducing-the-procdump-task-1f61a61a1959?source=rss-f7af8c00afef------2</link>
            <guid isPermaLink="false">https://medium.com/p/1f61a61a1959</guid>
            <category><![CDATA[sysinternals]]></category>
            <category><![CDATA[azure-devops]]></category>
            <category><![CDATA[ci-cd-pipeline]]></category>
            <category><![CDATA[debugging]]></category>
            <dc:creator><![CDATA[Mario Hewardt]]></dc:creator>
            <pubDate>Wed, 19 Mar 2025 17:16:39 GMT</pubDate>
            <atom:updated>2025-07-09T14:24:22.274Z</atom:updated>
            <content:encoded><![CDATA[<h3>Troubleshooting Azure DevOps Pipelines with Sysinternals: Introducing the Sysinternals ADO Extension</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/612/1*-P0xXbZqGpY1H24jbStLQg.jpeg" /></figure><p>In today’s complex software environments, troubleshooting issues can be a daunting task — especially when access to the underlying systems is limited. Sysinternals tools have long been the go-to solution for diagnosing and resolving problems in locked-down production environments. Whether it’s investigating performance bottlenecks or tracking down bugs, these tools provide deep visibility where traditional tools fall short.</p><p>This challenge isn’t limited to production systems. In Azure DevOps (ADO), the situation is similar. Access to the build agent nodes is tightly controlled, making it difficult to diagnose failures such as failing unit tests or integration tests. Developers are often left piecing together log files and error messages, hoping to identify the root cause.</p><p>That’s why we’re excited to introduce the new Sysinternals ADO Task extension with both the ProcDump and Procmon task — a powerful addition designed to bring the diagnostic power of postmortem analysis to your Azure DevOps pipelines. This new tool enables you to capture insights directly from your build environments without needing direct access to the agent nodes. Whether you’re facing inconsistent test results, performance issues, or other pipeline problems, this task enables you to get to the bottom of the problem faster and more efficiently.</p><p>In this story, we’ll explore how this new Sysinternals ADO Task extension can help you troubleshoot ADO pipeline issues with the same power and precision that Sysinternals tools have been delivering in production environments for years.</p><h3>When Integration Tests Go Wrong: Diagnosing slow tests in ADO</h3><p>To illustrate the power of the new Sysinternals ADO Extension, let’s dive into a challenging scenario: troubleshooting integration tests that are running too slow.</p><p>Imagine you have a pipeline in Azure DevOps that builds your binaries and then runs a series of integration tests to ensure everything is working as expected. But there’s a problem — during these tests, it takes a lot longer to run the tests than expected, causing the tests to timeout. With limited access to the agent nodes, identifying the culprit is a challenge.</p><p>This is where the Sysinternals.ProcDump task comes into play. ProcDump is a lightweight, yet powerful utility traditionally used in production environments to capture crash dumps during CPU spikes or application hangs. Now, with the Sysinternals ADO Task, you can leverage this same capability within your Azure DevOps pipelines.</p><p>By configuring the Sysinternals.ProcDump task in your pipeline, you can capture a crash dump at the precise moment when CPU consumption spikes or after a certain delay. This allows you to analyze the dump offline, using tools like WinDbg or Visual Studio, to identify the root cause of the issue.</p><p>In the next section, we’ll walk through how to set up the Sysinternals.ProcDump task in your pipeline.</p><h3>Installing the Sysinternals.ProcDump Task Extension</h3><p>Before you can leverage the power of Sysinternals.ProcDump in your Azure DevOps pipeline, you’ll need to install the extension from the Visual Studio Marketplace.</p><h4>Step 1: Navigate to the Marketplace</h4><p>Head over to the <a href="https://marketplace.visualstudio.com/">Visual Studio Marketplace</a> and search for <strong>“Sysinternals”</strong>. Alternatively, you can follow <a href="https://marketplace.visualstudio.com/items?itemName=Sysinternals.SysinternalsADOExtension">this direct link</a> to the extension page.</p><h4>Step 2: Install the Extension</h4><p>Click on the <strong>“Get it free”</strong> button and select the organization where you want to install the extension. Ensure that you have the necessary permissions to install extensions in that organization.</p><h4>Step 3: Confirm Installation</h4><p>After installation, the Sysinternals.ProcDump task will be available in your Azure DevOps pipelines. You can now start integrating it into your workflows to capture and analyze crash dumps.</p><h3>Configuring Your Pipeline to Capture Crash Dumps</h3><p>With the Sysinternals.ProcDump extension installed, it’s time to integrate it into your Azure DevOps pipeline. In this section, we’ll walk through the configuration needed to capture crash dumps during your integration tests, helping you get to the root cause of slow running integration tests.</p><h4>Step 1: Add the Sysinternals.ProcDump Task</h4><p>Open your pipeline YAML file and add the Sysinternals.ProcDump task to the relevant job. This task will monitor your integration tests and capture a crash dump after 15 seconds of runtime. Here&#39;s an example of how to do that targeting the ping process.</p><pre>- task: Sysinternals.ProcDump@1<br>  displayName: &#39;Capture Crash Dump with ProcDump&#39;<br>  inputs:<br>    processName: &#39;ping&#39;<br>    dumpType: &#39;Full&#39;<br>    delay: 15<br>    artifactName: mydumps_windows</pre><ul><li>dumpType is set to Full to capture a complete memory dump.</li><li>delay is set to 15, meaning a dump will be captured after an initial delay of 15 seconds.</li><li>artifactName specifies the name of the artifact where the crash dumps will automatically be uploaded.</li></ul><h4>Step 2: Review and Run the Pipeline</h4><p>Save the changes to your pipeline YAML and commit them to your repository. Run the pipeline and monitor the output. Once the 15 second delay is reached, ProcDump will capture a crash dump and automatically upload it as an artifact to the artifactName specified making it is trivial to generate and get access to the dump.</p><p>Here is an example of a pipeline run:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AE72BKPyotYUxnEVhK9ePg.jpeg" /></figure><p>The resulting dump can be found in the mydumps_windows ADO artifact as shown below.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kbSeKq_2UKrElEzhoyLuXw.jpeg" /></figure><p>This setup allows you to easily capture and analyze crash dumps from your integration tests, giving you valuable insights into slow running integration tests.</p><h3>Complete Usage and Configuration Options for Sysinternals.ProcDump</h3><p>The Sysinternals.ProcDump ADO task offers a range of input parameters, allowing you to customize its behavior to effectively capture crash dumps from your target processes. Here’s a breakdown of all available options:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*G6n5RyWRwLOLF8AlFqShIA.png" /></figure><p>The processName input is always required as well as either targetDirectory or artifactName and also a trigger (delay, cpuUsage or memoryUsage).</p><h3>Capture Deep System Traces with Procmon</h3><p>Since first releasing the <strong>ProcDump task</strong>, we’ve now added <strong>Procmon</strong> as well. This gives you another powerful Sysinternals tool you can run directly inside your Azure DevOps pipelines to capture detailed runtime information when you need it.</p><p>With the <strong>Procmon</strong> task, you can record file system, registry, and process activity during your pipeline run and save the log for offline analysis — making it easier to diagnose tricky issues that only show up in your CI/CD environment.</p><p>Here’s a simple example of how to use the new <strong>Procmon</strong> task in your YAML:</p><pre>- task: sysinternals.procmon@1<br>  inputs:<br>    logFile: myprocmonlog<br>    artifactName: myprocmonlogs<br>  displayName: &#39;Procmon&#39;</pre><p>This will run Procmon during your job, write the trace to myprocmonlog.pml, and publish it as a pipeline artifact under myprocmonlogs_windows.</p><p>With ProcDump and Procmon<strong> </strong>together, you now have lightweight, proven ways to capture memory dumps and deep system traces as part of your automated troubleshooting workflow — without needing to manually rerun builds to reproduce failures.</p><h3>Wrapping Up: Unlocking New Debugging Possibilities</h3><p>The Sysinternals ProcDump and Procmon ADO tasks are powerful additions to your ADO pipeline troubleshooting toolkit, enabling you to capture detailed crash dumps and deep system traces in restricted build environments. By leveraging its flexible configuration options, you can effectively diagnose a range of different issues that would otherwise be challenging to reproduce locally.</p><p>But this is just the beginning. The Sysinternals team is exploring expanding our suite of Azure DevOps tasks to help you navigate pipeline issues with the same reliability and efficiency you’ve come to expect from our tools in production environments.</p><p>We’re excited to hear about your experiences using the Sysinternals.ProcDump and Sysinternals.Procmon task over at <a href="https://learn.microsoft.com/en-us/answers/tags/435/sysinternals">https://learn.microsoft.com/en-us/answers/tags/435/sysinternals</a>. Your feedback is crucial in helping us refine this tool and prioritize future features and tasks. Share your thoughts, suggestions, or any challenges you encounter — we’re all ears!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1f61a61a1959" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Creating memory dumps using Sysinternals ProcDump for Mac]]></title>
            <link>https://medium.com/@marioh_78322/creating-memory-dumps-using-sysinternals-procdump-for-mac-dacc3aed0ba1?source=rss-f7af8c00afef------2</link>
            <guid isPermaLink="false">https://medium.com/p/dacc3aed0ba1</guid>
            <category><![CDATA[sysinternals]]></category>
            <category><![CDATA[memory-dump]]></category>
            <category><![CDATA[procdump]]></category>
            <category><![CDATA[mac]]></category>
            <dc:creator><![CDATA[Mario Hewardt]]></dc:creator>
            <pubDate>Fri, 15 Nov 2024 23:47:40 GMT</pubDate>
            <atom:updated>2024-11-15T23:47:40.900Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*A2R4KBNFi_DuqTgAtAlbHQ.jpeg" /></figure><p>The Sysinternals <strong>ProcDump</strong> tool has long been a go-to utility for capturing process memory dumps, especially for diagnosing performance issues like excessive CPU or memory usage. Its key strength lies in its ability to monitor specific conditions and automatically generate dumps when thresholds are breached — ideal for intermittent issues that are hard to replicate.</p><p>Previously available on Windows and Linux, ProcDump has now been extended to macOS. With the release of <strong>ProcDump 1.0 for Mac</strong>, users can enjoy consistent functionality across all three major platforms — Windows, Linux, and macOS. This makes ProcDump a versatile choice for developers and system administrators dealing with cross-platform diagnostics and performance tuning.</p><h3>A note on security</h3><p>A memory dump is a detailed snapshot of a process’s memory at a given moment in time. Because it captures the full contents of memory, it may contain highly sensitive information such as passwords, personal identifiers, encryption keys, and other critical data.</p><p>To safeguard this information consider using proper access controls, secure storage, limited permissions and retention policies.</p><p>Maintaining the confidentiality and integrity of memory dumps is vital to prevent potential data breaches or misuse.</p><h3>Installing ProcDump on Mac</h3><p>ProcDump for Mac is now easily installable via Homebrew, the popular package manager for macOS.</p><p><strong>Install Homebrew</strong>: If you don’t have Homebrew installed, visit <a href="https://brew.sh/">brew.sh</a> for step-by-step instructions.</p><p><strong>Add the Sysinternals Tap</strong>: Once Homebrew is installed, add the Sysinternals tap to access ProcDump and other Sysinternals tools. Run the following command in your terminal:</p><pre>brew tap Microsoft/sysinternalstap</pre><p><strong>Install ProcDump</strong>: With the tap added, install ProcDump for Mac using:</p><pre>brew install procdump</pre><h3>Running ProcDump on Mac</h3><p>Since ProcDump generates a memory dump which contains the memory contents of the target process, we have to run it using sudo.</p><pre>% sudo procdump<br>ProcDump v1.0.0 - Sysinternals process dump utility<br>Copyright (C) 2024 Microsoft Corporation. All rights reserved. Licensed under the MIT license.<br>Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi<br>Sysinternals - www.sysinternals.com<br>Monitors one or more processes and writes a core dump file when the processes exceeds the<br>specified criteria.<br><br>Capture Usage: <br>   procdump [-n Count]<br>            [-s Seconds]<br>            [-c|-cl CPU_Usage]<br>            [-m|-ml Commit_Usage1[,Commit_Usage2...]]<br>            [-tc Thread_Threshold]<br>            [-fc FileDescriptor_Threshold]<br>            [-pf Polling_Frequency]<br>            [-o]<br>            [-log syslog|stdout]<br>            {<br>             {{[-w] Process_Name | PID} [Dump_File | Dump_Folder]}<br>            }<br>Options:<br>   -n      Number of dumps to write before exiting.<br>   -s      Consecutive seconds before dump is written (default is 10).<br>   -c      CPU threshold above which to create a dump of the process.<br>   -cl     CPU threshold below which to create a dump of the process.<br>   -tc     Thread count threshold above which to create a dump of the process.<br>   -fc     File descriptor count threshold above which to create a dump of the process.<br>   -pf     Polling frequency.<br>   -o      Overwrite existing dump file.<br>   -log    Writes extended ProcDump tracing to the specified output stream (syslog or stdout).<br>   -w      Wait for the specified process to launch if it&#39;s not running</pre><p>Based on the available triggers, let’s say we wanted to generate a core dump when the CPU consumption of a target process with identifier 9036 is above 90%:</p><pre>% sudo procdump -c 90 9036  <br><br>ProcDump v1.0.0 - Sysinternals process dump utility<br>Copyright (C) 2024 Microsoft Corporation. All rights reserved. Licensed under the MIT license.<br>Mark Russinovich, Mario Hewardt, John Salem, Javid Habibi<br>Sysinternals - www.sysinternals.com<br><br>Monitors one or more processes and writes a core dump file when the processes exceeds the<br>specified criteria.<br><br>[15:27:56 - INFO]: Press Ctrl-C to end monitoring without terminating the process(es).<br>Process:                                top (9036)<br>CPU Threshold:                          &gt;= 90%<br>Commit Threshold:                       n/a<br>Thread Threshold:                       n/a<br>File Descriptor Threshold:              n/a<br>Polling Interval (ms):                  1000<br>Threshold (s):                          10<br>Number of Dumps:                        1<br>Output directory:                       .<br>[15:27:56 - INFO]: Starting monitor for process top (9036)<br>[15:27:57 - INFO]: Trigger: CPU usage:95% on process ID: 9036<br>[15:28:07 - INFO]: Core dump 0 generated: ./top_cpu_2024-11-15_15:27:57.9036<br>[15:28:07 - INFO]: Stopping monitor for process top(9036)</pre><p>In the example above, ProcDump is configured to monitor until the process exceeds 90% CPU usage. Upon detecting a spike (e.g., at 95%), ProcDump automatically generates a memory dump for analysis.</p><p>This is just one example of a trigger (CPU) that ProcDump supports but there are others as well (memory, thread count, file descriptor count). Please note that the first version of ProcDump for Mac does not have full trigger parity, but we are actively working on adding the others as well.</p><h3>We would love your feedback!</h3><p>ProcDump’s automated memory dump generation is super powerful. By capturing the memory dump at the moment an issue occurs, ProcDump simplifies root cause analysis, ensuring that transient issues don’t go unnoticed. It’s a great tool for performance troubleshooting and debugging.</p><p>We are always looking at adding support for new events and would love to hear from you if there are new events you would be interested in and/or any feedback in general.</p><p>You can find us on GitHub <a href="https://github.com/microsoft/ProcDump-for-Mac">here</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=dacc3aed0ba1" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Capturing Core Dumps of Crashing Processes using Sysinternals ProcDump for Linux]]></title>
            <link>https://medium.com/@marioh_78322/capturing-core-dumps-of-crashing-processes-using-sysinternals-procdump-for-linux-ff9c68c8c91b?source=rss-f7af8c00afef------2</link>
            <guid isPermaLink="false">https://medium.com/p/ff9c68c8c91b</guid>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[sysinternals]]></category>
            <category><![CDATA[procdump]]></category>
            <category><![CDATA[crash]]></category>
            <category><![CDATA[dumps]]></category>
            <dc:creator><![CDATA[Mario Hewardt]]></dc:creator>
            <pubDate>Tue, 23 Jan 2024 20:02:05 GMT</pubDate>
            <atom:updated>2024-01-23T20:02:05.950Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/88/1*LonmwgUG-f3JxwHkiWE5hA.png" /></figure><p>Sysinternals ProcDump for Linux is a versatile tool for monitoring processes and creating diagnostics data by allowing the user to set up triggers that generate core dumps when activated. Examples of triggers include CPU, memory, thread, file descriptor, signals, .NET integration and much more.</p><p>Recently, I was approached by the Microsoft Browser Support team here at Microsoft. They were trying to understand how they could generate core dumps for Microsoft Edge when the browser was misbehaving. They looked at ProcDump for Linux as a possible answer to the question — “How can we generate core dumps of Microsoft Edge on Linux when it crashes?”</p><p>We collaborated with the Microsoft Browser Support team to make sure they were able to use ProcDump for Linux to diagnose Edge problems and as part of that collaboration we added a couple of improvements that we feel will be super useful to everyone wanting to get core dumps for their crashing applications. These improvements were released in ProcDump 3.1 for Linux (<a href="https://github.com/Sysinternals/ProcDump-for-Linux/blob/master/INSTALL.md">https://github.com/Sysinternals/ProcDump-for-Linux/blob/master/INSTALL.md</a>).</p><h3>Crashing processes</h3><p>Windows engineers typically think of an application that unexpectedly crashes as having suffered from an unhandled exception. On Linux, things look a little different and uses the concept of signals. Conceptually speaking, a signal is delivered to a process when something of interest has occurred. Examples of signals are SIGINT which is delivered to a process when the user hits CTRL-C or SIGSEGV when the program has accessed a restricted area of memory.</p><p>It stands to reason that in order to generate a core dump when a process crashes, we have to determine which signal(s) that we consider to be crashing behaviors. As mentioned earlier, a SIGSEGV is typically considered a crashing behavior where we would like a core dump generated. Another example is SIGABRT that is typically sent when a program experiences an unhandled exception. Fortunately, ProcDump for Linux has had the capability of generating core dumps when a specific signal is encountered using the -sig switch. For example, if we wanted to generate a core dump when a SIGSEGV occurs we can issue the following command line:</p><pre>$ procdump <strong>-sig 11</strong> &lt;pid&gt;</pre><p>11 is the numerical representation of SIGSEGV. You can find a list of signals and their corresponding numerical representation by running:</p><pre>$ kill -l</pre><p>This capability is great when you know which signal is causing the crash, but what happens when you don’t know which signal to target? This was the dilemma that faced the Microsoft Browser Support team and led us to the addition of being able to specify multiple (comma separated) signals. For example, a helpful list of signals include SIGSEGV and SIGABRT:</p><pre>$ procdump -sig 11,6 &lt;pid&gt;</pre><p>The above command line generates a dump when either a SIGSEGV or SIGABRT is encountered.</p><h3>Controlling the size of the core dump</h3><p>Conceptually, a core dump is a static snapshot of the memory contents of a given process. It can contain a number of different categories of memory such as anonymous private mappings, file-backed private mappings, huge pages and more. Most of the time, the size of the generated core dump will be manageable but there are processes that use a lot of memory. As a result, including <em>everything </em>in the core dump can make them prohibitively large. For example, an application that simply creates an anonymous mapping of 10GB and never uses any of it leads to a core dump of 10GB+. With an excessively large core dump, there may not be enough room to store it and/or transferring the core dump from a production machine can be too expensive.</p><p>This was the exact scenario that the Microsoft Browser Support team found themselves in when troubleshooting Microsoft Edge. When Microsoft Edge crashed, the resulting core dump was very large and made it challenging to accurately manage it. As a result, in order to address this issue, ProcDump now includes the -mc switch which allows you to specify the type of memory to include in the dump. The -mc switch takes a hexadecimal number representing a bitmask of the different memory categories. The current list of options are shown below but you can also get the most up-to-date by running man core.</p><pre>          bit 0  Dump anonymous private mappings.<br>          bit 1  Dump anonymous shared mappings.<br>          bit 2  Dump file-backed private mappings.<br>          bit 3  Dump file-backed shared mappings.<br>          bit 4 (since Linux 2.6.24)     Dump ELF headers.<br>          bit 5 (since Linux 2.6.28)   Dump private huge pages.<br>          bit 6 (since Linux 2.6.28)  Dump shared huge pages.<br>          bit 7 (since Linux 4.4)  Dump private DAX pages.<br>          bit 8 (since Linux 4.4)  Dump shared DAX pages.</pre><p>For example, if we wanted to include only anonymous mappings (both private and shared) and ELF headers, we would end up with the following bitmask:</p><pre>000010011 (hexadecimal 13)</pre><p>The ProcDump command line would now look like:</p><pre>$ sudo procdump -sig 11,6 <strong>-mc 13</strong> &lt;pid&gt;</pre><p>This resuling core dump will be smaller than the default setting. Of course, one caveat to keep in mind is that anytime you remove information from a core dump you also remove the ability to troubleshoot a problem that relies on that diagnostics data being present.</p><p><strong>Tip:</strong> Microsoft Edge will create multiple processes when browsing the web. In order to know which tab belongs to which process you can use:</p><p>…-&gt;More tools-&gt;Browser task manager</p><p>This will open up a new window which lists the different tasks with their corresponding process ID.</p><h3>Thank You!</h3><p>This was a fun collaboration between the Microsoft Sysinternals team and Microsoft Support that led to some cool new features that helped them diagnose issues in Edge for Linux.</p><p>We’re super excited about these new features and hope that you are as well! We’d love to get your feedback on new feature requests or bugs.</p><p>Simply head to our GitHub page — <a href="https://github.com/Sysinternals/ProcDump-for-Linux/">https://github.com/Sysinternals/ProcDump-for-Linux</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ff9c68c8c91b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Memory Leak Tracking Using ProcDump for Linux]]></title>
            <link>https://medium.com/@marioh_78322/memory-leak-tracking-using-procdump-for-linux-c93644e5d197?source=rss-f7af8c00afef------2</link>
            <guid isPermaLink="false">https://medium.com/p/c93644e5d197</guid>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[memory-leak]]></category>
            <category><![CDATA[diagnostic]]></category>
            <category><![CDATA[procdump-for-linux]]></category>
            <category><![CDATA[sysinternals]]></category>
            <dc:creator><![CDATA[Mario Hewardt]]></dc:creator>
            <pubDate>Wed, 06 Dec 2023 22:09:40 GMT</pubDate>
            <atom:updated>2023-12-07T15:54:40.861Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/656/1*ltwRcYz2XuH7lU7t8QyNaQ.jpeg" /></figure><p>Quite often when it comes to generating core dumps based off of memory triggers, we are faced with the challenge of identifying where memory is mysteriously disappearing using just a core dump. Wouldn’t it be awesome to get the call stacks of the leaked memory in addition to the core dump? The newly released <a href="https://github.com/Sysinternals/ProcDump-for-Linux">ProcDump 3.0 for Linux</a> now has support for both!</p><h3>Using ProcDump for Linux to track memory</h3><p>With the release of ProcDump 3.0 for Linux we now have a memory leak tracking capability. Initially we enabled tracking for the malloc family of APIs, but we will extend this in the future to track other memory/resource allocation functions as well.</p><p>In order to track memory allocations, ProcDump has a new -restrack switch. This switch tells ProcDump to track memory allocations and produce a leak tracking report every time a core dump is generated. In essence, leak tracking works hand in hand with the existing triggers. This comes in super handy since oftentimes we want the dump and leak report to be generated at the same time (to minimize discrepancies between the two).</p><p>Let’s look at an example, suppose we want to track the memory allocations of a test application called testprog. Furthermore, let’s say we want both a core dump and a leak track report to be generated when memory exceeds 3MB:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sATRs6BmNPuemPflg7lvXQ.jpeg" /></figure><p>Here we can see that resource tracking has been turned on (we’ll cover the sample rate later) and ProcDump is waiting for the memory of the target process to exceed 3MB. Once the threshold has been reached, ProcDump outputs the following:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oY_VeCI7H9hPoLVUeZPxUQ.jpeg" /></figure><p>Here we can see that in addition to the core dump we also have a restrack file that contains possible leaked allocations:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*v3REO_0yeTzjwiGgEF_l7A.jpeg" /></figure><p>(above output has been abbreviated)</p><p>The resulting leak tracking file (same name as core dump plus .restrack) consists of one or more allocations that are considered leaked. The first allocation above shows that there has been 0x5c allocations of size 0x2710 each for a total of 0xe09c0 bytes. It also shows the call stack that led to the leaked allocation(s). This information pinpoints exactly where in the application the leak occurred making it much easier to diagnose.</p><h3>What about false positives?</h3><p>In the example above, the second allocation also shows as leaked (contains std::vector frames) but it turns out is not <em>actually</em> a leak. The application is utilizing a cache that sticks around for the duration of the application lifetime. In order to avoid having to parse through allocations that are not actually leaks, ProcDump supports the -fx switch which ignores any call stacks with the specified frames. For example, if we run:</p><pre>sudo ./procdump -m 3 -restrack <strong>-fx &quot;*std::_Vector_base&lt;void*, std::allocator&lt;void*&gt; &gt;::_M_allocate*&quot;</strong> -w testapp</pre><p>ProcDump will ignore all allocations whose call stacks contains a frame with the specified string value (wildcards are supported). Running the above in the exact same scenario as above, we now end up with just one leaked allocation:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UbqDnflDinLyZOFt4Nq-3w.jpeg" /></figure><p>As you can see, being able to exclude allocations that aren’t true leaks can greatly help reduce the noise and help you more efficiently focus your time.</p><h3>Sample rate</h3><p>Generally speaking, the overhead of using resource tracking with ProcDump should be pretty minimal, but in certain circumstances (heavily loaded production workloads), resource tracking can add enough overhead to interfere with the workload. To help reduce this impact, ProcDump also supports a -sr switch (sample rate) which accepts a sampling rate number (default is 1). At the moment, the sampling algorithm simply takes samples every X allocations and reports only on those allocations. For example, using the same scenario as above, only this time we want to sample every 10 allocations, we can run the following:</p><pre>sudo ./procdump -m 3 -restrack <strong>-sr 10</strong> -fx &quot;*std::_Vector_base&lt;void*, std::allocator&lt;void*&gt; &gt;::_M_allocate*&quot; -w testapp</pre><p>Resulting in the following output:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BqErZJMqRMU8oJoIgVsD2g.jpeg" /></figure><p>Here we can see that the allocation count has gone down quite a bit (0x8 vs. 0x51) as a result of only sampling every 10 allocations.</p><h3>Thank You!</h3><p>We’re super excited about this new allocation tracking feature and hope that you are as well!</p><p>We’d love to get your feedback on both the new allocation tracker as well as all other feature requests or bugs.</p><p>You can find us on GitHub <a href="https://github.com/Sysinternals/ProcDump-for-Linux">here</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c93644e5d197" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ZoomIt Now Supports Highlighting and Blurring!]]></title>
            <link>https://medium.com/@marioh_78322/zoomit-now-supports-highlighting-and-blurring-d431bfb100df?source=rss-f7af8c00afef------2</link>
            <guid isPermaLink="false">https://medium.com/p/d431bfb100df</guid>
            <category><![CDATA[presentations]]></category>
            <category><![CDATA[zoomit]]></category>
            <category><![CDATA[sysinternals]]></category>
            <dc:creator><![CDATA[Mario Hewardt]]></dc:creator>
            <pubDate>Thu, 09 Nov 2023 17:01:45 GMT</pubDate>
            <atom:updated>2023-11-09T17:01:45.963Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kQJM8NRv_OgvIskAv7HShg.jpeg" /></figure><p>We have a new and exciting release of <a href="https://learn.microsoft.com/en-us/sysinternals/downloads/zoomit">ZoomIt</a> (v7.2) this month which adds:</p><ol><li>Highlighting</li><li>Blurring</li><li>Microphone selection (during screen recording)</li><li>Automatically copies the recorded video to the clipboard</li></ol><h3>Highlighting</h3><p>If you want to draw attention to an area while you are in draw mode, ZoomIt now has highlighting capabilities. While in draw mode, simply press SHIFT and the color of choice (same color choices as with regular drawing) and ZoomIt will now highlight using the selected color. You can use all the available shapes (rectangle, oval etc.) to make highlighting larger areas quick and easy.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FvNU1ZT7L0jc%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DvNU1ZT7L0jc&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FvNU1ZT7L0jc%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/650b8e242960f2f8413660f2f41fb41b/href">https://medium.com/media/650b8e242960f2f8413660f2f41fb41b/href</a></iframe><h3>Blurring</h3><p>Blurring is another super useful feature that we added which helps when you want to redact sensitive information in the screen captures. Similar to highlighting, once in draw mode you can simply hit x and use any of the shapes to easily and quickly blur the content.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FaiBaolEmaG8%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DaiBaolEmaG8&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FaiBaolEmaG8%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/9f0625f1132e3f40123b9e377d267cc3/href">https://medium.com/media/9f0625f1132e3f40123b9e377d267cc3/href</a></iframe><h3>Microphone selection</h3><p>Previously, while recording audio during screen recording, ZoomIt always used the default audio device. With this latest release we’ve added the capability of choosing the audio device to be used during the recordings. To select the audio device, simply go to the ZoomIt options dialog under the Record tab.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/632/1*myafVBI-H9k6qWVU6HuGMA.png" /></figure><h3>Copy recording to clipboard</h3><p>When you take <em>screenshots </em>with ZoomIt, the screenshot is automatically copied to the clipboard making it super easy to share by simply pasting into other applications. With the latest ZoomIt release, <em>screen recordings</em> are also automatically copied to the clipboard making it a snap to share recordings as well.</p><p>For example, let’s assume I’ve just finished recording a video using ZoomIt and want to attach the video to an email. I can easily just create a new email and by simply hitting CTRL-V it pastes the video into the email.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FDYeYMX-8TYo%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DDYeYMX-8TYo&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FDYeYMX-8TYo%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/948d4b075e442fbd6746805b31ee9bad/href">https://medium.com/media/948d4b075e442fbd6746805b31ee9bad/href</a></iframe><h3>Thank You!</h3><p>We’re super excited about these new features and hope that you are as well! We’d love to get your feedback on new feature requests or bugs. Simply reach out to us at <a href="https://aka.ms/sysint-forums">Microsoft Q&amp;A — Sysinternals</a>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d431bfb100df" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sysmon for Linux File Hashing]]></title>
            <link>https://medium.com/@marioh_78322/sysmon-for-linux-file-hashing-cc80838cd3fb?source=rss-f7af8c00afef------2</link>
            <guid isPermaLink="false">https://medium.com/p/cc80838cd3fb</guid>
            <category><![CDATA[sysmon]]></category>
            <category><![CDATA[diagnostics-tools]]></category>
            <category><![CDATA[security]]></category>
            <category><![CDATA[sysinternals]]></category>
            <dc:creator><![CDATA[Mario Hewardt]]></dc:creator>
            <pubDate>Wed, 27 Sep 2023 16:03:01 GMT</pubDate>
            <atom:updated>2023-09-27T16:03:01.832Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Memory dump represented as numbers" src="https://cdn-images-1.medium.com/max/1024/1*A2R4KBNFi_DuqTgAtAlbHQ.jpeg" /></figure><p>With the release of Sysmon 1.3 for Linux, we are happy to announce that Sysmon for Linux now supports file hashing. This exciting feature was added as a community contribution by <a href="https://github.com/eeriedusk">eeriedusk</a> via <a href="https://github.com/Sysinternals/SysmonForLinux/pull/121">PR #121</a>.</p><h4>Why is file hashing important?</h4><p>One of the key ideas behind file hashing is to provide a mechanism by which we can tell if a file has been tampered with. For example, when I execute calc.exe on my system, I get a notification that an instance of calc.exe has been launched. How do I know if that instance represents the Microsoft version of calc.exe that ships with Windows or some other file that just happens to masquerade as the official version (such as a piece of malware)? Enter file hashing. At a high level, a file hash represents a mathematical representation of the contents of a file. If that file changes, so does the hash, allowing us to detect changes to a file that could represent malicious code.</p><p>Sysmon for Linux supports SHA-1, SHA-256 and MD5 hashing algorithms.</p><h4>How do I enable file hashing?</h4><p>You can enable file hashing in the Sysmon configuration file be specifying the hashing algorithm as shown in the example below:</p><pre>&lt;Sysmon schemaversion=&quot;4.81&quot;&gt;<br>    &lt;HashAlgorithms&gt;<strong>md5</strong>&lt;/HashAlgorithms&gt;<br>        &lt;EventFiltering&gt;<br>                &lt;ProcessCreate onmatch=&quot;exclude&quot; /&gt;<br>                &lt;RawAccessRead onmatch=&quot;exclude&quot; /&gt;<br>                &lt;ProcessTerminate onmatch=&quot;exclude&quot; /&gt;<br>                &lt;FileCreate onmatch=&quot;exclude&quot; /&gt;<br>                &lt;FileDelete onmatch=&quot;exclude&quot; /&gt;<br>        &lt;/EventFiltering&gt;<br>&lt;/Sysmon&gt;</pre><p>Here we enable MD5 hashing for all events that support file hashing. Currently, file hashing is supported for Process Create and File Delete events. Here is an example of a Process Create event:</p><pre>Event SYSMONEVENT_CREATE_PROCESS<br>        RuleName: -<br>        UtcTime: 2023-09-27 15:28:54.094<br>        ProcessGuid: {b345ea09-4a36-6514-d53b-893dc6550000}<br>        ProcessId: 716074<br>        Image: /usr/bin/sudo<br>        FileVersion: -<br>        Description: -<br>        Product: -<br>        Company: -<br>        OriginalFileName: -<br>        CommandLine: sudo tail -f /var/log/syslog<br>        CurrentDirectory: x<br>        User: x<br>        LogonGuid: x<br>        LogonId: 1000<br>        TerminalSessionId: 564<br>        IntegrityLevel: no level<br>        <strong>Hashes: MD5=ea962dfe3798a39f85e7206ec24b2c88</strong><br>        ParentProcessGuid: {00000000-0000-0000-0000-000000000000}<br>        ParentProcessId: 512332<br>        ParentImage: -<br>        ParentCommandLine: -<br>        ParentUser: -</pre><p>You can also specify multiple file hashing algorithms separated by comma as shown below:</p><pre>&lt;Sysmon schemaversion=&quot;4.81&quot;&gt;<br>    &lt;HashAlgorithms&gt;<strong>md5,sha256</strong>&lt;/HashAlgorithms&gt;<br>        &lt;EventFiltering&gt;<br>                &lt;ProcessCreate onmatch=&quot;exclude&quot; /&gt;<br>                &lt;RawAccessRead onmatch=&quot;exclude&quot; /&gt;<br>                &lt;ProcessTerminate onmatch=&quot;exclude&quot; /&gt;<br>                &lt;FileCreate onmatch=&quot;exclude&quot; /&gt;<br>                &lt;FileDelete onmatch=&quot;exclude&quot; /&gt;<br>        &lt;/EventFiltering&gt;<br>&lt;/Sysmon&gt;</pre><p>An example of the corresponding event with both md5 and sha256 enabled is shown below:</p><pre>Event SYSMONEVENT_CREATE_PROCESS<br>        RuleName: -<br>        UtcTime: 2023-09-27 15:51:35.859<br>        ProcessGuid: {b345ea09-4f87-6514-f12e-7df812560000}<br>        ProcessId: 719065<br>        Image: /usr/bin/tail<br>        FileVersion: -<br>        Description: -<br>        Product: -<br>        Company: -<br>        OriginalFileName: -<br>        CommandLine: tail<br>        CurrentDirectory: x<br>        User: x<br>        LogonGuid: x<br>        LogonId: 1000<br>        TerminalSessionId: 531<br>        IntegrityLevel: no level<br>        <strong>Hashes: MD5=4e9e76a4809318e0a0ad4b8292f898b9,SHA256=00483d769f2d15f6d3c0f6f2d9c3c8dde3d377094d8411738f0f3b335008cf84</strong><br>        ParentProcessGuid: {00000000-0000-0000-0000-000000000000}<br>        ParentProcessId: 503664<br>        ParentImage: -<br>        ParentCommandLine: -<br>        ParentUser: -</pre><h4>Reach out!</h4><p>We’d love to get your feedback on Sysinternals Sysmon for Linux and how we can improve.</p><p>The repo can be found here — <a href="https://github.com/Sysinternals/SysmonForLinux">https://github.com/Sysinternals/SysmonForLinux</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cc80838cd3fb" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>