iOS逆向——shell重签名及代码注入

2020-04-13 11:35:03 蜻蜓队长

感谢hank老师

上一章我们讲了应用签名原理和重签名原理,不再赘述,没有看过的同学可以点这里——

iOS逆向——应用签名及重签名原理。

这章概述shell脚本重签名。可能有的同学认为有很多工具都能快速的帮助我们重签名实现需求,但我更希望在这里与大家沟通原理性的东西,而不是简单的使用第三方工具来满足我们。

shell脚本

什么是shell脚本?

shell是一种特殊的交互式工具,它为用户提供了启动程序、管理文件系统中文件以及运行在系统上的进程的途径。Shell一般是指命令行工具。它允许你输入文本命令,然后解释命令,并在内核中执行。

Shell脚本,也就是用各类命令预先放入到一个文本文件中,方便一次性执行的一个脚本文件。

脚本执行相关命令

$source FileName  复制代码

  • 意思:在当前shell环境中读取并执行FileName中的命令
  • 特点:
        •命令可以强行让一个脚本去立即影响当前的环境(一般用于加载配置文件)。
        •命令会强制执行脚本中的全部命令,而忽略文件的权限。

$bash FileName 、 $zsh FileName复制代码

  • 意思:重新建立一个子shell,在子shell中执行脚本里面的句子。

$./FileName复制代码

  • 意思:读取并执行文件中的命令。但有一个前提,脚本文件需要有可执行权限。

下面来点干货,脚本重签名的源码。网上搜也有很多,大家开心就好。不知道为什么,我写在bash后,代码格式总乱,大家可以找到其他文献源码,这里我贴图

如果你想要简单的了解shell,参考Andy哥的文献。共三篇文章,简明粗暴易懂。

用户、组、权限

Unix和Linux都是多用户、多任务的系统,所以这样的系统里面就拥有了用户、组的概念。那么同样文件的权限也就有相应的所属用户和所属组了。


Mac文件属性


                                                                   ↑

[     权限     ] [连接][所有者] [所属组]       [文件大小][最后修改日期][文件名称]


第一位:文件类型

常见:

  • [d]目录(dictionary)
  • [-]文件

后九位,文件权限,每三位一组,

  • 第一组:文件所有者的权限 rwx
  • 第二组:这一组其他用户的权限 r-x
  • 第三组:非本组用户的权限 r-x

文件权限

[r]:read,读

[w]:write,写

[x]:execute,执行

注意:这三组权限的位置不会变,依次是rwx,出现[-]对应位置,代表没有此权限

改变权限:chmod

文件权限的改变使用chmod命令。设置方法有两种:数字类型改变 和 符号类型改变。

由于文件权限分为三种身份:[user][group][other] 三个权限:[read] [write] [execute]

数字类型:

各个权限数字对照:r:4 w:2 x:1

如果一个文件权限为 [–rwxr-xr-x ]

User : 4+2+1 = 7

Group: 4+0+1 = 5

Other: 4+0+1 = 5

命令:chmod 755 文件名


符号类型:

chmod [u、g、o、a] [+(加入)、-(除去)、=(设置)] [r、w、x] 文件名称

[a]代表all,[a]=[u+g+o],在我们加入权限的时候,没有添加身份,默认为[a]

代码注入

一般修改原始的程序,是利用代码注入的方式,注入代码就会选择利用FrameWork或者Dylib等三方库的方式注入。

在这里我们先简单介绍一下DYLD,Dynamical Load,又叫动态链接器,存在于操作系统中。在手机开机的时候,该程序就默认启动。DYLD在手机内存中执行,CPU调度DYLD,DYLD就会把加载的应用(MacO)加载到内存中去。当DYLD读取MacO文件的时候,首先就会读取Load Commands字段,该字段包含了Foundation \UIKit等库,例如我们在调用NSLog函数,一定会到Foundation这个库中调用,但是谁知道Foundation这个库的真实地址,DYLD。如果依赖的库不再内存当中,所以就加载该库。

所以,我们要在Load Commands中插入一个我们自己写的Framework。


注入步骤

用MacOview查询ipa文件夹下包内容的二进制文件,查看Load Commands。




  • Framwork注入
       •  通过Xcode新建Framwork,将库安装进入APP包

       •  通过yololib注入Framwork库路径。命令:$yololib(空格)MachO文件路径(空格)库             路径

yololib WeChat Frameworks/xxxxHook.framework/xxxxHook //库加载到MachO中Load Command下的LC_LOAD_DYLIB中复制代码

               •  所有的Framwork加载都是由DYLD加载进入内存被执行的

               •  注入成功的库路径会写入到MachO文件的LC_LOAD_DYLIB字段中

然后将成功注入后的二进制文件替换掉前文提到的TARGET_IPA_PATH下的二进制文件。

保留Payload文件夹,压缩Payload。

zip -ry WeChat.ipa Payload复制代码

最后生成的ipa,用重签的方式可以安装到手机。

  • Dylib注入
       •  通过Xcode新建Dylib库(注意:Dylib属于MacOS所以需要修改属性)
       •  添加Target依赖,让Xcode将自定义Dylib文件打包进入APP包。

       •  利用yololib进行注入。

两种方式都可以实现代码的注入。如果我哪里写的不对、不清楚,还希望你能提出来,我们共同探讨进步,如果你喜欢此文章,就动一动小手点个赞吧。

想要yololib和MachOview的安装文件,可以留言。


以上内容来自于网络,如有侵权联系即删除
相关文章

上一篇: iOS逆向学习之九(深入研究Mach-O结构)

下一篇: 【iOS】架构师之路~底层原理二: (Runtime、Runloop)

客服紫薇:15852074331
在线咨询
客户经理