8小时内拼工作,成员都以由此核实的位移支付程序员

正文来源于腾讯bugly开荒者社区,非经小编同意,请勿转发,原来的小说地址:http://dev.qq.com/topic/5791da152168f2690e72daa4

正文来源于腾讯bugly开采者社区,非经小编同意,请勿转发,原来的小说地址:http://dev.qq.com/topic/5791da152168f2690e72daa4

“八时辰内拼专业,8钟头外拼成长”那是豪门一道的精美。除了天天忙于专门的学问外,大家都梦想能越多地方接受世界内的新知识与新工夫,从而走向人生巅峰。

“捌钟头内拼专门的学问,8小时外拼成长”那是豪门一块儿的脍炙人口。除了天天忙辛苦碌工作外,我们都指望能越多地区吸收世界内的新知识与新技艺,从而走向人生巅峰。

Dev Club
是一个交换活动开采技艺,结交朋友,扩充人脉的社群,成员都以通过核准的位移支付技术员。每一周都会进行嘉宾分享,话题琢磨等移动。

Dev Club
是多个沟通活动开垦才具,结交朋友,扩大人脉的社会群众体育,成员都是透过核算的位移支付工程师。周周都会举行嘉宾分享,话题切磋等移动。

上一期大家诚邀了腾讯 WXG iOS 开辟程序员“姚海波”分享了《微信读书
iOS品质优化》

上壹期大家特邀了腾讯 WXG iOS 开拓程序员“姚海波”分享了《微信读书
iOS品质优化》

本期,大家特邀了腾讯 CDG iOS
开辟技术员“何兆林”为我们享用《iOS黑客才干大揭破》

本期,大家约请了Tencent CDG iOS
开垦程序员“何兆林”为我们大快朵颐《iOS黑客技巧大揭穿》

哪些进入 Dev Club?

怎么着进入 Dev Club?

挪动端支出经历 >= 二年,微信扫描下方群处理微信贰维码,备注姓名-公司(或制品) 申请到场。

挪动端支付经历 >= 二年,微信扫描下方群管理微信2维码,备注姓名-集团(或制品) 申请加入。

图片 1

图片 2



享受内容简单介绍:

分享内容简要介绍:

在黑客的社会风气里,未有坚不可破的防护系统,也尚无无往不胜、无坚不摧的凌犯利器,有时候看似简单的难题,破解起来只怕花上或多或少天、繁多少个月,有时候看似很
low 的工具往往能一挥而就大难点;我们以落到实处微信自动抢红包为引子,稳步拓展 iOS
黑客入侵常用的两种武器,并简短的上书一些常用的反凌犯战略,以及怎么着破解反入侵战略,固然抢红包的破解代码英特网有点不清,可是大家要讲的是这一个代码是用什么工具分析出的,为何要如此写?

在黑客的社会风气里,未有坚不可破的防护系统,也并未有无往不胜、长驱直入的凌犯利器,有时候看似轻巧的标题,破解起来也许花上有些天、繁多少个月,有时候看似很
low 的工具往往能缓和大标题;大家以达成微信自动抢红包为引子,逐步开始展览 iOS
黑客凌犯常用的两种武器,并简短的教师一些常用的反侵略战术,以及哪些破解反凌犯战术,固然抢红包的破解代码英特网有不胜枚举,不过大家要讲的是那些代码是用哪些工具分析出的,为何要那样写?

内容概况框架:

内容大致框架:

  1. 让指标程序破茧而出 -- dumpdecrypted
  2. 运作时分析 -- cycript
  3. 追踪神器 -- logify
  4. 反汇编工具 -- hopper
  5. 断点调节和测试工具 -- lldb+debugserver
  6. 流入工具 -- insert_dylib + install_name_tool

    分享人介绍: 何兆林 通信充钱与彩票工作部 iOS开辟程序员。

    担当过的出品:QQ彩票、QQ电影票 iOS客户端,近期最首要承担 QQ彩票
    iOS客户端的付出。

  1. 让目标程序破茧而出 -- dumpdecrypted
  2. 运行时分析 -- cycript
  3. 追踪神器 -- logify
  4. 反汇编工具 -- hopper
  5. 断点调节和测试工具 -- lldb+debugserver
  6. 流入工具 -- insert_dylib + install_name_tool

    分享人介绍: 何兆林 通信充钱与彩票工作部 iOS开荒技术员。

    承担过的制品:QQ彩票、QQ电影票 iOS客户端,方今重大承担 QQ彩票
    iOS客户端的费用。



