前段时间,当我正在寻找一种方法来找出可以从 Android ROM 中删除哪些内容而不影响我使用的功能时,我deptree
在xda forums
.由于这是 2012 年写的,因此无法按预期工作。更新使用的工具(dex2jar
、smali
、...
)加上对脚本的一些细微更改(例如将文件夹更改为Android
现在使用的文件夹,例如),system/app-private
然后system/priv-app/*/
我再次运行它。
部分魔法发生在与此类似的三个脚本中:
while [ -n "$1" ]; do
for bin in "$1"/*; do
[ -f "$bin" ] || continue
case "$bin" in
*.so)
;;
*)
[ -x "$bin" ] || continue
;;
esac
"$FILE_DIR/perls/parse_bin.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_bin.log"
done
shift
done
通过利用我从未学过编码的超能力,我总结出这里会发生以下事情(如果我有什么问题,你可以纠正我):
- 访问输入文件夹时
$1
, - 每个
bin(ary)
文件都会得到 - 检查它是否真的是一个
binary
文件,如果是的话,
(我不知道代表什么||
) - 它检查扩展名(
.so
或none
)并且 - 使用找到的文件(
*.so
以及没有扩展名的文件)作为脚本的输入parse_bin.pl
输入文件夹必须非常具体,对于这个脚本来说,这些是
$ACTIVE_DB/rom/system/lib $ACTIVE_DB/rom/system/lib/*/ $ACTIVE_DB/rom/system/usr/lib you get how this continues, super long list of folders
我想知道的是,我必须如何修改这三个脚本以便输入文件夹是$ACTIVE_DB/rom/system
?
编辑:在输入文件夹中查找文件的机制在所有三个脚本中都是相同的,除了其他两个脚本正在搜索*.jar
和*.apk
EDIT2:bash
外壳被用来运行这个
我知道这必须发生在脚本的前两行中,我已经尝试过fromnaboo
答案这里它会吐出文件夹内的每个二进制文件$ACTIVE_DB/rom
,但不会将它们作为输入传递给parse_bin.pl
.
请有日志:
+ PARSE_BIN DB_45763/rom/system
+ '[' -n DB_45763/rom/system ']'
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/CSCVersion.txt ']'
+ case "$bin" in
+ '[' -x DB_45763/rom/system/CSCVersion.txt ']'
+ printf 'DB_45763/rom/system/CSCVersion.txt:\t'
+ echo DB_45763/rom/system/CSCVersion.txt
+ ./files/perls/parse_bin.pl DB_45763/rom/system/CSCVersion.txt dbi:SQLite:dbname=DB_45763/test.sqlite
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/app ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/bin ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/build.prop ']'
+ case "$bin" in
+ '[' -x DB_45763/rom/system/build.prop ']'
+ printf 'DB_45763/rom/system/build.prop:\t'
+ echo DB_45763/rom/system/build.prop
+ ./files/perls/parse_bin.pl DB_45763/rom/system/build.prop dbi:SQLite:dbname=DB_45763/test.sqlite
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/cameradata ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/csc ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/csc_contents ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/etc ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/fonts ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/framework ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/kern_sec_info ']'
+ case "$bin" in
+ '[' -x DB_45763/rom/system/kern_sec_info ']'
+ printf 'DB_45763/rom/system/kern_sec_info:\t'
+ echo DB_45763/rom/system/kern_sec_info
+ ./files/perls/parse_bin.pl DB_45763/rom/system/kern_sec_info dbi:SQLite:dbname=DB_45763/test.sqlite
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/lib ']'
+ continue
+ shift
+ '[' -n '' ']'
答案1
首先,您对脚本功能的假设似乎是正确的。它会查看在 中找到的所有文件、文件夹、符号链接等$1
,如果它是文件,则它会更深入地确定它是库还是可执行文件。
在 shell 脚本中,$1
这是传递给脚本的第一个参数,因此要$ACTIVE_DB/rom/system
在您的位置运行此脚本$1
,只需使用
./scriptname $ACTIVE_DB/rom/system
注意:如果您从命令提示符调用此命令,$ACTIVE
则必须替换实际路径。
为了使该脚本递归地下降到目标目录中,您可以尝试将其添加到脚本中
while [ -n "$1" ]; do
# use globbing to descend into all subdirectories
for bin in $(find "$1" | tr '\n' ' '); do
# change this ^^^^
[ -f "$bin" ] || continue
# leave the rest of the script as is
# ....
答案2
因此,如果有人想知道我做了什么,这是目前的代码。
感谢@the_velour_fog 帮助我。
如果有人认为这是最糟糕的解决方案
(我也不认为它超级性感,但它做了它必须做的事情),请把他们带到这里。
while [ -n "$1" ]; do
for bin in $(find "$1"); do
[ -f "$bin" ] || continue
case "$bin" in
*.so)
export start=$(date +"%T")
printf "$bin:\t"
echo -n "$start " >>"$ACTIVE_DB/logs/parse_bin.log"
echo "$bin" >>"$ACTIVE_DB/logs/parse_bin.log"
"$FILE_DIR/perls/parse_bin.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_bin.log"
;;
*.jar)
export start=$(date +"%T")
printf "$bin:\t"
echo -n "$start " >>"$ACTIVE_DB/logs/parse_jar.log"
echo "$bin" >>"$ACTIVE_DB/logs/parse_jar.log"
"$FILE_DIR/perls/parse_jar.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_jar.log"
;;
*.apk)
export start=$(date +"%T")
printf "$bin:\t"
echo -n "$start " >>"$ACTIVE_DB/logs/parse_apk.log"
echo "$bin" >>"$ACTIVE_DB/logs/parse_apk.log"
"$FILE_DIR/perls/parse_apk.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_apk.log"
;;
*)
if [ -x "$bin" ] ; then
export start=$(date +"%T")
printf "$bin:\t"
echo -n "$start " >>"$ACTIVE_DB/logs/parse_bin.log"
echo "$bin" >>"$ACTIVE_DB/logs/parse_bin.log"
"$FILE_DIR/perls/parse_bin.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_bin.log"
else
continue
fi
;;
esac
done
shift
done
据我目前所知,这是可行的,但我对最后这部分很不确定
*)
if [ -x "$bin" ] ; then
export start=$(date +"%T")
printf "$bin:\t"
echo -n "$start " >>"$ACTIVE_DB/logs/parse_bin.log"
echo "$bin" >>"$ACTIVE_DB/logs/parse_bin.log"
"$FILE_DIR/perls/parse_bin.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_bin.log"
else
continue
fi
未来将会展现^^