コード例 #1
0
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;
}
コード例 #2
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;
}
コード例 #3
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;
	}

}