lindows/scripts/mkhive

189 lines
3.2 KiB
Bash
Executable File

#!/bin/bash
# PARAM 1: PATH
SHITFILE="$(mktemp)"
HIVEPATH="$1";
# chararr length, format, args...
function chararr() {
printf "$2" "${@:3}" > "$SHITFILE";
truncate "$SHITFILE" -s "$1";
cat "$SHITFILE" >> "$HIVEPATH";
}
# wchararrle length, format, args
function wchararrle() {
printf "$2" "${@:3}" | iconv -t utf-16le > "$SHITFILE";
truncate "$SHITFILE" -s "$1";
cat "$SHITFILE" >> "$HIVEPATH";
}
# i1le value
function i1le() {
printf "\\$(printf "%o" $(( $1 & 255 )))" >> "$HIVEPATH";
}
# i2le value
function i2le() {
I1=$(printf "%o" $((($1 >> 8) & 255 )));
I0=$(printf "%o" $((($1 ) & 255 )));
printf "\\$I0\\$I1" >> "$HIVEPATH";
}
# i4le value
function i4le() {
I3=$(printf "%o" $((($1 >> 24 ) & 255 )) );
I2=$(printf "%o" $((($1 >> 16 ) & 255 )) );
I1=$(printf "%o" $((($1 >> 8 ) & 255 )) );
I0=$(printf "%o" $((($1 ) & 255 )) );
printf "\\$I0\\$I1\\$I2\\$I3" >> "$HIVEPATH";
}
# i8le value
function i8le() {
C1=$(( $1 >> 32 ));
C0=$(( $1 & 4294967295 ));
i4le $C0;
i4le $C1;
}
# i1lea values...
function i1lea() {
while [ -v 1 ]; do
i1le $1;
shift;
done;
}
# i2lea values...
function i2lea() {
while [ -v 1 ]; do
i2le $1;
shift;
done;
}
# i4lea values...
function i4lea() {
while [ -v 1 ]; do
i4le $1;
shift;
done
}
# i8lea values...
function i8lea() {
while [ -v 1 ]; do
i8le $1;
shift;
done
}
# pad count
function pad() {
>"$SHITFILE";
truncate -s "$1" "$SHITFILE";
cat "$SHITFILE" >> "$HIVEPATH";
}
if [ -n "$HIVEPATH" ]; then
echo "MAKE HIVE AT $1";
# clear file
>test.dat
# base block
chararr 4 "regf"
i4lea 0 0
i8le 0
i4lea 1 6 0 1 352 4096 0
wchararrle 64 "%s" "$(basename "$HIVEPATH")"
pad 396
for w in $(hexdump "$HIVEPATH" -v -e '"%i\n"'); do
if [ ! -v CHKSUM ]; then
CHKSUM=$w;
else
CHKSUM=$(( $CHKSUM ^ $w ));
fi
done
i4le $CHKSUM # checksum but fuck you we dont check the sum
pad 3576
i4lea 0 0
# hive bin
chararr 4 "hbin"
i4lea 0 4096
i8lea 0 0
i4le 0
# LRSS hive bin data block
i4le -16
chararr 2 "Ld" # (!) non standard
i1le 1 # The tree alloc list be invalid
i1le 0 # reserved
i4le 1 # number of 4096 byte chunks (alloc list byte length is this * 128 + 24)
i4le 48 # offset from bin start to alloc list
# LRSS hive bin alloc list
i4le -152
chararr 2 "La" # (!) non standard
pad 2
i2lea 70 71 73 77 85 101 133 # alloc list offsets
pad 130
for (( i=0; i < 19 ; i++ )); do
i8le 4294967288;
done
# root key
i4le -80
chararr 2 "nk"
i2le 0
i8le 0
i4le 0
i4le 0
i4le 0
i4le 0
i4le 432
i4le 0
i4le 0
i4le 0
i4le 440
i4le 0
i4le 0
i4le 0
i4le 0
i4le 0
i4le 0
i2le 0
i2le 0
# root key subkeys
i4le -8
chararr 2 "li"
i2le 0
# root key security info B)
i4le -24
chararr 2 "sk"
i2le 0
i4le 440 # fuck the header just link to ourself, this will surely have no consequences in the future
i4le 440
i4le 1 # referenced by root key
i4le 0 # descriptor length
# fill with empty cells
for (( i=$(( (8192 - $(wc -c "$HIVEPATH" | cut -f 1 "-d ")) / 8 )); i > 0; i-- )); do
i4lea 8 0;
done
else
echo "ERR: Hive path not specified";
fi
rm "$SHITFILE"