int hook_libdl(const char *libpath) { void *handle, *original; handle = dlopen(libpath, RTLD_LAZY); if(handle == NULL) return -1; // original = elf_hook(libpath, LIBRARY_ADDRESS_BY_HANDLE(handle), "dlopen", (const void *) hook_dlopen); if(original == NULL) return -1; // original = elf_hook(libpath, LIBRARY_ADDRESS_BY_HANDLE(handle), "dlsym", (const void *) hook_dlsym); if(original == NULL) return -1; // return 0; }
int hook_lib_generic(const char *libpath, void *handle, const char *name, void *func) { void *original; if(handle == NULL) return -1; original = elf_hook(libpath, LIBRARY_ADDRESS_BY_HANDLE(handle), name, (const void *) func); if(original == NULL) return -1; ga_error("hook library - %s:%s success.\n", libpath, name); return 0; }
int PbSVLoadModule() { char hash[128]; long unsigned sizeofhash; char modname[256]; char modname_dest[256]; const char* dlname; const char* dlname2; byte* imagebase; if ( pbsv.hLibModule ) { return 0; } PbSvUnload(); if ( FS_FileExistsOSPath( PbSv6makefn(modname, "pbsvnew" DLL_EXT) ) == qtrue ) { Sys_Chmod( PbSv6makefn(modname, "pbsvold" DLL_EXT), 0777); FS_RemoveOSPath( PbSv6makefn(modname, "pbsvold" DLL_EXT) ); rename( PbSv6makefn(modname, "pbsv" DLL_EXT), PbSv6makefn(modname_dest, "pbsvold" DLL_EXT) ); Sys_Chmod( PbSv6makefn(modname, "pbsv" DLL_EXT), 0777); FS_RemoveOSPath( PbSv6makefn(modname, "pbsv" DLL_EXT) ); rename( PbSv6makefn(modname, "pbsvnew" DLL_EXT), PbSv6makefn(modname_dest, "pbsv" DLL_EXT) ); } if(com_securemode) { dlname = PbSv6makefn(modname, "pbag" DLL_EXT); dlname2 = PbSv6makefn(modname_dest, "pbags" DLL_EXT); if ( FS_FileExistsOSPath( dlname ) == qtrue ) { FS_RemoveOSPath( dlname2 ); rename( dlname ,dlname2 ); FS_RemoveOSPath( dlname ); } hash[0] = '\0'; sizeofhash = sizeof(hash); Sec_HashFile(SEC_HASH_TIGER, dlname2, hash, &sizeofhash, qfalse); if(Q_stricmp(hash ,PBAG_HASH)) { Com_Printf("Tiger = %s\n", hash); Com_PrintError("%s checksum missmatch! PunkBuster will not startup in securemode when the checksum is invalid.\n", dlname2); return 1; } dlname = PbSv6makefn(modname, "pbcl" DLL_EXT); dlname2 = PbSv6makefn(modname_dest, "pbcls" DLL_EXT); if ( FS_FileExistsOSPath( dlname ) == qtrue ) { FS_RemoveOSPath( dlname2 ); rename( dlname ,dlname2 ); FS_RemoveOSPath( dlname ); } hash[0] = '\0'; sizeofhash = sizeof(hash); Sec_HashFile(SEC_HASH_TIGER, dlname2, hash, &sizeofhash, qfalse); if(Q_stricmp(hash ,PBCL_HASH)) { Com_Printf("Tiger = %s\n", hash); Com_PrintError("%s checksum missmatch! PunkBuster will not startup in securemode when the checksum is invalid.\n", dlname2); return 1; } dlname2 = PbSv6makefn(modname, "pbsv" DLL_EXT); hash[0] = '\0'; sizeofhash = sizeof(hash); Sec_HashFile(SEC_HASH_TIGER, dlname2, hash, &sizeofhash, qfalse); if(Q_stricmp(hash ,PBSV_HASH)) { Com_Printf("Tiger = %s\n", hash); Com_PrintError("%s checksum missmatch! PunkBuster will not startup in securemode when the checksum is invalid.\n", dlname2); return 1; } } dlname = PbSv6makefn(modname, "pbsv" DLL_EXT); pbsv.hLibModule = Sys_LoadLibrary( dlname ); if ( pbsv.hLibModule == NULL ) { return 1; } if(com_securemode) { /* Remove system() */ imagebase = LIBRARY_ADDRESS_BY_HANDLE( pbsv.hLibModule ); if(Sys_MemoryProtectWrite( (void*)(imagebase + 0x4c6e0), 0xdfdf7 ) == qfalse) { return 1; } SetCall((DWORD)(imagebase + 0x114346), PB_SystemDummy); SetCall((DWORD)(imagebase + 0xc23cb), PB_SystemDummy); if(Sys_MemoryProtectExec( (void*)(imagebase + 0x4c6e0), 0xdfdf7 ) == qfalse) { return 1; } } pbsv.sa = Sys_GetProcedure( "sa" ); pbsv.sb = Sys_GetProcedure( "sb" ); if ( pbsv.sa && pbsv.sb ){ pbsv.wantdisable = 0; return 0; }else{ PbSvUnload(); return 1; } }