一种常规Android脱壳技术的拓展(附工具)

AracelyGuyt 9年前
   <p style="text-align:center"><img src="https://simg.open-open.com/show/0144de251b6143f5c864d888063403eb.jpg"></p>    <p>最近在做移动安全测试的项目时,遇到了最新的某数字壳,好久都没脱壳了,记得上次脱壳还是zjdroid通杀的时候。秉着安全研究的精神,趁此机会,又把最新的加固与脱壳技术过了一遍,然而并没有成功脱掉。</p>    <p>郁闷之际,我索性沉下心来,好好看看当前脱壳技术的原理,就这样我在Github上看了几个脱壳工具的代码。其中一个我感觉很有趣, 正是 <strong>strazzere</strong> 大神的 <strong>android-unpacker</strong> ,这是一款ndk写的动态Android脱壳的工具,原理简单来说就是ptrace,然后在内存中匹配特征码和odex的magic,最后dump到文件。我当然自己编译测试了,但发现是对于最新的壳,貌似还是不管用,总是dump下来一个空文件。</p>    <p>后来我在分析代码,自己边看边改边测试。慢慢结构和代码基本上面目全非了,顺便改了个代码错误( 这个错误就是之前dump结果为空的真凶 -_- ),到最后按照 <strong>strazzere</strong> 大神的基本思路 索性自己重新写了一个工具(复用了大神的部分代码)。</p>    <h3><strong>下面说下几个最重要的和大神方法不一样的地方:</strong></h3>    <p>1. android-unpacker 基本上就是匹配odex magic的函数时(下图), 而我不管odex了,专心匹配dex的magic。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/04b1d9f7ffb11e8a1b480030b3e67b0b.jpg"></p>    <p>2. android-unpacker 用pread(下图),而我换了read和lseek,具体就不说为啥了,这是非常重要的一点。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/15ddf1698f98adc1307932b9e3616507.jpg"></p>    <p>3. 我直接抛弃了 android-unpacker中的壳的特征匹配这一整块儿内容。</p>    <p>4. android-unpacker只匹配和dump一次,而 我引入了双循环机制,这点对我的脱壳成功也非常重要。</p>    <p>5. android-unpacker在 peek_memory(下图)中进行magic匹配,我改了逻辑,换了一种匹配方式。</p>    <p><img src="https://simg.open-open.com/show/c96397532f3c653c2a90b55a970397f4.jpg"></p>    <p>6.另外我还增加了一匹配种方法,来增强匹配的成功率。</p>    <p>7.引入了wait_times机制(很无奈)</p>    <p>7.其他..</p>    <h3>我找了三家公司的壳试了下,下面直接上效果图顺便说说工具怎么用:</h3>    <p>1.这个工具就是ndk程序,所以要在Root后的Android环境下运行(虚拟机和实体机都可以)</p>    <p>2.一般来说,先让工具跑起来等着,第一个参数是包名,第二个参数是等待时间。</p>    <p>3.等待时间有两重含义,第一是当工具发现APP进程后,等待多久才开始第一次Scan;第二是每次Scan的时间间隔。(因为每种壳机制都不太一样,所以dex在内存中出现和留存的时间也不同,所以这个wait_time可以灵活配置,具体大家自己琢磨吧。)</p>    <p>4.实际dump成功的例子(我就不把壳厂商和APP名字写出来了,大家应该都能看出来):</p>    <p>(1)某些壳需要把参数wait_times设置1~3秒,然后打开APP,不然APP会退。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f0d6c835d79518dc8940b2507508b130.jpg"></p>    <p>(2)等待时机支持小数秒,呵呵。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/2d022a49358955573a6e0271869bfac2.jpg"></p>    <p>(3)这个dump下来的是缺失的dex,接着向下看。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/af7398f0db8f5cdcaf7f7c626b6d4625.jpg"></p>    <p>(4)还是上个APP,这次成功了,没关系,多试几次就好了,呵呵。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/44e98a93bb8c382bdb27157cfd32cddd.jpg"></p>    <p>(5)不写wait_times的话也可以,默认0秒。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/16d7f8644f44a781e32d8e9121bd1f3c.jpg"></p>    <p>(6)某数字公司的壳,dex内存里一直有,所以先启动APP,然后再开工具也是可以的。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1b82d535e81ba241a3cd5ac3118420bf.jpg"></p>    <p>(7)再来一个</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/28ca25d40a7bbd06fc89aed6eb0e6b20.jpg"></p>    <p>就不贴dex2jar的图了。</p>    <h2>说明</h2>    <p>1.工具仅用于安全研究及安全测试,如用于非法用途,后果自负。</p>    <p>2.除了arm版,我还编译了个x86的,方便使用虚拟机的童鞋。</p>    <p>3.本来是准备要再研究更多厂商的,但是这段时间实在是忙,想了想还是先发出来吧。</p>    <p>4.这工具并不是万能的,甚至可以说是不健全的。我仅测试了三家的壳,有两家都可以稳脱,还有一家一部分可以,一部分不行。欢迎大家测试其他的壳,你们脱不了可不要怨我。</p>    <p>5.别跟我要代码了,我的代码太丑陋,直接参考 android-unpacker的思路就可以。</p>    <h2>下载地址</h2>    <p>链接: <a href="/misc/goto?guid=4959673642471586046" rel="nofollow,noindex">http://pan.baidu.com/s/1hr49HBI</a> 密码: 6bgv</p>    <h3> </h3>    <p>来自: <a href="/misc/goto?guid=4959673642556559726" rel="nofollow">http://www.freebuf.com/sectool/105147.html</a></p>    <p> </p>