SHELL脚本、用户组和文件权限、代码注入

SHELL脚本

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

查看shell

在iTerm2中先cd /private/etc到这个目录下,里面有很多文件,其中就有一个叫shells文件,查看cat shells

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

Sh:Bourne Shell(即sh)是UNIX最初使用的shell,平且在每种UNIX上都可以使用。Bourne Shell在shell编程方便相当优秀,但在处理与用户的交互方便作得不如其他几种shell。
BashUnix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell,是Bourne Shell的扩展,简称bash,与Bourne Shell完全兼容,并且在Bourne Shell的基础上增加,增强了很多特性。可以提供命令补全,命令编辑和命令历史等功能。它还包含了很多C Shell和Korn Shell中的优点,有灵活和强大的编辑接口,同时又很友好的用户界面。
Csh:C shell 是一个交互式命令解释器和一种命令编程语言,采用的语法类似于 C 编程语言。shell 是交互式地从终端键盘或者是从一个文件来执行命令的。这个 csh 命令调用了 C shell。
Tcsh:tcsh是csh的增强版,并且完全兼容csh。它不但具有csh的全部功能,还具有命令行编辑、拼写校正、可编程字符集、历史纪录、作业控制等功能,以及C语言风格的语法结构。
Ksh:Korn Shell集合了C Shell和Bourne Shell的优点并且和Bourne Shell完全兼容。Linux系统提供了pdksh(ksh的扩展),它支持人物控制,可以在命令行上挂起,后台执行,唤醒或终止程序。
Zsh:是基于ksh开发的,功能更加多,可以自己定制。

脚本执行相关命令

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

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

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

用户、组、权限

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

Windows的目录结构:


image.png

Linux的目录结构:


image.png

Linux分了多用户,每个用户有自己的桌面和文档等,每个用户都不相同,并且只能在自己的目录下玩,除非你有超级权限,才能访问别的用户下面的目录,这样就更加安全。

Mac文件属性

image.png
文件类型与权限(permission)
改变权限: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 文件名
数字和权限对应

注意:
这里数字权限采用的是位移枚举。当有多种选项,并且可以叠加的时候,就用位移枚举(1,2,4,8…),这就是位移枚举:
1 0001 2^0 1<<0 往左移0位
2 0010 2^1 1<<1 往左移1位
4 0100 2^2 1<<2 往左移2位
因为位移枚举不同的数叠加的结果也是不相同的,方便一些计算。

  • 符号类型:
    chmod [u、g、o、a] [+(加入)、-(除去)、=(设置)] [r、w、x] 文件名称
    如下:
    $chmod +x 123.sh : 当不写的时候,就是默认给a加,也就是all,即所有用户
    $chmod o+x 123.txt 给other增加执行权限
    注意:
    这里的 o+x 必须要连着写

代码注入

脚本自动重签

我们上面了解了shell脚本,下面我们可以利用shell脚本对越狱的APP包,实现自动重新签名。步骤如下:

1、首先新建一个工程,名字随便取,先真机运行,将描述文件装到手机上。

2、
image.png
  • 如上图,在工程目录下新建一个APP文件夹,并将越狱APP的包放进去。至于为什么要新建APP文件,并且放的是越狱APP的.ipa包,因为app.sh里面的脚本是这样写的,如果要改,就需要对应的改脚本内容
  • 导入写好的app.sh脚本,签名的步骤还是和前面文章中的手动签名一样,只是写成了脚本的方式,脚本内容如下:
# ${SRCROOT} 它是工程文件所在的目录
TEMP_PATH="${SRCROOT}/Temp"
#资源文件夹,我们提前在工程目录下新建一个APP文件夹,里面放ipa包
ASSETS_PATH="${SRCROOT}/APP"
#目标ipa包路径
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
#清空Temp文件夹
rm -rf "${SRCROOT}/Temp"
mkdir -p "${SRCROOT}/Temp"

#----------------------------------------
# 1. 解压IPA到Temp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解压的临时的APP的路径
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# echo "路径是:$TEMP_APP_PATH"

