189 lines
3.2 KiB
Bash
Executable File
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"
|