mirror of https://github.com/fspc/gbootroot.git
Browse Source
automates the recognition of whether or not the host kernel has the skas patch applied. Makefile edits itself, and all gui is automated.master
freesource
22 years ago
7 changed files with 218 additions and 9 deletions
@ -0,0 +1,19 @@ |
|||||
|
CC=gcc |
||||
|
CFLAGS=-Wall -O2 |
||||
|
|
||||
|
SRC=skas-or-tt.c |
||||
|
OBJS=$(patsubst %.c,%.o, $(SRC)) |
||||
|
|
||||
|
|
||||
|
all: skas-or-tt |
||||
|
|
||||
|
skas-or-tt: $(OBJS) |
||||
|
$(CC) $(CFLAGS) -o $@ $(OBJS) -o $@ |
||||
|
|
||||
|
$(OBJS): %.o : %.c |
||||
|
$(CC) $(CFLAGS) -c $< -o $@ |
||||
|
|
||||
|
$(OBJS): Makefile |
||||
|
|
||||
|
clean: |
||||
|
rm -f *.o *.a core skas-or-tt |
@ -0,0 +1,141 @@ |
|||||
|
/*
|
||||
|
skas_or_tt Copyright (C) 2003 |
||||
|
Jonathan Rosenbaum <freesource@users.sourceforge.net> |
||||
|
|
||||
|
A program to check for the existence of the skas patch in the host |
||||
|
kernel and /proc/mm. Basically borrowed/simplified from jdike's |
||||
|
process.c. This is a good way to learn about clone() and ptrace(). |
||||
|
*/ |
||||
|
|
||||
|
#include <stdio.h> |
||||
|
#include <unistd.h> |
||||
|
#include <errno.h> |
||||
|
#include <wait.h> |
||||
|
#include <sys/mman.h> /* for mmap */ |
||||
|
#include <sys/ptrace.h> |
||||
|
#include <sys/types.h> |
||||
|
#include <sched.h> /* clone */ |
||||
|
#define PTRACE_FAULTINFO 52 |
||||
|
#define PAGE_SIZE 1024 |
||||
|
|
||||
|
int main(void) |
||||
|
{ |
||||
|
|
||||
|
int n, pid, ret = 1; |
||||
|
void *stack; |
||||
|
|
||||
|
struct ptrace_faultinfo { |
||||
|
int is_write; |
||||
|
unsigned long addr; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
struct ptrace_faultinfo fi; |
||||
|
|
||||
|
printf("Checking for the skas3 patch in the host..."); |
||||
|
pid = start_ptraced_child(&stack); |
||||
|
|
||||
|
n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi); |
||||
|
if(n < 0){ |
||||
|
if(errno == EIO) |
||||
|
printf("not found\n"); |
||||
|
else printf("No (unexpected errno - %d)\n", errno); |
||||
|
ret = 0; |
||||
|
} |
||||
|
else printf("found\n"); |
||||
|
|
||||
|
|
||||
|
printf("Checking for /proc/mm..."); |
||||
|
if(access("/proc/mm", W_OK)){ |
||||
|
printf("not found\n"); |
||||
|
ret = 0; |
||||
|
} |
||||
|
else printf("found\n"); |
||||
|
|
||||
|
kill(pid, SIGKILL); |
||||
|
return(ret); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
int threadFunction( void* argument ) |
||||
|
{ |
||||
|
printf( "child thread exiting\n" ); |
||||
|
exit(0); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int os_getpid(void) |
||||
|
{ |
||||
|
return(getpid()); |
||||
|
} |
||||
|
|
||||
|
void os_stop_process(int pid) |
||||
|
{ |
||||
|
kill(pid, SIGSTOP); |
||||
|
} |
||||
|
|
||||
|
void os_kill_process(int pid, int reap_child) |
||||
|
{ |
||||
|
kill(pid, SIGKILL); |
||||
|
if(reap_child) |
||||
|
waitpid(pid, NULL, 0); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
static int ptrace_child(void *arg) |
||||
|
{ |
||||
|
int pid = os_getpid(); |
||||
|
|
||||
|
if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0){ |
||||
|
perror("ptrace"); |
||||
|
os_kill_process(pid, 0); |
||||
|
} |
||||
|
|
||||
|
os_stop_process(pid); |
||||
|
_exit(os_getpid() == pid); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
int start_ptraced_child(void **stack_out) |
||||
|
{ |
||||
|
void *stack; |
||||
|
unsigned long sp; |
||||
|
int pid, n, status; |
||||
|
|
||||
|
stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, |
||||
|
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); |
||||
|
if(stack == MAP_FAILED) |
||||
|
printf("check_ptrace : mmap failed, errno = %d", errno); |
||||
|
sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *); |
||||
|
pid = clone(ptrace_child, (void *) sp, SIGCHLD, NULL); |
||||
|
if(pid < 0) { |
||||
|
printf("check_ptrace : clone failed, errno = %d\n", errno); |
||||
|
exit(0); |
||||
|
} |
||||
|
n = waitpid(pid, &status, WUNTRACED); |
||||
|
if(n < 0) { |
||||
|
printf("check_ptrace : wait failed, errno = %d\n", errno); |
||||
|
exit(0); |
||||
|
} |
||||
|
if(!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGSTOP)) { |
||||
|
printf("check_ptrace : expected SIGSTOP, got status = %d\n", |
||||
|
status); |
||||
|
exit(0); |
||||
|
} |
||||
|
*stack_out = stack; |
||||
|
return(pid); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
* Overrides for Emacs so that we follow Linus's tabbing style. |
||||
|
* Emacs will notice this stuff at the end of the file and automatically |
||||
|
* adjust the settings for this buffer only. This must remain at the end |
||||
|
* of the file. |
||||
|
* --------------------------------------------------------------------------- |
||||
|
* Local variables: |
||||
|
* c-file-style: "linux" |
||||
|
* End: |
||||
|
*/ |
Loading…
Reference in new issue