packet dumping module을 프로그래밍중입니다.

sr97의 이미지

네트워크 서브 시스템에 변화를 주지 않고 host로 전송되는 모든 패킷을 application layer로 dumping하는 커널 모듈을 만들었습니다.

그런데 응용계층으로 패킷을 전송할때 문제가 좀 생기더군요.

처음에는 콜백 함수를 이용하면 될거라고 생각해서 시스템 콜을 추가해서 응용 계층의 함수(패킷 수신 함수)를 모듈에 등록하고 패킷이 도착할때 마다 응용 계층의 패킷 수신 함수를 호출하도록 했습니다.

그랬더니 응용계층의 프로세스가 모듈의 부프로세스가 되는 시스템 호출 기간에만 정상 적인 호출이 되고 그 외의 경우 즉 시스템 호출이 종료된 다음에는 segment error가 발생하더군요.

콜백함수를 이용하는 방법이 잘못됐는지 아니면 이런 경우 콜백 함수를 쓰는 것이 아니라 다른 방법을 써야되는지가 궁금합니다.

고수님들의 조언 부탁합니다.

ahgod의 이미지

sr97 wrote:
그런데 응용계층으로 패킷을 전송할때 문제가 좀 생기더군요.

처음에는 콜백 함수를 이용하면 될거라고 생각해서 시스템 콜을 추가해서 응용 계층의 함수(패킷 수신 함수)를 모듈에 등록하고 패킷이 도착할때 마다 응용 계층의 패킷 수신 함수를 호출하도록 했습니다.

그랬더니 응용계층의 프로세스가 모듈의 부프로세스가 되는 시스템 호출 기간에만 정상 적인 호출이 되고 그 외의 경우 즉 시스템 호출이 종료된 다음에는 segment error가 발생하더군요.

콜백함수를 이용하는 방법이 잘못됐는지 아니면 이런 경우 콜백 함수를 쓰는 것이 아니라 다른 방법을 써야되는지가 궁금합니다.

음... 콜백 함수를 어떻게 만들었는지 궁금하구요... 패킷의 전달은 어떤 식으로 했는지도 궁금하네요...

sr97의 이미지

모듈에서의 코드입니다.
void (*callback)(int mode, void *user1, void *user2);

다음은 응용 프로그램에서는 다음의 함수를 선언합니다.
void user_layer_function(int mode, void *user1, void *user2)
{
........
}

그리고 시스템 콜이나 기타의 방법을 이용하여 응용프로그램의 함수 포인터를 넘기는 방식으로 callback함수를 전달했습니다.

그래서 패킷이 시스템에 전달되면 모듈에서 패킷을 후킹하여 등록된 콜백 함수를 호출하는 방식으로 패킷을 전달했습니다.

ahgod의 이미지

sr97 wrote:
모듈에서의 코드입니다.
void (*callback)(int mode, void *user1, void *user2);

다음은 응용 프로그램에서는 다음의 함수를 선언합니다.
void user_layer_function(int mode, void *user1, void *user2)
{
........
}

그리고 시스템 콜이나 기타의 방법을 이용하여 응용프로그램의 함수 포인터를 넘기는 방식으로 callback함수를 전달했습니다.

그래서 패킷이 시스템에 전달되면 모듈에서 패킷을 후킹하여 등록된 콜백 함수를 호출하는 방식으로 패킷을 전달했습니다.

여기서 호출하는 Function의 Parameter가 Kernel 영역의 Variable을 바로 대입하면 문제가 생길 것 같네요... 음... 이 부분에 대해서 저같은 경우는 void Function을 호출해서 그 안에서 추가적으로 system call을 호출하는 방식으로 정보를 전달받았습니다.

음 어떤 식으로 Function의 Parameter의 값을 전달하는지 궁금하네요...

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.