<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fortifie</title>
    <description>The latest articles on DEV Community by Fortifie (@fortifie).</description>
    <link>https://dev.to/fortifie</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4246197%2Fe4ff7e7b-e462-4883-887e-853051f873f4.png</url>
      <title>DEV Community: Fortifie</title>
      <link>https://dev.to/fortifie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fortifie"/>
    <language>en</language>
    <item>
      <title>How to Tell If Your Mac App Has Been Cracked</title>
      <dc:creator>Fortifie</dc:creator>
      <pubDate>Sun, 15 Nov 2026 16:49:58 +0000</pubDate>
      <link>https://dev.to/fortifie/how-to-tell-if-your-mac-app-has-been-cracked-49hn</link>
      <guid>https://dev.to/fortifie/how-to-tell-if-your-mac-app-has-been-cracked-49hn</guid>
      <description>&lt;p&gt;Search your app name plus "crack", "cracked" or "free download" on Google, warez and torrent sites, and GitHub. Record those listings by URL and screenshot; do not download from them. If you already have a copy, inspect it with &lt;code&gt;codesign -dv --verbose=4&lt;/code&gt; and &lt;code&gt;spctl -a -vv&lt;/code&gt; without launching it, then compare Team ID and cdhash to your release. &lt;a href="https://fortifie.xyz/cracked" rel="noopener noreferrer"&gt;https://fortifie.xyz/cracked&lt;/a&gt; runs the listings search faster, a search of public listings, not proof.&lt;/p&gt;

&lt;p&gt;This guide is for the developer who published the app, not for someone seeing a Gatekeeper warning. A cracked copy can appear on a warez site, a torrent index or GitHub without showing up in your analytics.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to check whether your Mac app has been cracked
&lt;/h2&gt;

&lt;p&gt;Start with a search, not a download. On Google, query your app name plus "crack", "cracked", "free download" or "dmg", and quote the name if it is generic. Repeat those queries on Mac warez sites and torrent indexes, then search GitHub for the app name, your bundle ID, or a distinctive Info.plist string.&lt;/p&gt;

&lt;p&gt;Do not download anything from a crack, warez or torrent listing; record that listing by URL and screenshot only. If you already have a copy, for example one a user sent you, keep it in an isolated folder. Do not launch the &lt;code&gt;.app&lt;/code&gt; or drag it into &lt;code&gt;/Applications&lt;/code&gt;. Mount a disk image if you have to, then point the tools at the bundle inside.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codesign -dv --verbose=4 /path/to/Suspected.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;codesign(1)&lt;/code&gt; man page describes &lt;code&gt;--display&lt;/code&gt; (&lt;code&gt;-d&lt;/code&gt;) as printing signature information; higher verbosity produces more fields. At &lt;code&gt;--verbose=4&lt;/code&gt; look for &lt;code&gt;Identifier&lt;/code&gt; (usually your &lt;code&gt;CFBundleIdentifier&lt;/code&gt;), &lt;code&gt;TeamIdentifier&lt;/code&gt; (your Apple Developer Team ID), &lt;code&gt;CDHash&lt;/code&gt; (the code directory hash for that architecture), and &lt;code&gt;Authority&lt;/code&gt; (the certificate chain, typically &lt;code&gt;Developer ID Application&lt;/code&gt; on a direct-distribution release).&lt;/p&gt;

&lt;p&gt;Compare &lt;code&gt;TeamIdentifier&lt;/code&gt; and &lt;code&gt;CDHash&lt;/code&gt; to the same output from the build you shipped. Apple's &lt;a href="https://developer.apple.com/documentation/technotes/tn3126-inside-code-signing-hashes" rel="noopener noreferrer"&gt;TN3126: Inside Code Signing: Hashes&lt;/a&gt; explains that the cdhash uniquely identifies the signed code. Matching values mean an unmodified copy of that signed build. A missing or ad hoc signature, or a different cdhash on a bundle that still looks like your app, can mean a patched or re-signed copy.&lt;/p&gt;