#----------------------------------------
# 2. 将解压出来的.app拷贝进入工程下
# BUILT_PRODUCTS_DIR 工程生成的APP包的路径
# TARGET_NAME target名称
TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
echo "app路径:$TARGET_APP_PATH"

rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"

#----------------------------------------
# 3. 删除extension和WatchAPP.个人证书没法签名Extention
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"

#----------------------------------------
# 4. 更新info.plist文件 CFBundleIdentifier
#  设置:"Set : KEY Value" "目标文件路径"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"

#----------------------------------------
# 5. 给MachO文件上执行权限
# 拿到MachO文件的路径WeChat,拿到info.plist中二进制对应的Key
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#上可执行权限
chmod +x "$TARGET_APP_PATH/$APP_BINARY"

#----------------------------------------
# 6. 重签名第三方 FrameWorks 判断Frameworks是否有值,有就循环签名,没有就不签
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do


#签名 "$EXPANDED_CODE_SIGN_IDENTITY" 这个相当于证书名称  "$FRAMEWORK" 这个相当于Frameworks的名称
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi

#注入 用脚本注入自定义库
yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/HankHook.framework/HankHook"

3、
image.png
  • 如上图,在工程的targets的Build Phases里面添加Run Script脚本。
  • shell随便用哪个都可以,可以是sh,也可以说zsh,也可以是bash等。
  • 注意,这里最好加上chmod +x app.sh这句,给app.sh可执行权限,不然就手动在终端里面给它加上可执行权限。./app.sh是执行这个脚本的意思,如果路径不对,可以换成这个${SRCROOT}/app.sh,也是执行这个脚本的意思。

最后运行工程就行。

代码注入

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

应用执行代码,一般会执行下面三个,我们想要应用执行自己的代码,就可以选择第二种方式。

  • MachO (改二进制文件)
  • Frameworks (加一个三方库)
  • 系统库 (不好改)

注入原理:dylb加载machO文件,也就是主程序,里面有一个Load Commands列出来所有要依赖的三方库,列出来的都会去加载,注入就是注入一个我们自己的库到Frameworks中。

Framwork注入

Framwork注入也是最常用的一种,因为它本身就是iOS环境下的。

1、
image.png

如上图,通过Xcode新建Framwork,然后运行工程,Xcode就将新建的Framwork库安装进入APP包的Framworks文件下。

2、使用工具yololib注入Framwork库路径。终端命令:$yololib(空格)MachO文件路径(空格)库路径
也可以写在刚刚上面的app.sh的脚本中:

yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/HankHook.framework/HankHook"
  • 所有的Framwork加载都是由DYLD加载进入内存被执行的
  • 注入成功的库路径会写入到MachO文件的LC_LOAD_DYLIB字段中
Dylib注入

1、通过Xcode新建Dylib库(注意:Dylib属于MacOS所以需要修改属性)


新建Dylib库

修改属性

修改属性

如果是Xcode11以下需要将这里选择为iOS Developer

2、添加Target依赖,让Xcode将自定义Dylib文件打包进入APP包。


添加依赖

只有添加了依赖,当运行工程的时候,才会将dylib文件加载到Framworks文件下。

3、使用工具yololib注入Framwork库路径。终端命令:$yololib(空格)MachO文件路径(空格)库路径
也可以写在刚刚上面的app.sh的脚本中:

yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libHankHook.dylib"

注意:路径和上面用Framework注入的路径不一样了

如果运行的时候报:image not found

所以的machO文件都叫image,所以很有可能是注入的库,没有到APP包的Framworks中去,可以clean一下Xcode,再重新运行,或者重新注入。
如果报这个错误,那么Load Commands中肯定有找不到的这个库,所以它才会去找。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,374评论 0 5
  • 什么是Shell     简单来说Shell其实就是一个命令解释器,而它的作用就是解释并执行用户输入的命令及程序。...
    Surpassme阅读 2,711评论 1 24
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,729评论 0 10
  • 概念和原理 Shell是什么? Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。 Sh...
    陵无山阅读 3,544评论 0 27
  • 第 2 章 SHELL 基础知识2.1 shell脚本我们在上面简单介绍了一下什么是shell脚本,现在我们来进一...
    LiWei_9e4b阅读 1,561评论 0 0