上边是本期分享内容整理

下边是本期分享内容整理



世家夜间好,小编是来源于 CDG的 jolinhe,近来在做qq彩票品类,肩负iOS侧的插件化和总体架构。

大家夜间好,作者是根源 CDG的 jolinhe,近日在做qq彩票品类,担当iOS侧的插件化和总体架构。

越狱和侵入是小编的业余爱好,正好0八和0九年的时候,在网龙积存了1部分越狱开垦经历,所以后天跟我们分享一下
iOS侵犯方面的工具和手段。

越狱和侵犯是本身的业余爱好,正好08和0玖年的时候,在网龙储存了有些越狱开采经历,所以明日跟我们大快朵颐一下
iOS凌犯方面包车型地铁工具和手段。

为了幸免用空想来欺骗别人:

为了制止聊以自慰:

  • 率先有个别大家就拿微信来开刀,解说一下怎么选用那么些工具来找到和实现机关抢红包作用的;
  • 其次片段我们再总括一下常用的凌犯原理和反侵袭方法。

    开端在此以前,大家须要把条件搞起,硬件方面,要求:

  • 先是片段我们就拿微信来开刀,疏解一下怎么着使用那几个工具来找到和兑现机关抢红包功用的;
  • 其次部分大家再下结论一下常用的入侵原理和反侵略方法。

    千帆竞发在此以前,我们须要把情形搞起,硬件方面,必要:

  1. 一台越狱手提式有线话机
  2. 一台装了付出景况的 Mac计算机

    软件方面内容提纲已经列出来了,需求留意的是它们有1部分是手提式无线电话机端的,一些是
    PC端的
    ,用到的时候笔者会细讲。

    群里不乏老车手,这里本人假使咱们对此
    ssh、theos、class_dump、hook那一个工具和技术都曾经具有涉猎了,尽管有不明了的,迎接私下交换。

    壹、微信达成活动抢红包作用

    言归正传,要兑现自动化抢红包,首先大家需求清理思绪:

  1. 一台越狱手提式有线电话机
  2. 壹台装了费用条件的 MacComputer

    软件方面内容提纲已经列出来了,供给小心的是它们有局地是手提式有线话机端的,一些是
    PC端的
    ,用到的时候作者会细讲。

    群里不乏老开车员,那里笔者只要大家对此
    ssh、theos、class_dump、hook那些工具和才干都已经具有涉猎了,假使有不知道的,招待私自交换。

    一、微信达成机关抢红包功效

    言归正传,要兑现自动化抢红包,首先大家要求清理思路:

  • 第一步:须要拦截微信的新闻流,在哪个地方拦截?
  • 第二步:在那些新闻流中分辨出什么样信息是红包?
  • 第三步:在适度的地点插入自个儿的“抢”红包代码。

    ### 一、让目的程序破茧而出——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提供的巅峰。

    此刻进入在手提式有线电话机上进入微信的谈天窗口,举例:

    图片 3

    接下来在 cycript的终点输入:

    UIApp.keyWindow.recursiveDescription().toString()

    结果如下:

    图片 4

    打字与印刷的是近年来的ui树,随意找二个节点(树的中级,为啥要在中游,大家能够考虑下),copy它的内部存款和储蓄器地址,比如
    0x14da3f000

    执行:[#0x14da3f000 nextResponder]

    会输出当前节点的下超级事件响应链,然后对输出节点再次调用
    nextResponder,直到找到它的视图调控器 xxxcontroller

    图片 5

    看看了呢,微信的聊天页对应的类名是
    BaseMsgContentViewController

    ### 三、追踪神器 -- logify

    最近停止大家已经锁定了大约的突破口,下面还需后续追踪,找到这么些类里面包车型客车消息管理函数,那里的思绪正是经过向群里发送一个音讯,然后观察controller中哪些措施被调用了。

    其四个工具 Logify就是干那几个业务的,它是 theos的1个组件,和
    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这里会有八个缺陷:

  • 首先,必须进特定的群的闲话页面才干奏效;

  • 第3,七个群同时有红包来,没办法并发的抢。

    为了追求越发权威的效率,我们必要再前行追溯消息的源流,最好hook那种微信运行后就存在的目的,怎么追溯呢?

    笔者的笔触是经过在这几个办法中安装断点,通过调用栈,来找到上层的调用者。

    ### 四、反汇编工具——hopper & 断点调试工具——lldb + debugserver

    第伍个工具 lldb +
    debugserver
    顾名思义,debugserver是手提式有线电话机端的(只要你的无绳电话机有连过
    xcode实行 debug,这一个东西就活动有了),用于监听 pc端
    lldb的连天,来促成远程调节和测试。

    本条工具要和第四个 hooper(反汇编工具)整合起来用。

    第二 ssh进手提式无线电话机的巅峰,输入:

    debugserver *:19999 -a WeChat

    监听 lldb的连接

    然后展开pc的极端,运转 lldb并接二连三:

    lldb
    process connect connect://deviceIP:19999

    只要总是成功,大家就规范进入 debug状态了。

    那么难题来了,要标准的设置断点,必须领悟这几个函数的内部存款和储蓄器地址,那个内部存款和储蓄器地址怎么搞出来呢?

    有个公式:

    内部存储器地址=进度内部存款和储蓄器营地址+函数在二进制中的偏移量

    上面大家早已连上了 lldb调节和测试碰到,获取集散地址在 lldb中输入下边包车型地铁吩咐:

    image list -o -f

    此刻会输出大多行数据,找到文件名叫WeChat的模块地址,那里首先行就是了:

    图片 6

    偏移量须要信赖 hooper,pc端的反汇编利器,用
    hooper展开微信的2进制文件,等几分钟,反汇编完结后,在搜求框输入刚找到的函数名:
    addMessageNode,定位到相应的汇编代码,第2列正是偏移量了:

    图片 7

    多个参数都找到后,在lldb中输入:

    br s -a ‘基地址+偏移量’

    然后用 “br l” 确认一下断点是还是不是设置成功

    进入聊天分界面,再一次向群发送叁个音信,会意识 ui卡住了,观看lldb调整台,会提醒进度被断住了,在 lldb中接二连三输入
    bt指令,入眼注重模块名是
    WeChat的栈,可是出于未有符号表,大家只美观到栈的内部存款和储蓄器地址:

    图片 8

    想要把内部存储器地址还原成函数名,供给两步:

  • 率先要把内部存款和储蓄器地址转变来2进制文件偏移量

  • 其次步再选拔 hooper依照偏移量找到函数名

    约等于上面公式的逆向进程:

    函数在贰进制中的偏移量=内部存款和储蓄器地址 – 进度内部存款和储蓄器营地址

    此地大家栈地址是0x0000000101ad02f4,集散地址是0x00000000000e8000,做下减法,得到结果0x1019E82F4,然后在
    hooper中找找这一个地址就能得到方法名:

    图片 9

    由此及彼,最后获得栈顶的调用是以此:

    [CMessageMgr MainThreadNotifyToExt:]

    CMessageMgr这么些类,从名字来看,正是音讯处理器,而且是单例的,大家到底找到了实在须要hook的类,但是这一个措施是用来异步发送通告的,不像是音信的源头,所以大家用地方说的
    logify组件继续追踪一下以此类

    经过不再另行讲,终极的靶子到底浮出水面:

    (void)AsyncOnAddMsg:(id)message MsgWrap:(CMessageWrap* )msgWrap

    先是步音信的拦截点终于找到了,接下去是第1步:

    第二步:我们要求了解什么样消息是红包,那个就比较轻易,向群里发1个一般新闻和红包新闻,通过
    logify组件阅览 message参数的内容,开掘它个中有三个type字段,假若是红包,值是4九,其他语音和文书各差别样,所以,那里轻巧化解。

    其三步:须要贯彻抢红包代码,这一步稍微复杂一点,先讲一下思路,首先进入微信开红包的分界面:

    图片 10

    根上面讲过的一律,通过
    cycript+logify咱俩得以轻易得到开红包的入口函数,下一步,大家须求和谐从
    AsyncOnAddMsg的参数中社团抢红包函数的入参。

    找注入点自身就不再重复讲,直接上结果:

    [WCRedEnvelopesReceiveHomeView OnOpenRedEnvelopes]

    这眼看是二个事件管理函数,它里面明确会调用真正的拆红包逻辑

    因而大家打开hooper,找到那些办法然后观看方法体,开掘它在终极调用了1个selector:

    WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes

    那应该是当真的拆红包逻辑,可是那几个selector未有参数,所以自身可疑那个点子的功效应该是友好包装拆红包所需的多寡,并调用底层服务来拆红包。

    在hooper中检索那些法子,观望一下,果然是如此的:

    函数起头有些的汇编代码都以在组织dictionary,只有在终极调用了八个能够函数:

    图片 11

    那边说可瑞康(Karicare)(Beingmate)下,由于微信那1块的代码全都是 oc的,而 hooper能够平素将
    oc反汇编到接近源码的档期的顺序,所以,还原进度基本不必要领会多少汇编知识,具体的复原进程能够看下作者后面发的小说:http://blog.csdn.net/heiby/article/details/51792151

    末段一步,编写 tweak,替换 AsyncOnAddMsg函数并把团结的果实注入进来就
    ok了。

    ### 6、注入工具——insert_dylib + install_name_tool

    对此越狱机器来讲,到此地早已马到成功了,不过想要在非越狱机器上跑,还须求多少个步骤:

    在非越狱机上边,一切都要靠本身,首先手动把您的库注入到目的2进制中,这一步使用
    insert_dylib就足以了,它运营在 pc端,在命令行
    cd到微信的二进制目录,施行命令:

    insert_dylib @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在此之前,还索要对微信的2进制文件举办签字:

    codesign -f -s “iPhone Developer:xxx” —entitlements
    Entitlements.plist WeChat.app

    平时有人问 Entitlements.plist文件怎么写?照着那么些来就行了,把
    teamed和 bundle id改成你和煦的:

    图片 12

    签字实现后得以因而ldid命令查看签入的始末:

    ldid -e /path/to/WeChat

    到此地侵犯圆满甘休!

    贰、常用侵袭原理和反凌犯方法总计

    下边大家总结一下用到的多少个工具:

  • dumpdecrypted

  • insert_dylib

  • cycript

    先是个工具是砸壳用的,代码是开源的,而且十一分轻易,它并不曾破解
    appstore的加密算法,而是把温馨注入到已经由此系统加载器解密的
    mach-o文件,再把解密后的内部存款和储蓄器数据
    dump出来,详细的原理那篇文章写的很明亮:http://bbs.iosre.com/t/dumpdecrypted/465

    那他是怎么注入的吧?正是运用了 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加载额外的第三方库,具体的原理可参考
    http://bbs.iosre.com/t/tweak-app-app-tweak/438

    不过破解那壹招也相当轻巧,上面包车型客车链接也说了,用
    0xED张开二进制文件,把__RESTRICT全局替换来其余名字就能够。

    cycript个人认为是相比较玄妙的,它在经过运维时动态注入。

    从未有过细看它的源码,网络资料称,它通过
    taskfor_pid函数获取目标经过句柄,然后经过在经过内创造新线程并进行本人的代码。

    对此 cycript那种 bt的一颦一笑,利用系列的root权限在进度中开创线程并进行自个儿的代码,近期还没悟出好的战略性,假使有老车手有措施,希望能引导一下~

    最终再说说 lldb反调节和测试,网络许多都涉及
    ptrace种类函数,原理作者就不多说,那里根本讲怎样绕过它,有二种艺术,先说第3种,直接通过汇编代码修改
    ptrace的率先个参数,那样大家须求先知道在何地调用了 ptrace。

    用backboard服务运维运行目的程序:

    debugserver -x backboard *:19999 /path/to/binary

    在pc端用lldb连接:

    process connect connect://deviceIP:19999

    然后在lldb中下符号断点

    b ptrace,

    在lldb中输入c命令之后看ptrace第一行代码的职务,继续输入指令:

    p/x $lr

    找到函数重临地址,然后用:

    image list -o -f

    找到目的程序的营地址,那样就能用上边说的公式总结出偏移量,最终在
    hooper中找到调用 ptrace的汇编代码

    找到汇编代码的岗位后,把 ptrace的首先个参数 1F,替换成
    0A就可以,上边是自家的调治将养进度:

    手机端:

    图片 13

    pc端:

    图片 14

    第两种轻松又暴力,注入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);
      return 0;
    }
    %ctor {
      printf("Tweak for SkipPtrace  Start!\n\n");
      MSHookFunction((void *)MSFindSymbol(NULL,"_ptrace"), (void *)newptrace, (void **)&oldptrace);
    }
    

    总结

    入侵的路有许多条,关键是要在先河阶段定好目的,并理清思路,不然很轻便走进各个死胡同,还要学会师对失利,不要一条路走不通就放弃,最终吧,大家要善于借助种种工具,能用工具,干嘛还要去费力气。

    前几日分享就到那边,上边我们有题目能够问问哦!

  • 第一步:需求拦截微信的音讯流,在哪里拦截?
  • 第二步:在这几个音讯流中分辨出什么样音讯是红包?
  • 第三步:在极度的地点插入本身的“抢”红包代码。

    ### 1、让目的程序破茧而出——dumpdecrypted

    因为直接从
    AppStore下载下来的2进制文件都以加了壳的,所认为了让它的水源破茧而出,咱们要求砸壳操作。

    从而率先个工具就是dumpdecrypted,那么些工具是手机端的,能够因而cydia安装,安装后文件路线是:

    /usr/lib/dumpdecrypted.dylib

    在实际上接纳时,能够经过 pp帮手把那一个文件 copy到目标程序的
    documents目录,然后ssh进手提式有线话机终端,cd到 documents目录,施行:

    DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib WeChatPath

    执行完后会再 documents目录生成叁个砸完壳后的二进制文件

    ### 贰、运行时解析——cycript

    砸完壳之后,我们再
    dump出头文件,不过微信的类太多了,头文件有几百个,如此多的头文件,让人眼花缭乱,所以要找到突破口,大家得收缩范围,小编爱不释手用的思路是从
    ui入手,先找到微信对话分界面包车型大巴 controller,然后再追踪controller中对应的音信管理函数。

    这么第二个工具 cycript
    隆重登台了
    ,它也是个手机端的工具,用于查看
    app运转时数据,大伙儿能够经过
    cydia安装,安装完以往,ssh到越狱手提式有线电话机的顶点。

    先找到微信的进程id:ps aux | grep WeChat
    再执行:cycript -p 微信的pid

    成功了注入,进入到 cycript提供的终点。

    此刻进入在手提式有线电话机上进入微信的闲谈窗口,比方:

    图片 15

    接下来在 cycript的顶峰输入:

    UIApp.keyWindow.recursiveDescription().toString()

    结果如下:

    图片 16

    打字与印刷的是当前的ui树,随意找一个节点(树的中等,为何要在在那之中,我们能够驰念下),copy它的内部存款和储蓄器地址,举个例子
    0x14da3f000

    执行:[#0x14da3f000 nextResponder]

    会输出当前节点的下一流事件响应链,然后对输出节点再度调用
    nextResponder,直到找到它的视图调整器 xxxcontroller

    图片 17

    见状了啊,微信的聊天页对应的类名是
    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观望手提式有线电话机调整台出口。

    输出内容繁多,需求细致过滤一下,比如大家发的音讯是3个文本“test”,在调控台寻觅它,你会在它左近找到上面那么些函数调用:

    addMessageNode:layout:addMoreMsg

    从函数名字来看,这些应该正是用来拍卖音讯数据的,从表面来看大家早就找到音信的拦截点了,然则大家想转手,假诺大家hook这几个主意,在中间自动抢红包,会有啥样致命的弱项?

    老开车员们已经看出来了吧,那几个办法是
    BaseMsgContentViewController类里面包车型客车,而以此类进入聊天页面才会被创设。

    hook那里会有多个缺陷:

  • 先是,必须进特定的群的扯淡页面技术见效;

  • 其次,七个群同时有红包来,无法并发的抢。

    为了追求更为权威的作用,大家要求再前行追溯音讯的源流,最佳hook那种微信运营后就存在的对象,怎么追溯呢?

    自个儿的思绪是经过在那几个办法中设置断点,通过调用栈,来找到上层的调用者。

    ### 四、反汇编工具——hopper & 断点调节和测试工具——lldb + debugserver

    第5个工具 lldb +
    debugserver
    顾名思义,debugserver是手提式有线电话机端的(只要您的手提式有线电电话机有连过
    xcode进行 debug,那几个东西就机关有了),用于监听 pc端
    lldb的连接,来贯彻远程调节和测试。

    以此工具要和第五个 hooper(反汇编工具)构成起来用。

    率先 ssh进手提式有线电话机的终点,输入:

    debugserver *:19999 -a WeChat

    监听 lldb的连接

    接下来张开pc的顶点,运转 lldb并一而再:

    lldb
    process connect connect://deviceIP:19999

    若果老是成功,大家就正式进入 debug状态了。

    那就是说问题来了,要可相信的装置断点,必须精通这些函数的内部存款和储蓄器地址,那么些内部存储器地址怎么搞出来吧?

    有个公式:

    内部存款和储蓄器地址=进度内部存款和储蓄器营地址+函数在二进制中的偏移量

    上面我们早已连上了 lldb调节和测试意况,获取集散地址在 lldb中输入上边包车型客车下令:

    image list -o -f

    那时候会输出大多行数据,找到文件名为WeChat的模块地址,那里首先行正是了:

    图片 18

    偏移量要求借助 hooper,pc端的反汇编利器,用
    hooper张开微信的2进制文件,等几秒钟,反汇编完结后,在研究框输入刚找到的函数名:
    addMessageNode,定位到对应的汇编代码,第2列正是偏移量了:

    图片 19

    多少个参数都找到后,在lldb中输入:

    br s -a ‘基地址+偏移量’

    然后用 “br l” 确认一下断点是或不是设置成功

    跻身聊天分界面,再一次向群发送二个新闻,会开采 ui卡住了,观望lldb调节台,会唤醒进程被断住了,在 lldb中持续输入
    bt指令,入眼观测模块名是
    WeChat的栈,不过由于尚未符号表,大家不得不看看栈的内部存储器地址:

    图片 20

    想要把内部存款和储蓄器地址还原成函数名,必要两步:

  • 第1要把内部存款和储蓄器地址调换来贰进制文件偏移量

  • 其次步再使用 hooper根据偏移量找到函数名

    也便是地点公式的逆向进程:

    函数在二进制中的偏移量=内部存储器地址 – 过程内部存款和储蓄器集散地址

    这边大家栈地址是0x0000000101ad02f4,营地址是0x00000000000e8000,做下减法,获得结果0x1019E82F4,然后在
    hooper中查究这几个地点就能博取方法名:

    图片 21

    就那样类推,最后获得栈顶的调用是那么些:

    [CMessageMgr MainThreadNotifyToExt:]

    CMessageMgr那些类,从名字来看,就是音讯管理器,而且是单例的,大家终于找到了实在须要hook的类,可是那么些法子是用来异步发送通告的,不像是音信的源流,所以我们用地点说的
    logify组件继续追踪一下这些类

    进度不再重复讲,最后的靶子到底浮出水面:

    (void)AsyncOnAddMsg:(id)message MsgWrap:(CMessageWrap* )msgWrap

    先是步新闻的拦截点终于找到了,接下去是第一步:

    第二步:我们必要精通什么样新闻是红包,那个就比较简单,向群里发贰个通常消息和红包音讯,通过
    logify组件观望 message参数的内容,发掘它里面有2个type字段,如若是红包,值是4玖,其余语音和文书各分歧样,所以,那里轻便化解。

    其三步:需求完毕抢红包代码,这一步稍微复杂一点,先讲一下思路,首先进入微信开红包的分界面:

    图片 22

    根上边讲过的同样,通过
    cycript+logify笔者们能够轻便获得开红包的入口函数,下一步,大家须求自身从
    AsyncOnAddMsg的参数中布局抢红包函数的入参。

    找注入点自身就不再重复讲,直接上结果:

    [WCRedEnvelopesReceiveHomeView OnOpenRedEnvelopes]

    那明显是3个事件管理函数,它在那之中显然会调用真正的拆红包逻辑

    故而大家开采hooper,找到这些点子然后观看方法体,开掘它在结尾调用了贰个selector:

    WCRedEnvelopesReceiveHomeViewOpenRedEnvelopes

    这应该是真的的拆红包逻辑,可是那么些selector未有参数,所以自身疑心那个点子的效应应该是和煦包裹拆红包所需的数额,并调用底层服务来拆红包。

    在hooper中查找这些法子,观望一下,果然是如此的:

    函数开头有的的汇编代码都以在协会dictionary,唯有在终极调用了三个方可函数:

    图片 23

    此间说贝拉米(Bellamy)下,由于微信那1块的代码全都以 oc的,而 hooper能够直接将
    oc反汇编到类似源码的水准,所以,还原进程基本不要求控制多少汇编知识,具体的还原进度可以看下我事头阵的小说:http://blog.csdn.net/heiby/article/details/51792151

    最后一步,编写 tweak,替换 AsyncOnAddMsg函数并把温馨的成果注入进来就
    ok了。

    ### 陆、注入工具——insert_dylib + install_name_tool

    对于越狱机器来说,到此处一度马到成功了,不过想要在非越狱机器上跑,还索要几个步骤:

    在非越狱机上边,一切都要靠自身,首先手动把您的库注入到目的二进制中,这一步使用
    insert_dylib就足以了,它运营在 pc端,在命令行
    cd到微信的二进制目录,实行命令:

    insert_dylib @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改成你本身的:

    图片 24

    签名完毕后可以因而ldid命令查看签入的剧情:

    ldid -e /path/to/WeChat

    到此地侵袭圆满停止!

    2、常用凌犯原理和反侵袭方法总计

    下边大家总括一下用到的几个工具:

  • dumpdecrypted

  • insert_dylib

  • cycript

    先是个工具是砸壳用的,代码是开源的,而且一定简单,它并不曾破解
    appstore的加密算法,而是把温馨注入到曾经通过系统加载器解密的
    mach-o文件,再把解密后的内部存款和储蓄器数据
    dump出来,详细的原理那篇小说写的很明白:http://bbs.iosre.com/t/dumpdecrypted/465

    那她是怎么注入的吧?便是使用了 iOS系统中
    DYLD_INSERT_LIBRARIES其1意况变量,假设设置了
    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加载额外的第3方库,具体的法则可参考
    http://bbs.iosre.com/t/tweak-app-app-tweak/438

    不过破解那壹招也分外简单,上边的链接也说了,用
    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第一行代码的地方,继续输入指令:

    p/x $lr

    找到函数重临地址,然后用:

    image list -o -f

    找到目标程序的营地址,那样就能用上面说的公式计算出偏移量,最终在
    hooper中找到调用 ptrace的汇编代码

    找到汇编代码的职责后,把 ptrace的首先个参数 1F,替换成
    0A就可以,上面是自个儿的调治进度:

    手机端:

    图片 25

    pc端:

    图片 26

    第二种轻易又暴力,注入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);
      return 0;
    }
    %ctor {
      printf("Tweak for SkipPtrace  Start!\n\n");
      MSHookFunction((void *)MSFindSymbol(NULL,"_ptrace"), (void *)newptrace, (void **)&oldptrace);
    }
    

    总结

    侵袭的路有繁多条,关键是要在伊始阶段定好目的,并理清思路,不然很轻巧走进各个死胡同,还要学晤面对曲折,不要一条路走不通就屏弃,最后吧,大家要善用借助各类工具,能用工具,干嘛还要去费劲气。

    后天分享就到此处,下边我们有标题能够问问哦!