&lt;p&gt;For a universal app, &lt;code&gt;codesign --display&lt;/code&gt; reports the native architecture of the Mac you are using, so check each slice with &lt;code&gt;--arch arm64&lt;/code&gt; and &lt;code&gt;--arch x86_64&lt;/code&gt;. Display does not fully prove the signature is intact. The man page notes that &lt;code&gt;--display&lt;/code&gt; is not a complete verification, and that &lt;code&gt;--verify&lt;/code&gt; does not apply Gatekeeper or other OS policy. Also run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codesign --verify --deep --strict --verbose=2 /path/to/Suspected.app
spctl -a -vv /path/to/Suspected.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;spctl --assess&lt;/code&gt; (&lt;code&gt;-a&lt;/code&gt;) asks the system policy subsystem whether the file would be allowed to run. The default type is execute, and verbose output typically includes &lt;code&gt;accepted&lt;/code&gt; or &lt;code&gt;rejected&lt;/code&gt; plus a &lt;code&gt;source=&lt;/code&gt; line such as &lt;code&gt;Notarized Developer ID&lt;/code&gt; or &lt;code&gt;no usable signature&lt;/code&gt;. This is a policy check, not the same as opening the app. See Apple's &lt;a href="https://developer.apple.com/documentation/technotes/tn3161-inside-code-signing-certificates" rel="noopener noreferrer"&gt;TN3161: Inside Code Signing: Certificates&lt;/a&gt; for Team IDs, &lt;code&gt;codesign --verify&lt;/code&gt;, and &lt;code&gt;syspolicy_check&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fortifie.xyz/cracked" rel="noopener noreferrer"&gt;https://fortifie.xyz/cracked&lt;/a&gt; is a free search of public listings for your app, not proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't run the cracked copy
&lt;/h2&gt;

&lt;p&gt;Treat an untrusted copy as malware until you have a reason not to. Warez installers often carry unrelated payloads. Your release records, plus the signature and file comparison below, can confirm whether a copy you already have is your build.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;codesign&lt;/code&gt; and &lt;code&gt;spctl&lt;/code&gt; read the bundle and its signature; they are not the same as launching the app from Finder. For more isolation, inspect the copy in a virtual machine with no development keys or customer data, or just read the signature, Info.plist, resources and hashes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Confirm it's your build
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Match the version and the files
&lt;/h3&gt;

&lt;p&gt;Compare &lt;code&gt;CFBundleShortVersionString&lt;/code&gt;, &lt;code&gt;CFBundleVersion&lt;/code&gt; and &lt;code&gt;CFBundleIdentifier&lt;/code&gt; in the copy's Info.plist to the release you shipped. Then compare file hashes for the main executable and, if you still have it, the shipping archive.&lt;/p&gt;

&lt;p&gt;An unmodified leak matches your release exactly: same cdhash, same Team ID, same file hashes. A patched crack will not, because the binary has changed, so also compare the bundle ID, version, icons and other resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Record where and when you found it
&lt;/h3&gt;

&lt;p&gt;Keep the URL, the date and time you found it, screenshots, and, for any copy you already have, the &lt;code&gt;codesign&lt;/code&gt; and &lt;code&gt;spctl&lt;/code&gt; output, the version string, bundle ID, Team ID and cdhash. Do not depend on the listing staying up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find the other copies
&lt;/h2&gt;

&lt;p&gt;Listings get mirrored quickly. After you find one listing, search again for the app name and distinctive strings on GitHub, torrent indexes, Mac warez sites, file hosts, and Telegram or similar groups, and record each new listing by URL and screenshot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fortifie.xyz/cracked" rel="noopener noreferrer"&gt;https://fortifie.xyz/cracked&lt;/a&gt; can run a free search of public listings for your app, not proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Send takedowns the right way
&lt;/h2&gt;

&lt;p&gt;This is not legal advice. Talk to a lawyer if needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use a DMCA 512(c) copyright notice, not 1201
&lt;/h3&gt;

&lt;p&gt;A notice under 17 U.S.C. 512(c) is a copyright notice to a service provider that identifies your work and the infringing URL. A claim under 17 U.S.C. 1201 is about circumventing a technical protection measure, not about the hosted copy of your work.&lt;/p&gt;

&lt;p&gt;GitHub reviews copyright notices under its &lt;a href="https://docs.github.com/en/site-policy/content-removal-policies/dmca-takedown-policy" rel="noopener noreferrer"&gt;DMCA Takedown Policy&lt;/a&gt;. In a &lt;a href="https://news.ycombinator.com/item?id=49982498" rel="noopener noreferrer"&gt;Hacker News thread&lt;/a&gt; about copies of Photopea, a 1201 notice sat unresolved for weeks. File a 512(c) copyright notice that lists your work and the exact URLs. A notice on one URL does not clear every mirror.&lt;/p&gt;

&lt;h3&gt;
  
  
  Notify the host, then the search engines
&lt;/h3&gt;

&lt;p&gt;Send the notice to the host or platform, then ask search engines to drop the listing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://support.google.com/legal/answer/3110420" rel="noopener noreferrer"&gt;Google's process for removing content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.microsoft.com/en-us/legal/intellectualproperty/infringement" rel="noopener noreferrer"&gt;Microsoft's infringement notices&lt;/a&gt;, which cover Bing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What should you do if your Mac app is cracked? Record the listing by URL and screenshot, check any copy you already have without launching it, search for mirrors, file a 512(c) notice with the host and then with search engines, and keep honest licenses working offline. Harden the next release, and skip a hostile update that breaks paying users.&lt;/p&gt;

