Table of Contents

Shortnote

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.

Enable Never-Ending Trial

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

Removing the "Purchase" Menu Item

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 NSMenuItems 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! :-)