问答环节

Q1:其实自身挺感叹,那个能被破解,应该也会有被堵塞的难点呢?

大家那边只是伪造了自个儿的参数,并调用微信原本的逻辑自动拆红包,所以手艺上出了微信更新版本,是封不了的,可是如果你抢的太暴力,账号有希望被封,那里大家能够因而随机的推移等操作来制止

Q2:作者在条分缕析 UI时候多用了3个 reveal的工具。

reveal的可视化做的比较强硬,用来分析 ui很准确,有亟待能够用

Q3:想咨询这几个安全类软件是何等防止 tweak,对微信支付宝的经过爱抚?

谨防tweak下面小编也讲到一些,然则都是从目的 app的代码层级来讲的,比方反
gdb和反注入,对于安全类软件以来,在非越狱的体系上,基本起持续效能,在越狱机上边,由于有
root权限,那时就能做过多事情了,举例检查 mach-o文件的
loadcommand、检查 DYLD_INSERT_LIBRA福特ExplorerIES那种遭遇变量等

Q四:种种微信分身版能被微信后台准确的辨认出来呢?尽管能够识别,有怎么样方方法可以去分辨?

你指的是一机多装吧,ios系统通过 app的 bundleid来唯1识别1个app,分身版大多是由此改
bundleid并再一次具名和发布,在代码中得以经过监督检查本身 info.plist里面的bundle id来甄别是还是不是被曲解,不过那也是不可信赖的,因为黑客们还是足以由此hook你的监察函数来绕开

