手把手教你反编译别人的APP

摘要:
此文想以实际例子出发,告诉大家,如何去反编译一个app,并且从某个角度来说,iOS没有传说中的“安全”。脱掉AppStore给“二级制文件”穿上的外衣当然,引言已经说了,道高一尺魔高一丈,就算是被apple加密的ipa,其实也是可以反编译的,只不过相对麻烦罢了。这里就不展示demo了,感觉如果把AppStore上的东西反编译出来发到网上去,我感觉我的程序员生涯可能就要到头了。

虽然iOS系统相比于其他手机操作系统相对安全,但是这个安全并不是绝对的,我一直相信,道高一尺魔高一丈。此文想以实际例子出发,告诉大家,如何去反编译一个app,并且从某个角度来说,iOS没有传说中的“安全”。

这里只最简单的结论给大家,具体原理以及工具的详细使用,请各位自行Google,为什么这么做呢,因为我想用最简单的语言,让没有汇编基础的同学也能明白。

将用以下几个方面来阐述我的观点:

  • iOS app可以“有条件”地被反编译

  • 脱掉App Store给“二级制文件”穿上的外衣

  • 如何利用工具去反编译

  • 在感兴趣的地方生成伪代码

  • 如何预防反编译

iOS app可以“有条件”地被反编译

首先,告诉大家一个不幸的消息,上架至App Store的app,被apple加密了。所以标题才是“有条件”才能进行反编译,令人欣喜的是,在debug下产生的ipa或者是release下的ipa包或者是渠道包(各种应用市场能下的ipa包)都能直接反编译。

脱掉App Store给“二级制文件”穿上的外衣

当然,引言已经说了,道高一尺魔高一丈,就算是被apple加密的ipa,其实也是可以反编译的,只不过相对麻烦罢了。

来来来,给你们几个工具,就可以解掉apple的加密了。

  • clutch

  • dumpdecrypted

  • gdb

  • AppCrackr

由于AppCrackr被很多开发者吐槽,这个傻瓜式的解密会严重导致盗版泛滥,所以这个工具已经很不好用了。

这里就不展示demo了,感觉如果把App Store上的东西反编译出来发到网上去,我感觉我的程序员生涯可能就要到头了。

如何利用工具去反编译

这里会介绍两个工具class-dumpHopper Disassembler

首先,先撸一个最简单的app来做小白鼠。下载地址:https://github.com/kuailejim/demo(包含二进制文件&dump结果)

看图,就是这样,我只改了ViewController这个类。

手把手教你反编译别人的APP第1张

ViewController.h

手把手教你反编译别人的APP第2张

ViewController.m

由代码可以看出,我就写了两个方法testClassDumptestHideClassDump,后者没有声明在.h中(ps:我想试验这样能不能被反编译到)。

ok,前戏都做完了,可以开始干活了。

我们run一下工程,然后打开Products文件夹下的DecompilingTest.app所在目录,显示包内容,拿到二进制文件

手把手教你反编译别人的APP第3张

二进制文件

然后我是复制到桌面,然后执行下述命令,即可拿到工程中的.h文件。

手把手教你反编译别人的APP第4张

执行命令

OK,得到下述结果,我们看看拿到的ViewController.h里面,能拿到什么方法

手把手教你反编译别人的APP第5张

结果

事实证明,没有声明的方法也被dump出来了。

下一步我们要做的就是看看能不能拿到这两个方法的具体实现了,接下来我们用Hopper Disassembler来试试。

Hopper Disassembler的用法很简单,只要将二进制文件拖进去就行了。看看拖进去之后的结果。

手把手教你反编译别人的APP第6张

反编译之后

此时心中一万头草泥马飞奔而过,what's the fk!!一堆汇编语言宝宝看不懂啊。(当然那个ret应该是return的意思我猜)

在感兴趣的地方生成伪代码

Don't worry!点右上角的if(b)f(x);按钮,我们能看到这个方法的伪代码,大部分的时候我们能从伪代码中看出我们需要的信息。

结果如下:

手把手教你反编译别人的APP第7张

伪代码1

手把手教你反编译别人的APP第8张

伪代码2

至此,两个方法都被反编译出来了!

这里需要注意,就算方法没有声明在.h中,也能被dump,之后就能被反编译了。

如何预防反编译

说了这么多,我们预防呢,是不是需要像Java的一样加上各种复杂的混淆呢。

其实我觉得大可不必,本身反编译成本就很大,代码这么多,一个个反编译过来是在蛋疼,就算有伪代码也需要理解,而且有些代码就算有伪代码也很难理解。

只要做好核心代码,做好混淆就行了,比如涉及到密码,核心算法。

总结:

没有绝对安全的系统,也没有黑客破不掉的系统,所有需要的只是时间而已。

免责声明:文章转载自《手把手教你反编译别人的APP》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java实体类如何映射到json数据(驼峰映射到json中的下划线)【原创】大数据基础之Logstash(3)应用之file解析(grok/ruby/kv)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ArcGSIServer服务无法远程连接

/********************************************************/ //将ArcGISServer地图服务用户信息注册到Web APP中 //write by zcg //Beijin //2010年7月17日 /**********************************************...

使用ShareSDK完成Facebook第三方登录和Facebook分享时没办法跳转到Facebook应用

楼主是通过cocoapod接入ShareSDK, 后来发现无论是使用fb分享还是登录, 都是跳出了网页认证(即使我的手机有安装了fb) 后来mob的技术客服小哥告诉我在构造分享参数的时候, 执行参数字典的SSDKEnableUseClientShare方法, 也就是 NSMutableDictionary *shareParams =[NSMutableD...

PHP开发APP接口实现--基本篇

最近一段时间一直在做APP接口,总结一下APP接口开发以来的心得,与大家分享: 1. 客户端/服务器接口请求流程: 安卓/IOS客户端   –> PHP接口 –> 服务器端  –> 数据处理 –> 返回值(客户端接收并处理) APP的通信方式: 客户端 (接口地址:http://app.com/api.php?format=xml/...

uni-app微信相关开发问题记录:微信分享报错"包名不对,请检查包名是否与开放平台填写一致"、Android微信支付只能调起一次的问题、App微信登录与公众号微信登录的unionid不一致

1、微信分享报错“微信:包名不对,请检查包名是否与开放平台填写一致”   具体原因及分析见这篇博客:uniapp微信APP支付踩坑指南:报错errMsg: "requestPayment:fail errors" 2、Android微信支付只能调起一次的问题   Android微信支付只能调起一次,之后就再不成功;有博客说卸载微信重装之后,就能成功,发现...

[App Store Connect帮助]四、添加 App 图标、App 预览和屏幕快照(5)移除 App 预览或屏幕快照

您可以随时移除 App 预览,但仅可在 App 状态为可编辑时才能移除屏幕快照。要了解可编辑的状态,请前往 App 状态。 必要职能:“帐户持有人”职能、“管理”职能、“App 管理”职能或“营销”职能。请参见职能权限。 在首页上,点按“我的 App”,选择您的 App,然后在左列中点按平台版本。 在“App 预览和屏幕快照”部分的底部,点按“媒体管理”...

APP专项测试

一、功能测试 功能测试主要根据软件需求说明书或用户需求等资料,编写测试用例,以验证各个功能点的实现情况,具体实施过程参考如下: 根据被测试模块的功能点,设计相应的测试用例进行覆盖,例如涉及到用户输入的地方要考虑到边界,用户使用场景类要考虑到正常和异常的场景,业务相关联的模块需要联合测试等; 随时关注跟踪需求的变化和理解需求,对需求理解有误时及时更改相关测...