얼마 전, 내가 사용하는 기능에 영향을 주지 않고 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
, 파일인 경우 라이브러리인지 실행 파일인지 확인하기 위해 더 깊이 파고듭니다.
쉘 스크립트에서 $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
미래가 보여요^^