Q5:看到你多多是基于章程名字面上来思疑它的情致,倘诺有的
app代码写的烂,大家反而倒霉弄了吧?还有假诺红包的中央代码是用
C/C++的代码,那是还是不是就无法这么反汇编了?

的确会那样,代码写得烂,有点类似于“代码混淆”,会大增凌犯的难度,即使基本代码是
c/c++,在汇编层面会增加阅读难度,然则只是难度扩大了而已

Q陆:对于怎么蕴含 watch和 extension的
App,在重签字时有哪些需求注意的吗?
重签字安装成功但运转就闪退大概是怎么样来头?

有 extension的app,在重签字时,必要记住各样extension都亟需用一样的证件单独签名,然后再对外围的
ipa进行签订契约,重具名后运营闪退,可以通过 xcode连接装置,点击
window->devices查看设备调控台,在调节台,会输出你那么些dylib校验失利,还有退步的缘由

Q7:听你分析逆向那样轻易,那 ios防反编写翻译有啥样方案?

ios幸免反编写翻译首要如故代码混淆,不过混淆的代价大家是明白的,而且混淆也无法完全阻止入侵,所以会以珠弹雀,因为这么,现在ios开垦很少用;还有二个方案就是反注入,上边讲过的,不过很轻便被绕过

Q八:Android的贰个康宁加固爱慕是经过安装 PTRACEME来防御外部程序来
ptrace自个儿,尽管 iOS
应用程式也如此设置了,会不会导致当中壹部分逆向机制失灵呢?

