<?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:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Developer's Adventures]]></title><description><![CDATA[Thoughts, stories and ideas.]]></description><link>https://alexandergre.ch/</link><image><url>https://alexandergre.ch/favicon.png</url><title>Developer&apos;s Adventures</title><link>https://alexandergre.ch/</link></image><generator>Ghost 5.49</generator><lastBuildDate>Tue, 14 Jul 2026 00:04:37 GMT</lastBuildDate><atom:link href="https://alexandergre.ch/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Reversing uTorrent for Mac with IDA]]></title><description><![CDATA[<p>I&apos;ve tried several torrent clients for MacOSX, and I found that no client can match uTorrent in terms of size, functionality and performance. However, it has one annoying feature: ads.</p><figure class="kg-card kg-image-card"><img src="https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-19.08.15.png" class="kg-image" alt loading="lazy" width="2000" height="984" srcset="https://alexandergre.ch/content/images/size/w600/2023/05/Screen-Shot-2018-07-21-at-19.08.15.png 600w, https://alexandergre.ch/content/images/size/w1000/2023/05/Screen-Shot-2018-07-21-at-19.08.15.png 1000w, https://alexandergre.ch/content/images/size/w1600/2023/05/Screen-Shot-2018-07-21-at-19.08.15.png 1600w, https://alexandergre.ch/content/images/size/w2400/2023/05/Screen-Shot-2018-07-21-at-19.08.15.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>While in Windows version one can get rid of ads by editing hidden setting option, Mac users are</p>]]></description><link>https://alexandergre.ch/reversing-utorrent-for-mac-with-ida/</link><guid isPermaLink="false">646c956f271c5e1e713f0cf9</guid><dc:creator><![CDATA[Alexander Grechishchev]]></dc:creator><pubDate>Tue, 23 May 2023 10:41:31 GMT</pubDate><media:content url="https://alexandergre.ch/content/images/2023/05/ida.png" medium="image"/><content:encoded><![CDATA[<img src="https://alexandergre.ch/content/images/2023/05/ida.png" alt="Reversing uTorrent for Mac with IDA"><p>I&apos;ve tried several torrent clients for MacOSX, and I found that no client can match uTorrent in terms of size, functionality and performance. However, it has one annoying feature: ads.</p><figure class="kg-card kg-image-card"><img src="https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-19.08.15.png" class="kg-image" alt="Reversing uTorrent for Mac with IDA" loading="lazy" width="2000" height="984" srcset="https://alexandergre.ch/content/images/size/w600/2023/05/Screen-Shot-2018-07-21-at-19.08.15.png 600w, https://alexandergre.ch/content/images/size/w1000/2023/05/Screen-Shot-2018-07-21-at-19.08.15.png 1000w, https://alexandergre.ch/content/images/size/w1600/2023/05/Screen-Shot-2018-07-21-at-19.08.15.png 1600w, https://alexandergre.ch/content/images/size/w2400/2023/05/Screen-Shot-2018-07-21-at-19.08.15.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>While in Windows version one can get rid of ads by editing hidden setting option, Mac users are limited to using firewall to block ads from loading. This, however, still leaves an empty &quot;Advertisement&quot; box, as well as &quot;Upgrade Now&quot; button.</p><p>Luckily, thanks to an amazing reverse-engineering toolkit IDA, we can take a look under the hood of uTorrent and see if there is a better way of removing ads. Let&apos;s do some reverse-engineering!</p><figure class="kg-card kg-image-card"><img src="https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-19.31.34.png" class="kg-image" alt="Reversing uTorrent for Mac with IDA" loading="lazy" width="1422" height="1000" srcset="https://alexandergre.ch/content/images/size/w600/2023/05/Screen-Shot-2018-07-21-at-19.31.34.png 600w, https://alexandergre.ch/content/images/size/w1000/2023/05/Screen-Shot-2018-07-21-at-19.31.34.png 1000w, https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-19.31.34.png 1422w" sizes="(min-width: 720px) 720px"></figure><p>After the analysis process has finished, we can start exploring disassembled binary. Let&apos;s go to Search - Text menu and search for &quot;upgrade&quot;. Wow, the search results look intriguing:</p><figure class="kg-card kg-image-card"><img src="https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-19.39.38.png" class="kg-image" alt="Reversing uTorrent for Mac with IDA" loading="lazy" width="1940" height="382" srcset="https://alexandergre.ch/content/images/size/w600/2023/05/Screen-Shot-2018-07-21-at-19.39.38.png 600w, https://alexandergre.ch/content/images/size/w1000/2023/05/Screen-Shot-2018-07-21-at-19.39.38.png 1000w, https://alexandergre.ch/content/images/size/w1600/2023/05/Screen-Shot-2018-07-21-at-19.39.38.png 1600w, https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-19.39.38.png 1940w" sizes="(min-width: 720px) 720px"></figure><p>removeAds function in MainWindowController, this is what we need! Let&apos;s take a look at the graph of this function.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-21.02.31.png" class="kg-image" alt="Reversing uTorrent for Mac with IDA" loading="lazy" width="2000" height="496" srcset="https://alexandergre.ch/content/images/size/w600/2023/05/Screen-Shot-2018-07-21-at-21.02.31.png 600w, https://alexandergre.ch/content/images/size/w1000/2023/05/Screen-Shot-2018-07-21-at-21.02.31.png 1000w, https://alexandergre.ch/content/images/size/w1600/2023/05/Screen-Shot-2018-07-21-at-21.02.31.png 1600w, https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-21.02.31.png 2154w" sizes="(min-width: 1200px) 1200px"></figure><p>Looking at the names of variables, we can guess that the block on the right enables ads, and the block on the left disables ads and removes &quot;Upgrade Now&quot; button. Great! Now let&apos;s find where the latter block is called from.</p><figure class="kg-card kg-image-card"><img src="https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-21.07.31.png" class="kg-image" alt="Reversing uTorrent for Mac with IDA" loading="lazy" width="1752" height="540" srcset="https://alexandergre.ch/content/images/size/w600/2023/05/Screen-Shot-2018-07-21-at-21.07.31.png 600w, https://alexandergre.ch/content/images/size/w1000/2023/05/Screen-Shot-2018-07-21-at-21.07.31.png 1000w, https://alexandergre.ch/content/images/size/w1600/2023/05/Screen-Shot-2018-07-21-at-21.07.31.png 1600w, https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-21.07.31.png 1752w" sizes="(min-width: 720px) 720px"></figure><p>Aha! Looks like if we replace the conditional jump instruction at address 0001B42F with two NOP (No Operand) instructions (they are half the size of conditional jump), it will get the job done. After highlighting the address, go to Edit - Patch program - Assemble and enter NOP twice. You will notice that the graph changed:</p><figure class="kg-card kg-image-card"><img src="https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-21.23.40.png" class="kg-image" alt="Reversing uTorrent for Mac with IDA" loading="lazy" width="1246" height="530" srcset="https://alexandergre.ch/content/images/size/w600/2023/05/Screen-Shot-2018-07-21-at-21.23.40.png 600w, https://alexandergre.ch/content/images/size/w1000/2023/05/Screen-Shot-2018-07-21-at-21.23.40.png 1000w, https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-21.23.40.png 1246w" sizes="(min-width: 720px) 720px"></figure><p>Now the block which disables the ads will be executed no matter what. The only thing left to do now is to save the changes by going to Edit - Patch program - Apply patches to input file and click OK.</p><figure class="kg-card kg-image-card"><img src="https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-21.25.33.png" class="kg-image" alt="Reversing uTorrent for Mac with IDA" loading="lazy" width="1306" height="694" srcset="https://alexandergre.ch/content/images/size/w600/2023/05/Screen-Shot-2018-07-21-at-21.25.33.png 600w, https://alexandergre.ch/content/images/size/w1000/2023/05/Screen-Shot-2018-07-21-at-21.25.33.png 1000w, https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-21.25.33.png 1306w" sizes="(min-width: 720px) 720px"></figure><p>We replaced two bytes:</p><!--kg-card-begin: markdown--><blockquote>
<p>File offset 0001A42F: replaced 74 with 90<br>
File offset 0001A430: replaced 2B with 90</p>
</blockquote>
<!--kg-card-end: markdown--><p>Now, lets find out if it actually works and run the app...</p><figure class="kg-card kg-image-card"><img src="https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-21.29.04.png" class="kg-image" alt="Reversing uTorrent for Mac with IDA" loading="lazy" width="2000" height="984" srcset="https://alexandergre.ch/content/images/size/w600/2023/05/Screen-Shot-2018-07-21-at-21.29.04.png 600w, https://alexandergre.ch/content/images/size/w1000/2023/05/Screen-Shot-2018-07-21-at-21.29.04.png 1000w, https://alexandergre.ch/content/images/size/w1600/2023/05/Screen-Shot-2018-07-21-at-21.29.04.png 1600w, https://alexandergre.ch/content/images/size/w2400/2023/05/Screen-Shot-2018-07-21-at-21.29.04.png 2400w" sizes="(min-width: 720px) 720px"></figure><p>Viola!</p><hr><p><em>Originally, there was a link to download the patched uTorrent here. However, this app no longer runs on modern Macs :(</em></p>]]></content:encoded></item><item><title><![CDATA[Hello, world!]]></title><description><![CDATA[<p>Well done, Ghost dev team! This is exactly what I&apos;ve been looking for: swift, clean and non-bloated blog engine. Little gems like this come as a bonus:</p><figure class="kg-card kg-image-card"><img src="https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-14.02.45-3.png" class="kg-image" alt loading="lazy" width="1178" height="728" srcset="https://alexandergre.ch/content/images/size/w600/2023/05/Screen-Shot-2018-07-21-at-14.02.45-3.png 600w, https://alexandergre.ch/content/images/size/w1000/2023/05/Screen-Shot-2018-07-21-at-14.02.45-3.png 1000w, https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-14.02.45-3.png 1178w" sizes="(min-width: 720px) 720px"></figure>]]></description><link>https://alexandergre.ch/hello-world/</link><guid isPermaLink="false">646c94e6271c5e1e713f0cee</guid><dc:creator><![CDATA[Alexander Grechishchev]]></dc:creator><pubDate>Tue, 23 May 2023 10:28:31 GMT</pubDate><content:encoded><![CDATA[<p>Well done, Ghost dev team! This is exactly what I&apos;ve been looking for: swift, clean and non-bloated blog engine. Little gems like this come as a bonus:</p><figure class="kg-card kg-image-card"><img src="https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-14.02.45-3.png" class="kg-image" alt loading="lazy" width="1178" height="728" srcset="https://alexandergre.ch/content/images/size/w600/2023/05/Screen-Shot-2018-07-21-at-14.02.45-3.png 600w, https://alexandergre.ch/content/images/size/w1000/2023/05/Screen-Shot-2018-07-21-at-14.02.45-3.png 1000w, https://alexandergre.ch/content/images/2023/05/Screen-Shot-2018-07-21-at-14.02.45-3.png 1178w" sizes="(min-width: 720px) 720px"></figure>]]></content:encoded></item></channel></rss>