SOAdvancedDissector/SOAdvancedDissector.sh

76 lines
1.8 KiB
Bash
Executable File

#!/bin/bash
function check_tool()
{
tool=$1
cmd=$2
a=`${cmd} 2>/dev/null`
if [ ! $? -eq 0 ] ; then
echo "${tool} is missing"
exit 1
fi
}
function check_tools()
{
check_tool "readelf" "readelf --version"
check_tool "objdump" "objdump --version"
check_tool "c++filt" "c++filt --version"
if [ ! -e ./vtable-dumper ] ; then
check_tool "git" "git --version"
check_tool "make" "make --version"
check_tool "g++" "g++ --version"
fi
}
TARGET=$1
target=`basename ${TARGET}`
readelf_target="${target}.readelf"
sections_target="${target}.sections"
vtable_target="${target}.vtable"
if [ ! -f "${TARGET}" ] ; then
echo "$0 <target>"
exit 1
fi
check_tools
if [ ${TARGET} -nt ${readelf_target} ] ; then
echo "Regenerating ${readelf_target}"
readelf -sW ${TARGET}|c++filt > ${readelf_target}
fi
if [ ${TARGET} -nt ${sections_target} ] ; then
echo "Regenerating ${sections_target}"
readelf --sections ${TARGET}|c++filt > ${sections_target}
fi
VTABLE_ARG="-V ${vtable_target}"
if [ ${TARGET} -nt ${vtable_target} ] ; then
echo objdump -d ${TARGET}
objdump -d ${TARGET} >/dev/null 2>&1
if [ ! $? -eq 0 ]; then
echo "Unable to do objdump, maybe ${TARGET} is for another platform"
VTABLE_ARG=""
else
if [ ! -e ./vtable-dumper/vtable-dumper ] ; then
git clone https://github.com/soutade/vtable-dumper.git || exit 1
cd ./vtable-dumper
make
cd -
fi
if [ -x ./vtable-dumper/vtable-dumper ] ; then
echo "Regenerating ${vtable_target}"
./vtable-dumper/vtable-dumper -demangled ${TARGET}|c++filt > ${vtable_target}
else
echo "./vtable-dumper not available"
VTABLE_ARG=""
fi
fi
fi
./SOAdvancedDissector.py -f ${TARGET} -S ${readelf_target} -s ${sections_target} ${VTABLE_ARG} -c