介绍
有时候需要给一个已有的app注入一个动态库,来hook某些函数,从而修改app的某些行为,或者给app增加一些功能等。
下面这个脚本可以将一个动态库或framework注入到一个app中
#!/bin/bash
function usage()
{
echo 'usage: inject-dylib.sh file.app libxxx.dylib'
echo ' inject-dylib.sh file.app xxx.framework'
exit 1
}
function abspath()
{
echo "$(cd $(dirname "$1"); pwd)/$(basename "$1")"
}
if test $# -ne 2
then
usage
fi
# app绝对路径
apppath=$(abspath "$1")
# app文件名
appname=$(basename $apppath)
# 可执行文件名
execname="${appname%.*}"
# 可执行文件绝对路径
execpath="$apppath/$execname"
# 动态库绝对路径
dylibpath=$(abspath "$2")
# 动态库文件名
dylibname=$(basename "$dylibpath")
# 动态库扩展名
dylibext="${dylibname##*.}"
# 动态库目的路径
dylibdstpath="$apppath/Frameworks"
mkdir -p "$dylibdstpath"
cp -fR "$dylibpath" "$dylibdstpath" || exit 1
if [ $dylibext = 'dylib' ]
then
rpath="@rpath/$dylibname"
elif [ $dylibext = 'framework' ]
then
binname="${dylibname%.*}"
rpath="@rpath/$dylibname/$binname"
else
usage
fi
# https://github.com/alexzielenski/optool
optool install -c load -p "$rpath" -t "$execpath"
这个脚本使用optool,所以要先安装这个工具,比如放在/usr/local/bin
目录下
因为是非越狱环境,所以注入后需要重新签名才能安装到手机上运行