[질문]커널 모듈 프로그램에서 사용자 영역으로 데이터 보내는

findme의 이미지

이런 저런 프로그램은 조금 해봤는데 커널 관련된 프로그램은 처음입니다.
그래서 그런지 어떻게 해야 할지 감이 안오는 상태구요
개발하는 시스템은 rh9에 커널은 2.4.26 정규 커널을 따로 빌드한 상황이구요
구현 해야 하는건 사용자가 특정 시스템을 콜 할경우
커널에서 시스템 콜의 정보와 사용자 정보를 사용자 영역 프로그램에게 넘겨 줘야 합니다.
사용자 영역 프로그램은 시스템에서 서비스로 돌고 있구요
시스템콜은 LKM을 이용해서 원하는 시스템 콜을 후킹 했습니다.
그런데 이 시스템 콜 후킹 루틴에서 시스템 콜 정보와 사용자에 대한 정보를
어떻게 사용자 레벨의 프로그램에게 넘겨야 할까요?
지금 생각으로는 디바이스 드라이버를 하나 만들어서 서비스 프로그램이 이 디바이스를 listen 하고 있다가 특정 시스템 콜이 호출이 되면
이 디바이스로 정보를 보내주는 방법으로 생각 하고 있습니다.
(이방법이 올바른 방법인지도 모르겠습니다. 다른 방법이 있다면 도움을..)
여기에서 커널 영역의 데이터를 사용자 영역에 넘기는 방법을 알수가 없습니다.
디바이스 드라이버의 read/write 구현을 바로 호출 해서 가능 한지요?
그렇다면 read/write 함수 구현시에 넘어가는 인자는 어떻게 처리 해야 하는지요?
(*read)(struct file *, const char *, size_t, loff_t) 이런 형태인데
struct file : current->files
const char : 전송 하고자 하는 정보
size_t : 데이터의 크기
loff_t : ??
read/write호출이 가능 하다면 마지막 인자값은 어떻게 구해야 하는지요?
struct file 구조체에 멤버로 loff_t 타입의 f_pos멤버가 존재 하는데 이값이 사용 가능 한지요? (fs/pipe.c의 read 구현 루틴에 if(ppos != &file->f_pos)가 있더군요)
인런식으로 인자를 사용하는게 올바른지요?
이렇게 호출 하는것이 가능하지 않다면 다른 방법은 무었이 있는지요?
하기는 해야 하는데 아는것이 없다보니 뭘해야 할지 보이지 않습니다.
고수님들 도움을 부탁드립니다...

charsyam의 이미지

findme wrote:
이런 저런 프로그램은 조금 해봤는데 커널 관련된 프로그램은 처음입니다.
그래서 그런지 어떻게 해야 할지 감이 안오는 상태구요
개발하는 시스템은 rh9에 커널은 2.4.26 정규 커널을 따로 빌드한 상황이구요
구현 해야 하는건 사용자가 특정 시스템을 콜 할경우
커널에서 시스템 콜의 정보와 사용자 정보를 사용자 영역 프로그램에게 넘겨 줘야 합니다.
사용자 영역 프로그램은 시스템에서 서비스로 돌고 있구요
시스템콜은 LKM을 이용해서 원하는 시스템 콜을 후킹 했습니다.
그런데 이 시스템 콜 후킹 루틴에서 시스템 콜 정보와 사용자에 대한 정보를
어떻게 사용자 레벨의 프로그램에게 넘겨야 할까요?
지금 생각으로는 디바이스 드라이버를 하나 만들어서 서비스 프로그램이 이 디바이스를 listen 하고 있다가 특정 시스템 콜이 호출이 되면
이 디바이스로 정보를 보내주는 방법으로 생각 하고 있습니다.
(이방법이 올바른 방법인지도 모르겠습니다. 다른 방법이 있다면 도움을..)
여기에서 커널 영역의 데이터를 사용자 영역에 넘기는 방법을 알수가 없습니다.
디바이스 드라이버의 read/write 구현을 바로 호출 해서 가능 한지요?
그렇다면 read/write 함수 구현시에 넘어가는 인자는 어떻게 처리 해야 하는지요?
(*read)(struct file *, const char *, size_t, loff_t) 이런 형태인데
struct file : current->files
const char : 전송 하고자 하는 정보
size_t : 데이터의 크기
loff_t : ??
read/write호출이 가능 하다면 마지막 인자값은 어떻게 구해야 하는지요?
struct file 구조체에 멤버로 loff_t 타입의 f_pos멤버가 존재 하는데 이값이 사용 가능 한지요? (fs/pipe.c의 read 구현 루틴에 if(ppos != &file->f_pos)가 있더군요)
인런식으로 인자를 사용하는게 올바른지요?
이렇게 호출 하는것이 가능하지 않다면 다른 방법은 무었이 있는지요?
하기는 해야 하는데 아는것이 없다보니 뭘해야 할지 보이지 않습니다.
고수님들 도움을 부탁드립니다...

지금 당장 생각나는 방법은 read 나, ioctl 을
구현해서 하는 방법밖에 생각이 나지 않네요. 개인적으로는 ioctl이
더 편할것 같습니다 고운 하루되시길...

=========================
CharSyam ^^ --- 고운 하루
=========================

leonhan의 이미지

mmap 관련은 여기서나 구글이나 관련 책들에서 찾아보시면 될겁니다.

sjpark의 이미지

remains의 이미지

음.. 한가지 덧붙이자면,
netlink를 이용할 수도 있습니다.
또는 naive한 방법이지만, printk를 이용해서 syslog로 받는 방법도 있겠구요.

kth의 이미지

커널 영역에서 사용자 영역으로 데이타를 보내는 방법은 다양합니다.

1. character device를 하나 만들어서 커널 영역에서 그 디바이스에 데이타를 작성하고, 사용자 영역에서 그 디바이스에서 데이타를 읽는 방법.

2. /proc 파일 시스템을 사용하여 데이타를 주고 받는 방법.

3. 커널 영역에서 소켓 프로그램을 작성하여 사용자 영역의 소켓 데몬에게 전달하는 방법

4. 커널 영역에서 사용자 영역의 파일을 생성하여 파일에 데이타를 작성하는 방법

보통 1번 경우를 많이 사용합니다. 디바이스에 대해서 open, read, write 오퍼레이션을 구현를 하면됩니다.

2번 경우, 많은 데이타가 아닌 적은 데이타 또는 변수 값을 전달할 경우 사용할 수 있습니다.

3번 경우, TCP보단 UDP로 데이타를 전송해도 된다면 사용할 수 있습니다.

4번 경우, 커널에서 직접 파일을 오픈하거나 생성하여 데이타를 작성하는 것입니다.

faye의 이미지

새로운 시스템 콜을 등록하고..

후킹한 시스템 콜에서 정보를 커널 메모리에 유지한 후

데몬에게 시그널을 전송합니다.

시그널을 받은 데몬은 새로운 시스템 콜을 이용해서 정보를 가져옵니다.

시그널이 다량으로 발생하는 경우를 해결한다면.. 다른 방법보다 간단할것 같내요.
(데몬과 다른 사용자인경우 시그널 전송에 트릭이 필요할것 같내요)

그럼 도움되시길..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.