66 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| pid=$(pidof "hl_linux")
 | |
| libpath=$(realpath "libhlcheat.so")
 | |
| 
 | |
| if [ "$pid" == "" ]; then
 | |
|    echo "inject.sh: process not running."
 | |
|    exit 1
 | |
| fi
 | |
| 
 | |
| # Used to echo the command. For debugging.
 | |
| #set -x
 | |
| 
 | |
| if [ "$1" == "unload" ]; then
 | |
|     sudo gdb -n -q -batch                                   \
 | |
|          -ex "attach $pid"                                  \
 | |
|          -ex "set \$dlopen = (void* (*)(char*, int))dlopen" \
 | |
|          -ex "set \$dlclose = (int (*)(void*))dlclose"      \
 | |
|          -ex "set \$dlerror =  (char* (*)(void))dlerror"    \
 | |
|                                                             \
 | |
|          -ex "set \$self = \$dlopen(\"$libpath\", 6)"       \
 | |
|          -ex "call \$dlclose(\$self)"                       \
 | |
|          -ex "call \$dlclose(\$self)"                       \
 | |
|                                                             \
 | |
|          -ex "call \$dlerror()"                             \
 | |
|          -ex "detach"                                       \
 | |
|          -ex "quit"
 | |
| 
 | |
|     exit 0
 | |
| fi
 | |
| 
 | |
| if grep -q "$libpath" "/proc/$pid/maps"; then
 | |
|     echo -e "goldsource-cheat already loaded. Reloading...\n";
 | |
| 
 | |
|     # 0x2 -> RTLD_NOW
 | |
|     # 0x6 -> RTLD_LAZY | RTLD_NOLOAD
 | |
|     # For more info on the 3 mid lines, see self_unload() in main.c
 | |
|     sudo gdb -n -q -batch                                   \
 | |
|          -ex "attach $pid"                                  \
 | |
|          -ex "set \$dlopen = (void* (*)(char*, int))dlopen" \
 | |
|          -ex "set \$dlclose = (int (*)(void*))dlclose"      \
 | |
|          -ex "set \$dlerror =  (char* (*)(void))dlerror"    \
 | |
|                                                             \
 | |
|          -ex "set \$self = \$dlopen(\"$libpath\", 6)"       \
 | |
|          -ex "call \$dlclose(\$self)"                       \
 | |
|          -ex "call \$dlclose(\$self)"                       \
 | |
|                                                             \
 | |
|          -ex "call \$dlopen(\"$libpath\", 2)"               \
 | |
|          -ex "call \$dlerror()"                             \
 | |
|          -ex "detach"                                       \
 | |
|          -ex "quit"
 | |
| else
 | |
|     sudo gdb -n -q -batch                                   \
 | |
|          -ex "attach $pid"                                  \
 | |
|          -ex "set \$dlopen = (void* (*)(char*, int))dlopen" \
 | |
|          -ex "set \$dlclose = (int (*)(void*))dlclose"      \
 | |
|          -ex "set \$dlerror =  (char* (*)(void))dlerror"    \
 | |
|          -ex "call \$dlopen(\"$libpath\", 2)"               \
 | |
|          -ex "call \$dlerror()"                             \
 | |
|          -ex "detach"                                       \
 | |
|          -ex "quit"
 | |
| fi
 | |
| 
 | |
| set +x
 | |
| echo -e "\nDone."
 |