Vra

Behalwe die LD_PRELOAD truuk, en Linux Kernel Modules wat 'n sekere siscall vervang met een wat deur jou verskaf word, is daar enige moontlikheid om 'n syscall te onderskep (oop byvoorbeeld), sodat dit eers deur jou funksie gaan, voordat dit die werklike oop bereik?

Was dit nuttig?

Oplossing

As jy regtig 'n oplossing moet jy dalk belangstel in die NG rootkit wat accomplishes net hierdie, wees http://www.immunityinc.com/downloads/linux_rootkit_source.tbz2 die artikel oor dit hier http://www.theregister.co.uk/2008/09/04/linux_rootkit_released/

Ander wenke

Hoekom kan/wil jy nie die LD_PRELOAD truuk?

Voorbeeld kode hier:

/*
 * File: soft_atimes.c
 * Author: D.J. Capelis
 *
 * Compile:
 * gcc -fPIC -c -o soft_atimes.o soft_atimes.c
 * gcc -shared -o soft_atimes.so soft_atimes.o -ldl
 *
 * Use:
 * LD_PRELOAD="./soft_atimes.so" command
 *
 * Copyright 2007 Regents of the University of California
 */

#define _GNU_SOURCE
#include <dlfcn.h>
#define _FCNTL_H
#include <bits/fcntl.h>

extern int errorno;

int (*_open)(const char * pathname, int flags, ...);
int (*_open64)(const char * pathname, int flags, ...);

int open(const char * pathname, int flags, mode_t mode)
{
    _open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open");
    if(flags & O_CREAT)
        return _open(pathname, flags | O_NOATIME, mode);
    else
        return _open(pathname, flags | O_NOATIME, 0);
}

int open64(const char * pathname, int flags, mode_t mode)
{
    _open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64");
    if(flags & O_CREAT)
        return _open64(pathname, flags | O_NOATIME, mode);
    else
        return _open64(pathname, flags | O_NOATIME, 0);
}

Van wat ek verstaan...dit is omtrent die LD_PRELOAD-truuk of 'n kernmodule.Daar is nie 'n hele klomp middelgrond nie, tensy jy dit onder 'n emulator wil laat loop wat jou funksie kan uitvang of kode herskryf op die werklike binêre om uit te vang na jou funksie.

As jy aanvaar dat jy nie die program kan verander nie en nie die kern kan (of wil nie) wysig nie, is die LD_PRELOAD benadering die beste een, met die veronderstelling dat jou toepassing redelik standaard is en nie eintlik een is wat kwaadwillig probeer om verby te kom nie jou onderskepping.(In welke geval sal jy een van die ander tegnieke benodig.)

Valgrind kan gebruik word om enige funksie oproep onderskep. As jy nodig het om 'n stelsel oproep in jou finale produk te onderskep dan sal dit geen nut wees. Maar, as jy probeer om te onderskep tydens ontwikkeling, dan is dit kan wees baie nuttig. Ek het dikwels gebruik hierdie tegniek om hashing funksies onderskep sodat ek die teruggekeer hash vir toetsdoeleindes kan beheer.

In die geval dat jy nie bewus is, Valgrind word hoofsaaklik gebruik vir die vind van die geheue lekkasies en ander geheue verwante foute. Maar die onderliggende tegnologie is basies 'n x86 emulator. Dit naboots jou program en afsnitte oproepe na malloc / gratis ens Die goeie ding is, hoef jy nie te hercompileren om dit te gebruik.

Valgrind het 'n funksie wat hulle termyn Funksie wikkel , wat gebruik word om die onderskepping van funksies te beheer. Sien afdeling 3.2 van die Valgrind handleiding vir meer inligting. Jy kan die opstel van funksie wikkel vir enige funksie wat jy wil. Sodra die oproep onderskep die alternatiewe funksie wat u verskaf word dan ingeroep.

Sommige programme kan mislei strace / ptrace nie uit te voer, sodat die enigste werklike opsie wat ek gehad het is die gebruik van systemtap

Systemtap kan onderskep 'n klomp van die stelsel noem as dit nodig is as gevolg van sy wild card ooreenstem. Systemtap is nie C, maar 'n aparte taal. In basiese modus, moet die systemtap verhoed dat jy te doen dom dinge, maar dit kan ook hardloop in "deskundige mode" wat terugval sodat 'n ontwikkelaar om C te gebruik as wat nodig is.

Dit is dit nie nodig om jou kern pleister (of ten minste behoort nie), en een keer 'n module is saamgestel, kan jy dit uit 'n toets / ontwikkeling boks kopieer en voeg dit (via insmod) op 'n produksiestelsel .

Ek het nog 'n linux program wat 'n manier gevind het vind om rond te werk / vermy om gevang deur systemtap.

As jy net wil kyk wat oop, jy wil om te kyk na die ptrace () funksie, of die bronkode van die instruksies strace nut. As jy werklik wil onderskep die oproep, om miskien maak dit iets anders te doen, ek dink die opsies wat jy gelys - LD_PRELOAD of 'n kernmodule - is jou enigste opsies

.

Ek het nie die sintaksis van hierdie grasieus doen met 'n LKM onvoorbereid, maar hierdie artikel bied 'n goeie oorsig van wat jy wil hoef te doen: http://www.linuxjournal.com/article/4378

Jy kan ook net pleister die sys_open funksie. Dit begin op lyn 1084 van lêer / open.c as van linux-2.6.26.

Jy kan ook sien as jy nie kan gebruik inotify, systemtap of SELinux om al hierdie te meld vir jou doen sonder dat jy 'n nuwe stelsel te bou.

As jy net wil om dit te doen vir ontfouting doeleindes kyk na strace, wat gebou is in die top van die ptrace (2) stelsel oproep wat jou toelaat om te haak kode wanneer 'n stelsel oproep gedoen. Sien die PTRACE_SYSCALL deel van die man bladsy.

Klink soos jy auditd nodig.

Auditd toelaat globale dop van al syscalls of toegang tot lêers, met meld. Jy kan sleutels vir spesifieke gebeure wat jy belangstel in te stel.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top