Transmit is an OSX utility for mounting remote filesystems and the protection can be easily disabled to turn the program into a fully-working program without limitations nor nag hints or prompts.
The first function to eliminate is responsible for showing the "demo" banner on the window bezel. We can disable it entirely:
methImpl_TransmitDocument_updateCountdownView: 00000001000087d5 55 push rbp 00000001000087d6 4889E5 mov rbp, rsp 00000001000087d9 4157 push r15 00000001000087db 4156 push r14 00000001000087dd 4155 push r13 00000001000087df 4154 push r12 00000001000087e1 53 push rbx 00000001000087e2 4881EC88000000 sub rsp, 0x88 00000001000087e9 E99D0F0000 jmp 0x10000978b ... 000000010000978b 4881C488000000 add rsp, 0x88 ; XREF=0x1000087e9 0000000100009792 5B pop rbx 0000000100009793 415C pop r12 0000000100009795 415D pop r13 0000000100009797 415E pop r14 0000000100009799 415F pop r15 000000010000979b 5D pop rbp 000000010000979c C3 ret
Second, we disable the method that is responsible for updating the launch days:
_PCSerialCheckUpdateLaunchDaysTimerDidFire_1000d1c04: 00000001000d1c04 55 push rbp ; XREF=0x10005fd97 00000001000d1c05 4889E5 mov rbp, rsp 00000001000d1c08 4157 push r15 00000001000d1c0a 4156 push r14 00000001000d1c0c 4155 push r13 00000001000d1c0e 4154 push r12 00000001000d1c10 53 push rbx 00000001000d1c11 4881EC88000000 sub rsp, 0x88 00000001000d1c18 488B05A9C80700 mov rax, qword [ds:imp___got____stack_chk_guard] 00000001000d1c1f 488B00 mov rax, qword [ds:rax] 00000001000d1c22 488945D0 mov qword [ss:rbp+0xffffffffffffffd0], rax 00000001000d1c26 803D5B260C0000 cmp byte [ds:___PCShouldUpdateRegistrationData__], 0x0 00000001000d1c2d E9EC0F0000 jmp 0x1000d2c1e ...
Since we will never purchase the software, we can get rid of the "Purchase" menu by reverse-engineering the MainMenu.nib
file. First we use NibUnlocker to dump a XIB out of the MainMenu.nib
. Next, by opening the XIB with a text editor and looking at XML nodes, we see:
<object class="NSMenuItem" id="491"> <int key="NSMnemonicLoc">2147483647</int> <reference key="NSMenu" ref="5"/> <int key="NSKeyEquivModMask">1048576</int> <string key="NSKeyEquiv"></string> <int key="NSTag">500</int> <object class="NSMenu" key="NSSubmenu" id="493"> <string key="NSTitle">Purchase</string> <object class="NSMutableArray" key="NSMenuItems"> <bool key="EncodedWithXMLCoder">YES</bool> <object class="NSMenuItem" id="494"> <int key="NSMnemonicLoc">2147483647</int> <reference key="NSMenu" ref="493"/> <int key="NSKeyEquivModMask">1048576</int> <string key="NSKeyEquiv"></string> <string type="base64-UTF8" key="NSTitle">UHVyY2hhc2UgVHJhbnNtaXQgT25saW5l4oCm</string> <reference key="NSOnImage" ref="540"/> <reference key="NSMixedImage" ref="541"/> </object> <object class="NSMenuItem" id="497"> <int key="NSMnemonicLoc">2147483647</int> <reference key="NSMenu" ref="493"/> <int key="NSKeyEquivModMask">1048576</int> <string key="NSKeyEquiv"></string> <string key="NSTitle">Transmit Home Page</string> <reference key="NSOnImage" ref="540"/> <reference key="NSMixedImage" ref="541"/> </object> <object class="NSMenuItem" id="500"> <int key="NSMnemonicLoc">2147483647</int> <reference key="NSMenu" ref="493"/> <int key="NSKeyEquivModMask">1048576</int> <bool key="NSIsSeparator">YES</bool> <string key="NSKeyEquiv"></string> <bool key="NSIsDisabled">YES</bool> <string key="NSTitle"></string> <reference key="NSOnImage" ref="540"/> <reference key="NSMixedImage" ref="541"/> </object> <object class="NSMenuItem" id="503"> <int key="NSMnemonicLoc">2147483647</int> <reference key="NSMenu" ref="493"/> <int key="NSKeyEquivModMask">1048576</int> <string key="NSKeyEquiv"></string> <string type="base64-UTF8" key="NSTitle">VW5sb2NrIFRyYW5zbWl04oCm</string> <reference key="NSOnImage" ref="540"/> <reference key="NSMixedImage" ref="541"/> </object> </object> </object> <string key="NSTitle">Purchase</string> <string key="NSAction">submenuAction:</string> <reference key="NSOnImage" ref="540"/> <reference key="NSMixedImage" ref="541"/> </object>
In essence, this builds several objects, NSMenuItem
and several NSMenuItem
s with the following IDs:
<object class="NSMenuItem" id="491"> <object class="NSMenu" key="NSSubmenu" id="493"> <object class="NSMenuItem" id="494"> <object class="NSMenuItem" id="497"> <object class="NSMenuItem" id="500"> <object class="NSMenuItem" id="503">
In order to get rid of the entire menu, we go through the entire XIB file and look for ref
tags that would reference the numbers:
491 493 494 497 500 503
and we remove the tags, along with the parent tags in cases where the parent tags would be left empty.
Then, we recompile to a NIB file as we did with sharemouse:
ibtool --errors --warnings --notices --output-format human-readable-text --compile MainMenu.nib MainMenu.xib
And on the next run the Purchase
menu will be gone.
That's it for Transmit 4.3.2. Enjoy!