#!/usr/bin/env sh MYDIR="$(dirname ${0})" FN_FILE="${1:-${MYDIR}/ntdll_zw_functions.txt}" TYPEDEFS="" STATICS="" CURLINE=0 while read -r line; do CURLINE=$(expr ${CURLINE} + 1) VALID=1 rtype=$(printf '%s\n' "${line}" | grep -oE '(NTSTATUS NTAPI|VOID NTAPI|PVOID NTAPI)') if [ -z "${rtype}" ]; then printf '%s\n' "Line ${CURLINE}: Missing return value of either type 'NTSTATUS NTAPI' or 'VOID NTAPI'." >&2 VALID=0 fi fnname=$(printf '%s\n' "${line}" | grep -oE '(Zw|Rtl|Ob|Mm|Io)[^ (]*') if [ -z "${fnname}" ]; then printf '%s\n' "Line ${CURLINE}: Missing function name." >&2 VALID=0 fi fnsig=$(printf '%s\n' "${line}" | grep -oE '\([^;]*') if [ -z "${fnsig}" ]; then printf '%s\n' "Line ${CURLINE}: Missing function signature." >&2 VALID=0 fi params_without_braces=$(printf '%s\n' "${fnsig}" | tr -d '()') if [ ! -z "${params_without_braces}" ]; then param_names=$(printf '%s\n' "${params_without_braces}" | sed 's/\([^,]*\)/\1\n/g' | grep -oE '[^ ]*$') if [ -z "${param_names}" ]; then printf '%s\n' "Line ${CURLINE}: Could not parse function parameters." >&2 VALID=0 fi else param_names="" fi params="" for param in ${param_names}; do if [ -z "${param}" ]; then printf '%s\n' "Line ${CURLINE}: Invalid parameter found. Please re-check regex'es used." >&2 VALID=0 fi params="${params}${param}, " done params=$(printf '%s\n' "${params}" | sed 's/^\(.*\), $/\1/g') if [ -z "${params}" -a ! -z "${params_without_braces}" ]; then printf '%s\n' "Line ${CURLINE}: Parameters empty. Please re-check regex'es used." >&2 VALID=0 fi if [ ${VALID} -eq 1 ]; then TYPEDEFS="${TYPEDEFS}\ntypedef ${rtype} (*${fnname}_t) ${fnsig};" STATICS="${STATICS}\nstatic ${fnname}_t _${fnname} = NULL;" INITS=$(cat < #ifdef __cplusplus #define _KERNEL_MODE 1 #include "obfuscate.hpp" extern "C" { #endif EOF echo "${TYPEDEFS}" echo "${STATICS}" cat <