ios如何给代码加密才会不被unihopper库博怎么样反编译

个人的实际操作与学习
关于iOS开发中反编译的那些事儿
现在仅讨论代码层面的反编译
1、反编译工具
(1)class-dump
主要用来反编译一个库文件或者app的方法名、属性等声明(即.h文件,强大的是反编译出来的.h不仅仅包含头文件中的声明,.m中的function方法名称也同样能够反编译出来)。class-dump的安装在前文中有详细描述,这里不再赘述。
主要用来反编译库文件的实现(当然方法声明同样能够反编译出来,用class-dump主要是更加形象,有针对性),这个反编译工具非常强大能够将函数的实现及逻辑关系、流程统统显示出来,弊端就是反编译出来的内容为汇编语言,需要一定汇编基础的才能看懂。比较头疼。
(3)Hopper Disassembler
与IDA功能相似,主要功能都是反编译查看方法的实现,这个软件的功能相对于IDA来说,可读性要强很多,反编译出来的内容类似于汇编与OC的运行时的结合体,相对比较容易看出方法的具体实现。
笔者个人比较喜欢用1和3来完成反编译过程。
各个软件的下载地址:
(1)class-dump
(3)Hopper
Mac的反编译工具一:otool (objdump工具的OSX对应工具)。
app可以被反编译到什么程度?
教你如何反编译app,拿到加密方式
手把手教你反编译别人的app
iOS 破壳 反编译 黑客技术大揭秘
IOS class-dump反编译实践
IOS安全、逆向、反编译
没有更多推荐了,写给 iOS 开发者的 Hopper + lldb 简介
最近,关于
在发布的帖子,笔者看到很多人在问「你是怎么理解那个伪代码的」。笔者想写博客已经有一段时间了,现在正好就此发表第一篇博文。笔者在一个叫 Hopper 的工具上花了很多时间(这是笔者的必备工具之一),虽然它很神奇,但是刚接触的时候可能会让人感觉不知所措。本篇博文的目的是帮助那些回避或不熟悉逆向工程的人填补知识空白。
你是否曾经疑惑,别人是怎么获取下图所示的私有 API伪代码的?这实际上很简单,而且是找出 UIkit中那些烦人错误的好方法。使用 Hopper 这样的工具后,只需要点几下鼠标,就能得到伪代码。更酷的还在后头。有了 Obj-C runtime 和 lldb,即使不能提高伪代码的语法正确性,也一定能提高伪代码的可读性!让我们深入探讨一下吧!
Decompilation of a method in UIKit.
在 UIKit 中反编译一个方法。
什么是 Hopper?
摘自 Hopper 主页的定义:“Hopper 是一种适用于 OS X 和 Linux 的逆向工程工具,可以用于反汇编、反编译和调试 32位/64位英特尔处理器的 Mac、Linux、Windows 和 iOS 可执行程序!”用更简洁的话来说,这代表我们可以用一个编译二进制(你的 iOS app,UIKit 二进制等等)生成你之前看到的伪代码!
反汇编 vs 反编译
反汇编和反编译有什么区别?很简单,反汇编(通过反汇编程序来实现)是指将 opcode (二进制原始字节)转化成对应的汇编指令(也叫 )的过程。下图展示了一个被反汇编的文件。反编译(通过反编译程序来实现)是指将该汇编指令转化成伪代码的过程。下图分别为同一个文件的反汇编结果与反编译结果。
在本文发表时,的售价只有90美元,这简直就是白送。对那些了解这个工具的威力的人来说,这个工具完全可以卖到几百美元。因此,如果你觉得这个价格贵,再好好考虑一下吧!他们也提供功能受限的免费试用版本,不过用来了解本文内容应该够用了。
在下载并安装 Hopper 之后,打开并按顺序点击 “File -& Read Executable to Disassemble…”
点击 Read Exectuble to Disassemble 来开始反汇编。
在这里,你需要点击用于试验的二进制文件并点击“Open”。在本文中,我们用的是以下路径的 UIKit 二进制文件:
你可能需要更新一些目录名称,不过以上路径已经提示了大致的方向。这是模拟器使用的 x86 二进制文件,也是本文要关注的文件。ARM 二进制文件储存在设备上,并且在运行时加载。点击打开之后,你将会看到下图所示画面。UIKit 是个很肥的二进制文件,也就是说它包含了多个二进制文件。在示范的 UIKit 中,包含 x86 32位和64位。我们将要反汇编32位的文件。确保选中该文件并点击“Next”。
注意 x86(32位) 和 x86(64位)两种文件的存在。
在接下来的页面中点击“OK”,你就会来到 Hopper 的主界面。Hopper 会开始分析 Mach-O 二进制文件,在这个过程中,你会看到界面右下角的“Working…”状态提示。因为 UIKit 是个大文件,可能需要一段时间才能完成分析。如果是小文件,分析很快就能完成。现在,如果你觉得这个界面太费解,不要担心,我们只需要关注整个界面中的三个按钮。
首先是左侧操作面板中的“Labels”和“Strings”。“Labels”会向你展示二进制文件中包含的所有类和方法(你还会看到其他文件,不过本教程中只需要关注方法签名)。
下拉查看所有的方法!
现在点击左侧操作面板中的“String”,你会看到 app 中所有的字符串。这就是为什么你绝对不能对 app 中的重要字符串进行硬编码。
检查你自己的 app,确保没有对任何你不想让别人看到的东西硬编码!
回到“Labels”界面,注意搜索框。在这里你可以搜索任何类和方法的名称。输入“UIPopoverPresentationController dimmingView”,查看搜索结果。点击“-[UIPopoverPresentationController dimmingViewWasTapped:]”签名,注意主界面就会跳转到“-[UIPopoverPresentationController dimmingViewWasTapped:]”的反汇编界面。
搜索方法名称和类。
如果你不了解汇编指令,这个界面就没有太大帮助,请查看界面右上角,注意那个带有代码的按钮。这个按钮可以开启反编译过程,并产生伪代码。点下去吧!
![此处输入图片的描述][1]
没那么难用,对吧??
在调试第三方 SDK 或者查看自己的 app 时,这个工具效果非常好。
一般笔者在查找程序错误时会采用以下步骤:
在代码中找出自认为导致问题的那个文件,然后打开 Hopper
搜索那个类和方法名称,然后进行反编译
通过反编译,我可以很容易就能收集方法签名,并在 lldb 中设置它们的断点(参见 lldb 部分)。
以上就是全部操作,完全没有一点删减。如果你不想再看,可以到此为止,不过笔者在工作流程中添加了 lldb 操作来对伪代码进行更进一步的清理!
首先,下载
最近发布在
中的示范代码。打开项目之后,笔者一般喜欢把调试构架设成“$(ARCHS_STANDARD_32_BIT) ”,因为这样会让编译过程更加友好(前提是已经从给定的二进制文件中反编译了32位文件)。
在私有方法中设置断点
好了,一般来说,Hopper 产生的伪代码就已经能满足你的需求了,不过有时候它会比较难懂,需要进行一些清理工作。这就到了 Obj-C runtime 和 lldb 大显身手的时候了。
首先,在模拟器中打开示范代码,通过调试暂停程序执行。暂停后,代码会转存到 lldb中,在这里,你可以给选定的任何方法签名设置断点。输入“b -[UIPopoverPresentationController dimmingViewWasTapped:]”,给“-[UIPopoverPresentationController dimmingViewWasTapped:]”设置断点,然后按回车键。调试控制台界面与下图类似:
b 是设置断点的简称。
现在继续程序执行,一旦启动“-[UIPopoverPresentationController dimmingViewWasTapped:]”,就会启动你所设置的断点。遵循示例项目中的操作指令(双击黄色区域)。
如果进展顺利,你就会看到断点启动,然后看到方法签名与对应的汇编指令。为了好玩,你可以比较一下 Xcode 的反编汇结果和 Hopper 产生的结果。它们应该基本一致。如果存在不同,可能是因为它们使用的汇编语法不同,。如果你遇到其他情况,请看文末的“其他”部分。
就是感觉挺累的,这段时间,总之,想请假,觉得坐在这里,也没很大的意义。
到了这一步,你可能会因为不了解汇编而有些担心,但是笔者要告诉你,你真的不需要懂。只要有一点儿直觉,加上反复尝试,你就可以完成任务了。换句话说,我们现在所要做的就是让反编译过程稍微简单一些(替换寄存器等等)。这样产生的伪代码会好懂一些,不过如果你遇到伪代码难懂的情况,可以采用同样的理念对伪代码进行清理。
好了,现在该左右对照反汇编和反编译了。笔者常用的做法是寻找反编译的关键点,比如说调用 if 语句或者方法的时候。这些关键点对应的编译指令很容易猜到,只需要逐行浏览编译。如果你的关键点是一个 if 语句,就去找测试或 cmp(compare)指令。
在本文中,笔者选的是反编译中的第一个 if 语句,并在 Xcode 的反编译结果中搜寻测试或 cmp(compare)指令。如下图所示,笔者找到了一个测试指令。
可能需要尝试几次,要有耐心!
现在在那个内存地址(你的地址可能不同)用“b 0x148b95c”设置一个断点。
继续程序执行,期待你的断点被启动。
下一步就会见证 lldb 和 Obj-C runtime 的神奇之处。我们要清理反编译结果中大部分艰涩难懂的部分。如果你不熟悉反编译过程中的 eax、edi、和 esiare,它们就是 x86 CPU 寄存器,我们可以把它们转存到 lldb 中。如果你看到 r0、r1、r16等等,那些是 ARM 框架。如果这些你全都看不懂,别担心,只要把它们和伪代码匹配就好了。
在 lldb 提示框中输入“register read”,按回车键。
CPU 寄存器。根据你所用的不同框架,显示不同名字。
显示出来的是 CPU 寄存器及其内容值。现在你可以用 lldb 中显示的值替代反编译结果中的寄存器。
不要盲目地更换反编译的 esi、edi 和其他寄存器,因为在执行不同代码时,它们可能代表不同的值。这就回到了明智选择关键点的重要性。笔者的操作步骤如下:
在一个关键点设置断点,继续程序执行
转储寄存器
用 lldb 生成的内容值替换反编译结果中关键点以上的缓存器
举个例子,我们的关键点是 dimmingViewWasTapped 方法中的第一个 if 语句,一旦断点被启动,转储寄存器,替换伪代码中 if 语句以上的缓存器。如果你跟踪伪代码,发现关键点之后的缓存器未重置,那就更新这些内容值。
如果你进行这个操作,就会发现 edi 包含委托选择器,但是 esi 寄存器包含一个 hex 值。这就更加费解了,不过幸好我们可以利用 Obj-C runtime来搞清楚 esi 到底是什么。
复制 esi 的内存地址,输入“po [0x78657dd0 class]”,然后按回车键。
Very nice!
啦啦啦,现在我们知道 esi 是什么了,并且可以利用这个值来提升反编译效果。
笔者发现反编译说“esi = self”,你们可能已经推断出esi = UIPopoverPresentationController,但是这个推断不一定总是成立。而且,如果还不明显,你可以尝试“po [0x78657dd0 anyMethodThatThisClassImplements]”。如果你对某个对象的内部很感兴趣,这个操作效果超好。
到了这一步,再说下去就会变成选个新要点的重复说教了,所以笔者打算见好就收了!如有任何问题或反馈,请在推特上联系笔者 。
有 Hopper 的替代工具吗?
- 有的,就是 IDA Pro(HexRays 是他们的反编译器),不过除非你想一掷千金,不然 Hopper 就是你最好的选择。他们还提供免费版本,不过只有反汇编器。
我的反编译和反汇编结果的缓存器显示的是 r,不是 e
- 你反编译或者反汇编了 x86 64位文件。
OneAPM 以真实用户体验为度量标准进行 ,监控网络请求及网络错误,提升用户留存。访问 感受更多应用性能优化体验,想阅读更多技术文章,请访问 OneAPM 。
iOS逆向工程之Hopper+LLDB调试第三方App
Hopper + LLDB
iOS didReceiveMemoryWarning 内存警告 调试详解
LLDB远程动态调试三方app
最简单的Hopper Disassembler玩转Mac逆向
iOS开发 --
分析CrashLog (1)
symbolicatecrash+Organizer
在非越狱设备上使用 LLDB 调试第三方 App
没有更多推荐了,I want to be a full stack developer
iOS 破壳 反编译 黑客技术大揭秘
分享内容简介:
在黑客的世界里,没有坚不可破的防护系统,也没有无往不胜、所向披靡的入侵利器,有时候看似简单的问题,破解起来也许花上好几天、好几个月,有时候看似很 low 的工具往往能解决大问题;我们以实现微信自动抢红包为引子,逐步展开 iOS 黑客入侵常用的几种武器,并简单的讲解一些常用的反入侵策略,以及如何破解反入侵策略,虽然抢红包的破解代码网上有很多,但是我们要讲的是这些代码是用什么工具分析出的,为什么要这样写?
内容大体框架:
让目标程序破茧而出 -- dumpdecrypted运行时分析 -- cycript追踪神器 -- logify反汇编工具 -- hopper断点调试工具 -- lldb+debugserver注入工具 -- insert_dylib + install_name_tool
分享人介绍:何兆林 通讯充值与彩票业务部 iOS开发工程师。
负责过的产品: QQ彩票、QQ电影票 iOS客户端,目前主要负责 QQ彩票 iOS客户端的开发。
下面是本期分享内容整理
大家晚上好,我是来自 CDG的 jolinhe,目前在做qq彩票项目,负责 iOS侧的插件化和整体架构。
越狱和入侵是我的业余爱好,正好08和09年的时候,在网龙积累了一些越狱开发经验,所以今天跟大家分享一下 iOS入侵方面的工具和手段。
为了避免纸上谈兵:
第一部分我们就拿微信来开刀,讲解一下如何运用这些工具来找到和实现自动抢红包功能的;第二部分我们再总结一下常用的入侵原理和反入侵方法。
开始之前,我们需要把环境搞起,硬件方面,需要:
一台越狱手机一台装了开发环境的 Mac电脑
软件方面内容提纲已经列出来了,需要注意的是它们有一些是手机端的,一些是 PC端的 ,用到的时候我会细讲。
群里不乏老司机,这里我假设大家对于 ssh、theos、class_dump、hook这些工具和技术都已经有所涉猎了,如果有不清楚的,欢迎私下交流。
一、微信实现自动抢红包功能
言归正传,要实现自动化抢红包,首先我们需要理清思路:
第一步:需要拦截微信的消息流,在哪里拦截?第二步:在这些信息流中分辨出哪些消息是红包?第三步:在合适的地方插入自己的“抢”红包代码。
1、让目标程序破茧而出——dumpdecrypted
因为直接从 AppStore下载下来的二进制文件都是加了壳的,所以为了让它的内核破茧而出,我们需要砸壳操作。
所以第一个工具就是 dumpdecrypted ,这个工具是手机端 的,可以通过 cydia安装,安装后文件路径是:
/usr/lib/dumpdecrypted.dylib
在实际使用时,可以通过 pp助手把这个文件 copy到目标程序的 documents目录,然后ssh进手机终端,cd到 documents目录,执行:
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib WeChatPath
执行完后会再 documents目录生成一个砸完壳后的二进制文件
2、运行时分析——cycript
砸完壳之后,我们再 dump出头文件,但是微信的类太多了,头文件有几百个,如此多的头文件,让人眼花缭乱,所以要找到突破口,我们得缩小范围,我喜欢用的思路是从 ui入手,先找到微信对话界面的 controller,然后再追踪 controller中对应的消息处理函数。
这样第二个工具 cycript 隆重出场了 ,它也是个手机端 的工具,用于查看 app运行时数据,大伙儿可以通过 cydia安装,安装完之后,ssh到越狱手机的终端。
先找到微信的进程id:ps aux | grep WeChat
再执行:cycript -p 微信的pid
完成了注入,进入到 cycript提供的终端。
这时候进入在手机上进入微信的聊天窗口,例如:
然后在 cycript的终端输入:
UIApp.keyWindow.recursiveDescription().toString()
结果如下:
打印的是当前的ui树,随便找一个节点(树的中间,为什么要在中间,大家可以思考下 ),copy它的内存地址,例如0x14da3f000
执行:[#0x14da3f000 nextResponder]
会输出当前节点的下一级事件响应链,然后对输出节点再次调用 nextResponder ,直到找到它的视图控制器xxxcontroller :
看到了吧,微信的聊天页对应的类名是 BaseMsgContentViewController 。
3、追踪神器 -- logify
目前为止我们已经锁定了大致的突破口,下面还需继续追踪,找到这个类里面的消息处理函数,这里的思路就是通过向群里发送一个消息,然后观察 controller中哪些方法被调用了。
第三个工具 Logify就是干这个事情的 ,它是 theos的一个组件,和 theos一起安装在 pc端的,在 pc的终端输入:
logify.pl /path/to/BaseMsgContentViewController.h & /out/path/to/Tweak.xm
打开生成的 tweak.xm文件,可以看到它其实就是 hook了这个类所有的方法,在方法中注入了 nslog,打印方法的入参和返回值,最后把这个文件用 theos打包并安装到手机中,再次向群里发消息,手机连上 xcode观察手机控制台输出。
输出内容很多,需要仔细过滤一下,例如我们发的消息是一个文本“test”,在控制台搜索它,你会在它附近找到下面这个函数调用:
addMessageNode:layout:addMoreMsg
从函数名字来看,这个应该就是用来处理消息数据的,从表面来看我们已经找到消息的拦截点了,但是大家想一下,如果我们hook这个方法,在里面自动抢红包,会有什么致命的缺陷?
老司机们已经看出来了吧,这个方法是 BaseMsgContentViewController类里面的,而这个类进入聊天页面才会被创建。
hook这里会有两个缺陷:
第一,必须进特定的群的聊天页面才能生效;第二,两个群同时有红包来,没法并发的抢。
为了追求更加上流的功能,我们需要再向上追溯消息的源头,最好 hook那种微信启动后就存在的对象,怎么追溯呢?
我的思路是通过在这个方法中设置断点,通过调用栈,来找到上层的调用者。
4、反汇编工具——hopper & 断点调试工具——lldb + debugserver
第五个工具 lldb + debugserver 顾名思义,debugserver是手机端的(只要你的手机有连过 xcode进行 debug,这个玩意就自动有了),用于监听 pc端 lldb的连接,来实现远程调试。
这个工具要和第四个 hooper(反汇编工具) 结合起来用。
首先 ssh进手机的终端,输入:
debugserver *:19999 -a WeChat
监听 lldb的连接
然后打开pc的终端,启动 lldb并连接:
process connect connect://deviceIP:19999
如果连接成功,我们就正式进入 debug状态了。
那么问题来了,要精确的设置断点,必须知道这个函数的内存地址,这个内存地址怎么搞出来呢?
有个公式:
内存地址=进程内存基地址+函数在二进制中的偏移量
上面我们已经连上了 lldb调试环境,获取基地址在 lldb中输入下面的命令:
image list -o -f
这时会输出很多行数据,找到文件名为 WeChat的模块地址,这里第一行就是了:
偏移量需要借助 hooper,pc端的反汇编利器,用 hooper打开微信的二进制文件,等几分钟,反汇编完成后,在搜索框输入刚找到的函数名: addMessageNode,定位到相应的汇编代码,第一列就是偏移量了:
两个参数都找到后,在lldb中输入:
br s -a ‘基地址+偏移量’
然后用 “br l ” 确认一下断点是否设置成功
进入聊天界面,再次向群发送一个消息,会发现 ui卡住了,观察 lldb控制台,会提示进程被断住了,在 lldb中继续输入 bt指令,重点观察模块名是 WeChat的栈,但是由于没有符号表,我们只能看到栈的内存地址:
想要把内存地址还原成函数名,需要两步:
第一要把内存地址转换成二进制文件偏移量第二步再使用 hooper根据偏移量找到函数名
也就是上面公式的逆向过程:
函数在二进制中的偏移量=内存地址 - 进程内存基地址
这里我们栈地址是0xad02f4 ,基地址是0xe8000 ,做下减法,得到结果0x ,然后在 hooper中搜索这个地址就能得到方法名:
以此类推,最后得到栈顶的调用是这个:
[CMessageMgr MainThreadNotifyToExt:]
CMessageMgr这个类,从名字来看,就是消息管理器,而且是单例的,我们终于找到了真正需要 hook的类,但是这个方法是用来异步发送通知的,不像是消息的源头,所以我们用上面说的 logify组件继续追踪一下这个类
过程不再重复讲,最后的目标终于浮出水面:
(void)AsyncOnAddMsg:(id)message MsgWrap:(CMessageWrap* )msgWrap
第一步消息的拦截点终于找到了,接下来是第二步:
**第二步:**我们需要知道哪些消息是红包,这个就比较简单,向群里发一个普通消息和红包消息,通过 logify组件观察 message参数的内容,发现它里面有一个 type字段,如果是红包,值是49,其他语音和文本各不相同,所以,这里轻松搞定。
第三步:需要实现抢红包代码,这一步稍微复杂一点,先讲一下思路,首先进入微信开红包的界面:
根上面讲过的一样,通过 cycript+logify 我们可以轻松拿到开红包的入口函数,下一步,我们需要自己从AsyncOnAddMsg 的参数中构造抢红包函数的入参。
找注入点我就不再重复讲,直接上结果:
[WCRedEnvelopesReceiveHomeView OnOpenRedEnvelopes]
这显然是一个事件处理函数,它里面肯定会调用真正的拆红包逻辑
所以我们打开 hooper,找到这个方法然后观察方法体,发现它在最后调用了一个 selector:
WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes
这应该是真正的拆红包逻辑,但是这个 selector没有参数,所以我猜想这个方法的作用应该是自己封装拆红包所需的数据,并调用底层服务来拆红包。
在hooper中搜索这个方法,观察一下,果然是这样的:
函数开始部分的汇编代码都是在构造dictionary,只有在最后调用了一个可以函数:
这里说明一下,由于微信这一块的代码全都是 oc的,而 hooper可以直接将 oc反汇编到接近源码的水平,所以,还原过程基本不需要掌握多少汇编知识,具体的还原过程可以看下我之前发的文章:
最后一步,编写 tweak,替换 AsyncOnAddMsg函数并把自己的成果注入进去就 ok了。
5、注入工具——insert_dylib + install_name_tool
对于越狱机器来说,到这里已经大功告成了,但是想要在非越狱机器上跑,还需要几个步骤:
在非越狱机上面,一切都要靠自己,首先手动把你的库注入到目标二进制中,这一步使用 insert_dylib 就可以了,它运行在pc端 ,在命令行 cd到微信的二进制目录,执行命令:
insert_dylib [@executable_path](/user/name/executable_path)/xxx.dylib WeChat
因为我们的 hook代码是基于 cydiaSubstrate的,用l -L xxx.dylib来检查一下你的
tweak,这个依赖库在正版机上是没有的,我们需要把它从越狱机充 cp出来和你的 tweak一起拖进目标 app目录,并通过install_name_tool 命令修改你的 tweak中对他的引用路径。
最后,用 codesign命令对微信 bundle里面所有的 dylib进行签名:
codesign -f -s "iPhone Developer:xxx" xxx.dylib
打包成ipa:
xcrun -sdk iphoneos PackageApplication -v WeChat.app -o ~/WeChat.ipa
再使用 iResign对 ipa进行签名,就可以安装到非越狱的机器上了。
注意一下,如果你不想使用 iResign,在执行 xcrun之前,还需要对微信的二进制文件进行签名:
codesign -f -s "iPhone Developer:xxx” —entitlements Entitlements.plist WeChat.app
经常有人问 Entitlements.plist文件怎么写?照着这个来就行了,把 teamed和 bundle id改成你自己的:
签名完成后可以通过ldid命令查看签入的内容:
ldid -e /path/to/WeChat
到这里入侵圆满结束!
二、常用入侵原理和反入侵方法总结
下面我们总结一下用到的几个工具:
dumpdecryptedinsert_dylibcycript
第一个工具是砸壳用的 ,代码是开源的,而且相当简单,它并没有破解 appstore的加密算法,而是把自己注入到已经通过系统加载器解密的 mach-o文件,再把解密后的内存数据 dump出来,详细的原理这篇文章写的很清楚:
那他是怎么注入的呢?就是利用了 iOS系统中 DYLD_INSERT_LIBRARIES 这个环境变量,如果设置了DYLD_INSERT_LIBRARIES 环境变量,那么在程序运行时,动态链接器会先加载该环境变量所指定的动态库;也就是说,这个动态库的加载优先于任何其它的库,包括 libc。
由于这个环境变量指定的动态库加载的时机实在是太早了,所以对于 app来说,除了代码混淆外,无良策;
但是我们可以在代码中通过判断环境变量来检测是不是被注入:
charchar *env = getenv("DYLD_INSERT_LIBRARIES");
如果方法返回非空,我们可以做一些上报之类的。
后面两个工具都是用来注入的:
insert_dylib通过向 mach-o文件的 loadcommand段插入 LC_LOAD_DYLIB数据来加载第三方库。
对于 insert_dylib,我们可以通过在 Xcode的Build Settings中找到“Other Linker Flags”在其中加上-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null指令来绕过
dylib加载额外的第三方库,具体的原理可参考
但是破解这一招也非常简单,上面的链接也说了,用 0xED打开二进制文件,把__RESTRICT全局替换成其它名字即可。
cycript个人感觉是比较神奇的,它在进程运行时动态注入。
没有细看它的源码,网上资料称,它通过 taskfor_pid函数获取目标进程句柄,然后通过在进程内创建新线程并执行自己的代码。
对于 cycript这种 bt的行为,利用系统的 root权限在进程中创建线程并执行自己的代码,目前还没想到好的对策,如果有老司机有方法,希望能指导一下~
最后再说说 lldb反调试 ,网上大多都提到 ptrace系列函数,原理我就不多说,这里主要讲如何绕过它,有两种方法,先说第一种,直接通过汇编代码修改 ptrace的第一个参数,这样我们需要先知道在哪里调用了 ptrace。
用backboard服务启动启动目标程序:
debugserver -x backboard *:19999 /path/to/binary
在pc端用lldb连接:
process connect connect://deviceIP:19999
然后在lldb中下符号断点
b ptrace,
在lldb中输入c命令之后看ptrace第一行代码的位置,继续输入命令:
找到函数返回地址,然后用:
image list -o -f
找到目标程序的基地址,这样就能用上面说的公式计算出偏移量,最后在 hooper中找到调用 ptrace的汇编代码
找到汇编代码的位置后,把 ptrace的第一个参数 1F,替换成
0A即可,下面是我的调试过程:
第二种简单又暴力 ,注入tweak,让 ptrace直接返回0即可,具体的代码非常简单,直接发出来:
//Tweak.xm
#import &substrate.h&
#import &mach-o/dyld.h&
#import &dlfcn.h&
static int (*oldptrace)(int request, pid_t pid, caddr_t addr, int data);
static int newptrace(int request, pid_t pid, caddr_t addr, int data){
printf("newptrace:%d\n\n",request);
printf("Tweak for SkipPtrace
Start!\n\n");
MSHookFunction((void *)MSFindSymbol(NULL,"_ptrace"), (void *)newptrace, (void **)&oldptrace);
入侵的路有很多条,关键是要在开始阶段定好目标,并理清思路,不然很容易走进各种死胡同,还要学会面对失败,不要一条路走不通就放弃,最后呢,我们要善于借助各种工具,能用工具,干嘛还要去费力气。
今天分享就到这里,下面大家有问题可以提问哦!
Q1:其实我挺好奇,这个能被破解,应该也会有被封堵的问题吧?
我们这里只是伪造了自己的参数,并调用微信原有的逻辑自动拆红包,所以技术上出了微信更新版本,是封不了的,但是如果你抢的太暴力,账号有可能被封,这里我们可以通过随机的延迟等操作来避免
Q2:我在分析 UI时候多用了一个 reveal的工具。
reveal的可视化做的比较强大,用来分析 ui很不错,有需要可以用
Q3:想问问那些安全类软件是如何防止 tweak,对微信支付宝的进程保护?
防止tweak上面我也讲到一些,不过都是从目标 app的代码层级来讲的,例如反 gdb和反注入,对于安全类软件来说,在非越狱的系统上,基本起不了作用,在越狱机上面,由于有 root权限,这时就能做很多事情了,例如检查 mach-o文件的 loadcommand、检查 DYLD_INSERT_LIBRARIES这种环境变量等
Q4:各种微信分身版能被微信后台准确的识别出来吗?如果可以识别,有哪些方方法可以去识别?
您指的是一机多装吧,ios系统通过 app的 bundleid来唯一识别一个 app,分身版大多是通过改 bundleid并重新签名和发布,在代码中可以通过监控自己 info.plist里面的 bundle id来识别是否被篡改,但是这也是不可靠的,因为黑客们还是可以通过 hook你的监控函数来绕开
Q5:看到你不少是根据方法名字面上来猜想它的意思,要是有的 app代码写的烂,我们反而不好弄了吧?还有如果红包的核心代码是用 C/C++的代码,这是不是就不能这样反汇编了?
确实会这样,代码写得烂,有点类似于“代码混淆”,会增加入侵的难度,如果核心代码是 c/c++,在汇编层面会增加阅读难度,但是只是难度增加了而已
Q6:对于哪些包括 watch和 extension的 App,在重签名时有哪些需要注意的呢? 重签名安装成功但启动就闪退可能是什么原因?
有 extension的app,在重签名时,需要记住每个 extension都需要用同样的证书单独签名,然后再对外层的 ipa进行签名,重签名后启动闪退,可以通过 xcode连接设备,点击 window-&devices查看设备控制台,在控制台,会输出你那一个 dylib校验失败,还有失败的原因
Q7:听你分析逆向这么容易,那 ios防反编译有哪些方案?
ios防止反编译主要还是代码混淆,但是混淆的代价大家是知道的,而且混淆也不能完全阻止入侵,所以会得不偿失,因为这样,现在 ios开发很少用;还有一个方案就是反注入,上面讲过的,但是很容易被绕过
Q8:Android的一个安全加固保护是通过设置 PTRACEME来防止外部程序来 ptrace自己,如果 iOS APP也这样设置了,会不会导致其中一些逆向机制失效呢?
ptrace只是反调试的,不会影响逆向过程
【iOS逆向工程】从脱壳到获取源码
教你如何反编译app,拿到加密方式
iOS打包成 ipa包(简单粗暴方法)
iOS攻防 - (五)获取AppStore上的应用的所有头文件和源文件并脱壳
IDA反汇编/反编译静态分析iOS模拟器程序(六)交叉引用
如何去反编译一个ipa包
iOS逆向 查看ipa包是否加密
关于iOS开发中反编译的那些事儿
IOS安全、逆向、反编译
没有更多推荐了,}

我要回帖

更多关于 假面骑士punchhopper 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信