手把手教你反编译别人的iOS APP
otko7121
9年前
<blockquote> <p>虽然iOS系统相比于其他手机操作系统相对安全,但是这个安全并不是绝对的,我一直相信,道高一尺魔高一丈。此文想以实际例子出发,告诉大家,如何去反编译一个app,并且从某个角度来说,iOS没有传说中的“安全”。</p> </blockquote> <p><strong>这里只最简单的结论给大家,具体原理以及工具的详细使用,请各位自行Google,为什么这么做呢,因为我想用最简单的语言,让没有汇编基础的同学也能明白。</strong></p> <p>将用以下几个方面来阐述我的观点:</p> <ul> <li>iOS app可以“有条件”地被反编译</li> <li>脱掉App Store给“二级制文件”穿上的外衣</li> <li>如何利用工具去反编译</li> <li>在感兴趣的地方生成伪代码</li> <li>如何预防反编译</li> </ul> <p>iOS app可以“有条件”地被反编译</p> <p>首先,告诉大家一个不幸的消息,上架至App Store的app,被apple加密了。所以标题才是“有条件”才能进行反编译,令人欣喜的是,在debug下产生的ipa或者是release下的ipa包或者是渠道包(各种应用市场能下的ipa包)都能直接反编译。</p> <p>脱掉App Store给“二级制文件”穿上的外衣</p> <p>当然,引言已经说了,道高一尺魔高一丈,就算是被apple加密的ipa,其实也是可以反编译的,只不过相对麻烦罢了。<br> 来来来,给你们几个工具,就可以解掉apple的加密了。</p> <ul> <li>clutch</li> <li>dumpdecrypted</li> <li>gdb</li> <li>AppCrackr</li> </ul> <p>由于AppCrackr被很多开发者吐槽,这个傻瓜式的解密会严重导致盗版泛滥,所以这个工具已经很不好用了。<br> 这里就不展示demo了,感觉如果把App Store上的东西反编译出来发到网上去,我感觉我的程序员生涯可能就要到头了。</p> <p>如何利用工具去反编译</p> <p>这里会介绍两个工具<strong>class-dump</strong>和<strong>Hopper Disassembler</strong>。<br> 首先,先撸一个最简单的app来做小白鼠。<a href="/misc/goto?guid=4959671684029037876">下载地址(包含二进制文件&dump结果)</a><br> 看图,就是这样,我只改了ViewController这个类。</p> <p><img src="https://simg.open-open.com/show/65e1cf773d56201e593a6532504a375a.png" alt="手把手教你反编译别人的iOS APP" width="2278" height="1512"></p> <p>ViewController.h</p> <p><img src="https://simg.open-open.com/show/4498a6ce8b480df175beafe4a40f309e.png" alt="手把手教你反编译别人的iOS APP" width="2272" height="1508"></p> <p>ViewController.m</p> <p>由代码可以看出,我就写了两个方法<code>testClassDump</code>和<code>testHideClassDump</code>,后者没有声明在.h中(ps:我想试验这样能不能被反编译到)。</p> <p><strong>ok,前戏都做完了,可以开始干活了。</strong></p> <p>我们run一下工程,然后打开Products文件夹下的DecompilingTest.app所在目录,显示包内容,拿到<strong>二进制文件</strong>。</p> <p><img src="https://simg.open-open.com/show/6e8d0460c5ca2d23113a50a66f6cf75c.png" alt="手把手教你反编译别人的iOS APP" width="1540" height="872"></p> <p>二进制文件</p> <p>然后我是复制到桌面,然后执行下述命令,即可拿到工程中的.h文件。</p> <p><img src="https://simg.open-open.com/show/00a55c7b4ea195a8ad2362fc1a453757.png" alt="手把手教你反编译别人的iOS APP" width="1140" height="732"></p> <p>执行命令</p> <p>OK,得到下述结果,我们看看拿到的ViewController.h里面,能拿到什么方法</p> <p><img src="https://simg.open-open.com/show/2a5c290c3e2f1fd1ab3dd0f5e9b3fbf8.png" alt="手把手教你反编译别人的iOS APP" width="1642" height="1132"></p> <p>结果</p> <p><strong>事实证明,没有声明的方法也被dump出来了。</strong></p> <p>下一步我们要做的就是看看能不能拿到这两个方法的具体实现了,接下来我们用<strong>Hopper Disassembler</strong>来试试。</p> <p><strong>Hopper Disassembler</strong>的用法很简单,只要将二进制文件拖进去就行了。看看拖进去之后的结果。</p> <p><img src="https://simg.open-open.com/show/0c3f0f52f6f46b34e85c9c87dd820139.png" alt="手把手教你反编译别人的iOS APP" width="2584" height="1556"></p> <p>反编译之后</p> <p>此时心中一万头草泥马飞奔而过,what's the fk!!一堆汇编语言宝宝看不懂啊。(当然那个ret应该是return的意思我猜)</p> <p>在感兴趣的地方生成伪代码</p> <p>Don't worry!点右上角的<strong>if(b)f(x);</strong>按钮,我们能看到这个方法的伪代码,大部分的时候我们能从伪代码中看出我们需要的信息。</p> <p>结果如下:</p> <p><img src="https://simg.open-open.com/show/d974c9f5b987db1ee70fef92349fa352.png" alt="手把手教你反编译别人的iOS APP" width="2584" height="1556"></p> <p>伪代码1</p> <p><img src="https://simg.open-open.com/show/ba044ab772e8d2e5972764ab13361184.png" alt="手把手教你反编译别人的iOS APP" width="2584" height="1556"></p> <p>伪代码2</p> <p>至此,两个方法都被反编译出来了!!</p> <p><strong>这里需要注意,就算方法没有声明在.h中,也能被dump,之后就能被反编译了。</strong></p> <p>如何预防反编译</p> <p>说了这么多,我们预防呢,是不是需要像Java的一样加上各种复杂的<strong>混淆</strong>呢。</p> <p>其实我觉得大可不必,本身反编译成本就很大,代码这么多,一个个反编译过来是在蛋疼,就算有伪代码也需要理解,而且有些代码就算有伪代码也很难理解。</p> <p><strong>只要做好核心代码,做好混淆就行了,比如涉及到密码,核心算法。</strong></p> <p>总结:</p> <p><strong>没有绝对安全的系统,也没有黑客破不掉的系统,所有需要的只是时间而已。</strong></p> <p>OK,就到这了,明天早起实习去。</p> <p><a href="/misc/goto?guid=4959671684120024094">文/kuailejim(简书作者)</a><br> </p>