############################################################# # During Make.... gcc -g -Wall -fPIC -Isdk -c init.c init.c:14: warning: initialization makes integer from pointer without a cast init.c: In function 'isCurrentProcess': init.c:42: warning: implicit declaration of function 'basename' init.c:42: warning: passing argument 1 of 'strcmp' makes pointer from integer without a cast gcc -g -Wall -fPIC -Isdk -c hook.c hook.c: In function 'inithooks': hook.c:24: warning: cast to pointer from integer of different size gcc -ldl -shared -s -fPIC /usr/lib/libghf.a init.o hook.o -o fusion.so ############################################################# ############################################################# # Makefile CC = gcc LD = gcc CFLAGS = -g -Wall -fPIC -Isdk LDFLAGS = -ldl -shared -s -fPIC $(DETOURLIBS) RM = /bin/rm -f DETOURLIBS = /usr/lib/libghf.a OBJS = init.o hook.o PROG = fusion.so # Main rule all: $(PROG) # Link $(PROG): $(OBJS) $(LD) $(LDFLAGS) $(OBJS) -o $(PROG) init.o: init.c $(CC) $(CFLAGS) -c init.c hook.o: hook.c $(CC) $(CFLAGS) -c hook.c clean: $(RM) $(PROG) $(OBJS) ############################################################# ############################################################# # fusion.h #include #include #include #include #include #include #include "src/qcommon/vm_local.h" /* Defines */ #define FUSION_VERSION "Icarus" #define TREMULOUS_EXE_NAME "tremulous.x86" #define PROC_SELF_EXE "/proc/self/exe" #define CGAME_QVM_NAME "cgame" #define UI_QVM_NAME "ui" /* Prototypes */ int isCurrentProcess( char *name ); void inithooks(); void *detourFunction(void *orig, void *det); GElf_Sym *getSymbol(char *filename, char *symbol); /* Function typedefs */ typedef vmHeader_t *VM_LoadQVM_t(vm_t *vm, qboolean alloc); /* Detour function declarations */ vmHeader_t *fVM_LoadQVM(vm_t *vm, qboolean alloc); /* Original function declarations */ VM_LoadQVM_t *VM_LoadQVM; ############################################################# ############################################################# # init.c #include "fusion.h" int fusion = NULL; __attribute__ ((constructor)) void fusionStart() { printf("[FUSION] Starting up...\n"); if(isCurrentProcess(TREMULOUS_EXE_NAME)){ printf("[FUSION] \"%s\" initalization started. \n", FUSION_VERSION); printf("[FUSION] Current process match!\n"); inithooks(); } else { printf("[FUSION] Fatal Error: Not a Tremulous executable.\n" ); exit(1); } } int isCurrentProcess( char *name ) { char exeFilename[512]; memset(exeFilename, 0, sizeof(exeFilename)); if(readlink(PROC_SELF_EXE, exeFilename, sizeof(exeFilename)) <= 0) { perror("[FUSION] Fatal Error: Can't find executable! " PROC_SELF_EXE); exit(1); } return !strcmp(basename(exeFilename), name); } ############################################################# ############################################################# # hook.c #include "fusion.h" /* Dynamic vmHeader*/ vmHeader_t vmHeader; /* Main struct pointers */ /* Hook function */ void inithooks() { VM_LoadQVM = (VM_LoadQVM_t *)detourFunction( (void *)getSymbol(NULL, "VM_LoadQVM")->st_value, (void *)fVM_LoadQVM); } vmHeader_t *fVM_LoadQVM(vm_t *vm, qboolean alloc) { vmHeader_t *result = VM_LoadQVM(vm, alloc); if (!strcmp(vm->name, CGAME_QVM_NAME)) vmHeader = *result; return result; } #############################################################