&lt;p&gt;How do you get a cracked app removed from GitHub? File a 512(c) copyright notice that identifies your work and the repository or file URLs, following GitHub's DMCA Takedown Policy, then check for mirrors. A notice on one repo does not clear copies hosted elsewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep paying customers working
&lt;/h2&gt;

&lt;p&gt;Do not ship a panic update that breaks honest licenses or adds a new online check that fails offline. A hostile update often misses cracked copies, which will not update, and can anger paying customers. Keep offline use working for valid licenses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the next crack cost more
&lt;/h2&gt;

&lt;p&gt;Code signing and notarization are worth doing, and they are not a crack barrier. Apple's &lt;a href="https://developer.apple.com/documentation/security/notarizing-macos-software-before-distribution" rel="noopener noreferrer"&gt;guide to notarizing macOS software&lt;/a&gt; describes notarization as a check for malicious components in Developer ID-signed software you distribute, and as a ticket Gatekeeper can use. A patched copy can have its signature stripped or replaced, so your release ticket does not cover the new cdhash. Users can also override Gatekeeper.&lt;/p&gt;

&lt;p&gt;In the next build, make the license path slower and more expensive to reverse engineer, including with AI-assisted tools, without turning the app into a maze for paying users. Avoid a single obvious branch that returns "licensed" or "not," and keep the unlock tied to a signed grant that still works offline. This raises the cost of a patch; it does not make cracking impossible.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to just let it go
&lt;/h2&gt;

&lt;p&gt;Not every listing is worth a week of your time. If the host ignores notices, or chasing mirrors would cost more than the next release, document what you found and move on.&lt;/p&gt;

&lt;p&gt;Fortifie Leak Finder searches public GitHub and web results for listings by app name. A name hit is not a confirmed copy of your build: you still do the signature and file comparison above. You can also upload a recovered file you already have; Fortifie hashes it and, for protected JavaScript builds, checks whether it carries your account's fingerprint. Fortifie drafts a takedown notice for you to approve and send; it does not send the notice. &lt;a href="https://fortifie.xyz/cracked" rel="noopener noreferrer"&gt;https://fortifie.xyz/cracked&lt;/a&gt; is a search of public listings, not proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How do I know if my Mac app has been cracked or pirated?
&lt;/h3&gt;

&lt;p&gt;Search your app name plus "crack", "cracked" or "free download" on Google, warez and torrent sites, and GitHub. Record those listings by URL and screenshot; do not download from them. If you already have a copy, inspect it with &lt;code&gt;codesign -dv --verbose=4&lt;/code&gt; and &lt;code&gt;spctl -a -vv&lt;/code&gt; without launching it, and compare the Team ID and cdhash to your release.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I stop my Mac app from being cracked completely?
&lt;/h3&gt;

&lt;p&gt;No. Signing, notarization and license hardening raise the cost of a crack. They do not make cracking impossible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does a DMCA notice remove a cracked app from GitHub?
&lt;/h3&gt;

&lt;p&gt;GitHub reviews 512(c) copyright notices under its DMCA Takedown Policy. Identify your work and the infringing URLs, then check for mirrors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I use a 512(c) or a 1201 DMCA notice?
&lt;/h3&gt;

&lt;p&gt;For a hosted copy of your app, use a 512(c) copyright notice. A 1201 notice is about circumvention of a technical measure, and it can stall, as developers discussed in the Hacker News thread about Photopea copies on GitHub.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will notarization stop someone from cracking my app?
&lt;/h3&gt;

&lt;p&gt;No. Notarization tells Gatekeeper that Apple checked your Developer ID-signed software for malicious components. It does not prevent someone from patching a local binary, re-signing it ad hoc, or overriding Gatekeeper.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I know a cracked copy is actually my app?
&lt;/h3&gt;

&lt;p&gt;Match the Team ID and cdhash to your release for an unmodified copy. If the binary has been patched, those will not match, so also compare the bundle ID, version, icons and resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I ship an update that breaks the cracked version?
&lt;/h3&gt;

&lt;p&gt;No. A hostile update often misses people on the cracked copy, who will not update, and it can break paying customers. Keep honest licenses working offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;p&gt;Found a clone or a re-skinned copy rather than a crack? Read &lt;a href="https://fortifie.xyz/blog/someone-cloned-my-app" rel="noopener noreferrer"&gt;Someone Cloned My App: How to Prove It and What to Do&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>macos</category>
      <category>swift</category>
      <category>security</category>
      <category>indiedev</category>
    </item>
  </channel>
</rss>