ptrace只是反调节和测试的,不会潜移默化逆向进程

更加多雅观内容应接关切bugly的微信公众账号:

图片 27

腾讯
Bugly
是壹款专为移动开辟者营造的材料监督工具,帮忙开采者快捷,便捷的定位线上行使崩溃的状态以及化解方案。智能合并效能支持开采同学把每日上报的数千条
Crash
依据根因合并分类,每一日早报会列出影响用户数最多的夭亡,精准定位作用扶助开辟同学定位到出难点的代码行,实时举报能够在发布后高速的问询应用的材质情况,适配最新的
iOS, Android 官方操作系统,鹅厂的程序员都在运用,快来参预大家吧!

问答环节

Q1:其实本身挺奇异,这几个能被破解,应该也会有被封堵的标题吧?

大家那里只是伪造了上下一心的参数,并调用微信原本的逻辑自动拆红包,所以才能上出了微信更新版本,是封不了的,可是如果你抢的太暴力,账号有十分的大概率被封,那里我们能够透过自由的推移等操作来制止

Q二:我在分析 UI时候多用了一个 reveal的工具。

reveal的可视化做的相比强硬,用来分析 ui很不错,有亟待能够用

Q三:想咨询那二个安全类软件是什么样防范 tweak,对微信支付宝的进度爱抚?

