mirror of
https://gist.github.com/3793a40dd0c7930f12b79ca1931a3296.git
synced 2025-10-31 13:51:11 -04:00
This commit is contained in:
parent
ef37aa6d64
commit
3b63c55b88
@ -1,10 +1,43 @@
|
|||||||
# extract-updater-rofs
|
# extract-updater-rofs
|
||||||
# Extracts firmware CIAs from ROFS containers for some gigaleak SystemUpdaters.
|
# Extracts firmware CIAs from ROFS containers for some gigaleak SystemUpdaters. Will accept "Contents.cnt" and decrypted "romfs.bin"
|
||||||
# Place in same directory as an extracted "romfs.bin" OR "Contents.cnt"
|
# Usage: ./extract-updater-romfs <input file> (output directory)
|
||||||
|
|
||||||
|
###################################################################################
|
||||||
|
# Set input and output paths
|
||||||
|
###################################################################################
|
||||||
|
OUTPUT_DIR="extract-updater-romfs_output"
|
||||||
|
rm -r "extract-updater-romfs_output"
|
||||||
|
mkdir "extract-updater-romfs_output"
|
||||||
|
ERROR="0"
|
||||||
|
if [ "${1}" != "" ]; then
|
||||||
|
INPUT_FILE="${1}"
|
||||||
|
if [ "${2}" != "" ]; then
|
||||||
|
OUTPUT_DIR="${2}"
|
||||||
|
rm -r "${OUTPUT_DIR}"
|
||||||
|
rm -r "extract-updater-romfs_output"
|
||||||
|
mkdir "${OUTPUT_DIR}"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "ERROR: No input files specified."
|
||||||
|
echo ""
|
||||||
|
echo "./extract-updater-rofs.sh <input> (output dir)"
|
||||||
|
echo ""
|
||||||
|
echo "Note that if the output directory already exists, IT WILL BE DELETED"
|
||||||
|
ERROR=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
###################################################################################
|
||||||
|
# CIA extraction
|
||||||
|
###################################################################################
|
||||||
|
if [ "$ERROR" == "0" ]; then
|
||||||
echo "Finding CIA headers in file..."
|
echo "Finding CIA headers in file..."
|
||||||
od -t x -A d romfs.bin | grep "00002020 00000000 00000a00 00000350" | sed 's/ .*//' | sed 's/^0*//' > romfs-dir.txt
|
# od -t x -A d "${INPUT_FILE}" | grep "00002020 00000000 00000a00 00000350" | sed 's/ .*//' | sed 's/^0*//' > romfs-dir.txt
|
||||||
# Get start address of every CIA header and store to file
|
# Get start address of every CIA header and store to file
|
||||||
|
|
||||||
|
od -t x -A d "${INPUT_FILE}" | grep "00002020 00000000 00000000 00000378" | sed 's/ .*//' | sed 's/^0*//' > romfs-dir.txt
|
||||||
|
# Different header for leftover cnt in "ctr.7z/ctr/sources/firmware/CTR-Kernel/updater1st/UpdaterCardImage/Default/Contents_11_without_shareddate.cnt"
|
||||||
|
# I haven't seen this anywhere else so disable for everything but the above file.
|
||||||
|
|
||||||
echo "Found all headers!"
|
echo "Found all headers!"
|
||||||
echo "================================================="
|
echo "================================================="
|
||||||
|
|
||||||
@ -24,7 +57,7 @@ do
|
|||||||
x=0
|
x=0
|
||||||
while [ "$y" = "00" ]; do
|
while [ "$y" = "00" ]; do
|
||||||
x+=1
|
x+=1
|
||||||
y=$(od -j $((NEXT_HEADER - x)) -N 1 -x -A n romfs.bin | sed 's|[ ,]||g' | sed 's/^..//');
|
y=$(od -j $((NEXT_HEADER - x)) -N 1 -x -A n "${INPUT_FILE}" | sed 's|[ ,]||g' | sed 's/^..//');
|
||||||
# Get bytes one backwards from next header
|
# Get bytes one backwards from next header
|
||||||
# printf '%x\n' $((NEXT_HEADER - x))
|
# printf '%x\n' $((NEXT_HEADER - x))
|
||||||
# echo $y
|
# echo $y
|
||||||
@ -35,7 +68,7 @@ do
|
|||||||
echo "Padding from CIA $i to $((i + 1)) is $((x - 1)) bytes."
|
echo "Padding from CIA $i to $((i + 1)) is $((x - 1)) bytes."
|
||||||
echo " Extract CIA"
|
echo " Extract CIA"
|
||||||
CIA_LENGTH=$(((NEXT_HEADER - START_HEADER) - x + 1))
|
CIA_LENGTH=$(((NEXT_HEADER - START_HEADER) - x + 1))
|
||||||
dd skip=${START_HEADER} count=${CIA_LENGTH} if=romfs.bin of="$i.cia" bs=1
|
dd skip=${START_HEADER} count=${CIA_LENGTH} if="${INPUT_FILE}" of="${OUTPUT_DIR}/$i.cia" bs=1
|
||||||
echo "CIA $i saved as '$i.cia'"
|
echo "CIA $i saved as '$i.cia'"
|
||||||
echo "================================================="
|
echo "================================================="
|
||||||
i+=2
|
i+=2
|
||||||
@ -54,7 +87,7 @@ do
|
|||||||
x=0
|
x=0
|
||||||
while [ "$y" = "00" ]; do
|
while [ "$y" = "00" ]; do
|
||||||
x+=1
|
x+=1
|
||||||
y=$(od -j $((NEXT_HEADER - x)) -N 1 -x -A n romfs.bin | sed 's|[ ,]||g' | sed 's/^..//');
|
y=$(od -j $((NEXT_HEADER - x)) -N 1 -x -A n "${INPUT_FILE}" | sed 's|[ ,]||g' | sed 's/^..//');
|
||||||
# Get bytes one backwards from next header
|
# Get bytes one backwards from next header
|
||||||
# printf '%x\n' $((NEXT_HEADER - x))
|
# printf '%x\n' $((NEXT_HEADER - x))
|
||||||
# echo $y
|
# echo $y
|
||||||
@ -65,7 +98,7 @@ do
|
|||||||
echo "Padding from CIA $i to $((i + 1)) is $((x - 1)) bytes."
|
echo "Padding from CIA $i to $((i + 1)) is $((x - 1)) bytes."
|
||||||
echo " Extract CIA"
|
echo " Extract CIA"
|
||||||
CIA_LENGTH=$(((NEXT_HEADER - START_HEADER) - x + 1))
|
CIA_LENGTH=$(((NEXT_HEADER - START_HEADER) - x + 1))
|
||||||
dd skip=${START_HEADER} count=${CIA_LENGTH} if=romfs.bin of="$i.cia" bs=1
|
dd skip=${START_HEADER} count=${CIA_LENGTH} if="${INPUT_FILE}" of="${OUTPUT_DIR}/$i.cia" bs=1
|
||||||
echo "CIA $i output as '$i.cia', ${CIA_LENGTH} bytes."
|
echo "CIA $i output as '$i.cia', ${CIA_LENGTH} bytes."
|
||||||
CIA_LENGTH=""
|
CIA_LENGTH=""
|
||||||
echo "================================================="
|
echo "================================================="
|
||||||
@ -73,9 +106,10 @@ do
|
|||||||
done
|
done
|
||||||
|
|
||||||
START_HEADER=$( tail -n 1 romfs-dir.txt )
|
START_HEADER=$( tail -n 1 romfs-dir.txt )
|
||||||
NEXT_HEADER=$((16#$(xxd romfs.bin | grep "226e 6f6e 6522" | sed 's/: .*//' | sed 's/^0*//')));
|
NEXT_HEADER=$((16#$(xxd "${INPUT_FILE}" | grep "226e 6f6e 6522" | sed 's/: .*//' | sed 's/^0*//')));
|
||||||
# Find "226e 6f6e 6522" as it is the last predictable data to mark the end of Contents.cnt and the last CIA.
|
# Find "226e 6f6e 6522" as it is the last predictable data to mark the end of Contents.cnt and the last CIA.
|
||||||
# Upsettingly I have to use xxd because od wouldn't turn up any results for this... I liked od's formatting more :despair:
|
# Upsettingly I have to use xxd because od wouldn't turn up any results for this... I liked od's formatting more :despair:
|
||||||
|
|
||||||
if [ $NEXT_HEADER != "" ]; then
|
if [ $NEXT_HEADER != "" ]; then
|
||||||
echo " Check CIA length"
|
echo " Check CIA length"
|
||||||
echo "Final CIA header at ${START_HEADER}"
|
echo "Final CIA header at ${START_HEADER}"
|
||||||
@ -86,7 +120,7 @@ if [ $NEXT_HEADER != "" ]; then
|
|||||||
# Start x as 16 to skip changing data and go right to padding
|
# Start x as 16 to skip changing data and go right to padding
|
||||||
while [ "$y" = "00" ]; do
|
while [ "$y" = "00" ]; do
|
||||||
x+=1
|
x+=1
|
||||||
y=$(od -j $((NEXT_HEADER - x)) -N 1 -x -A n romfs.bin | sed 's|[ ,]||g' | sed 's/^..//');
|
y=$(od -j $((NEXT_HEADER - x)) -N 1 -x -A n "${INPUT_FILE}" | sed 's|[ ,]||g' | sed 's/^..//');
|
||||||
# Get bytes one backwards from next header
|
# Get bytes one backwards from next header
|
||||||
# printf '%x\n' $((NEXT_HEADER - x))
|
# printf '%x\n' $((NEXT_HEADER - x))
|
||||||
# echo $y
|
# echo $y
|
||||||
@ -97,9 +131,11 @@ if [ $NEXT_HEADER != "" ]; then
|
|||||||
echo "Padding from final CIA to Content.cnt end is $((x - 1)) bytes."
|
echo "Padding from final CIA to Content.cnt end is $((x - 1)) bytes."
|
||||||
echo " Extract CIA"
|
echo " Extract CIA"
|
||||||
CIA_LENGTH=$(((NEXT_HEADER - START_HEADER) - x + 1))
|
CIA_LENGTH=$(((NEXT_HEADER - START_HEADER) - x + 1))
|
||||||
dd skip=${START_HEADER} count=${CIA_LENGTH} if=romfs.bin of="0.cia" bs=1
|
dd skip=${START_HEADER} count=${CIA_LENGTH} if="${INPUT_FILE}" of="${OUTPUT_DIR}/0.cia" bs=1
|
||||||
echo "Final CIA output as '0.cia', ${CIA_LENGTH} bytes."
|
echo "Final CIA output as '0.cia', ${CIA_LENGTH} bytes."
|
||||||
echo "================================================="
|
echo "================================================="
|
||||||
echo "All CIAs extracted from RomFS!"
|
echo "All CIAs extracted from RomFS!"
|
||||||
else
|
else
|
||||||
echo "Could not find end of last CIA! For extracting manually, start address is ${START_HEADER} (decimal)"
|
echo "Could not find end of last CIA! For extracting manually, start address is ${START_HEADER} (decimal)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
Loading…
Reference in New Issue
Block a user