커널 모듈의 파일 실행 추적 [닫기]

커널 모듈의 파일 실행 추적 [닫기]

저는 현재 syscall 후크와 로그를 사용하여 커널을 보호하기 위한 일부 프로젝트를 진행하고 있습니다... 이제 읽기 및 소켓 syscall 연결을 완료했으므로 execve를 사용하여 동일한 작업을 시도할 때(방금 실행된 파일에 따라) 커널 작업을 받고 있는 건가요, 아니면 dmesg를 열어 어떤 오류가 있는지 확인할 수 없기 때문에 뭔가 잘못하고 있는 건가요? (dmesg도 실행 가능합니다. 실행 파일을 실행하기 위해 함수를 재정의했습니다.) 나는 또한 stub_execve라는 것이 있다는 것을 알았고 시스템 호출 중 일부가 다른 바이너리 또는 이와 유사한 것으로 래핑되어 있기 때문에 시스템 호출 테이블에서 시스템 호출을 변경할 수 없다는 것을 알았습니다. (내가 틀렸다면 고쳐주세요) . 그래서 결국 내가 해야 할 일은 방금 어떤 파일이 실행되었는지 확인하고, 커널 모듈을 통해 이를 수행해야 하며, 이를 수행하는 방법이나 Stub_execve 또는 이와 유사한 것을 건너뛰는 방법을 아는 사람이 있는지 확인하는 것입니다. .? 도와주세요. 정말 감사하겠습니다.

답변1

조사해 보셨나요 kprobes? 아니면 구체적으로 jprobes.

jprobe를 사용하면 함수 execve(또는 다른 커널 함수)에 연결할 수 있고 함수가 실행되기 전에 해당 인수를 확인할 수 있습니다. 작동 방식은 호출자가 추적하려는 함수와 동일한 서명이 있는 함수를 제공하고 이를 호출하여 등록하는 것입니다 jprobe_register. 우리는 이 함수를 이라고 부릅니다 my_execve. 그런 다음 실제 함수를 실행하기 전에 커널은 먼저 모든 컨텍스트(매개변수, 레지스터 값 등)를 스택에 저장하고 제어권을 스택에 전달하여 my_execve해당 컨텍스트의 복사본을 전달합니다. 반환할 때 my_execve( jprobe_return대신 사용 return) 커널은 원래 함수에 의해 저장된 컨텍스트를 복원 execve하고 실행을 재개합니다. 이는 컨텍스트에 대한 변경 사항이 원래 기능의 실행에 영향을 미치지 않음을 의미합니다. 여기에서 예를 볼 수 있습니다.https://github.com/bytefire/esct/blob/master/esct.c.

레지스터의 값을 변경하는 등 컨텍스트를 조작하려는 경우 사용하면 kprobes비슷한 패턴을 따르지만 약간 더 의미가 관련됩니다.

관련 정보