堤防tweak上边小编也讲到一些,但是都是从目的 app的代码层级来讲的,举个例子反
gdb和反注入,对于安全类软件以来,在非越狱的种类上,基本起持续功效,在越狱机上面,由于有
root权限,那时就能做过多事情了,比如检查 mach-o文件的
loadcommand、检查 DYLD_INSERT_LIBRA途乐IES那种碰着变量等

Q四:各类微信分身版能被微信后台正确的辨别出来呢?要是得以分辨,有啥样方方法能够去辨别?

你指的是一机多装吧,ios系统经过 app的 bundleid来唯1识别一个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
应用程式也这样设置了,会不会导致当中有些逆向机制失灵呢?

ptrace只是反调节和测试的,不会影响逆向进度

越多精粹内容招待关切bugly的微信公众账号:

图片 28

腾讯
Bugly
是壹款专为移动开垦者创设的品质监察和控制工具,协理开辟者快速,便捷的定位线上采纳崩溃的意况以及缓慢解决方案。智能合并功效支持开荒同学把每一天上报的数千条
Crash
依据根因合并分类,每一日晚报会列出影响用户数最多的咽气,精准定位功用扶助开荒同学定位到出难点的代码行,实时反映能够在公告后快速的垂询应用的质量意况,适配最新的
iOS, Android 官方操作系统,鹅厂的技术员都在使用,快来到场我们吧!

相关文章