感谢hank老师
上一章我们讲了应用签名原理和重签名原理,不再赘述,没有看过的同学可以点这里——
这章概述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的安装文件,可以留言。