[완료]간단한 텍스트 로그 파서를 제작하려고 하는데요..

superdma의 이미지

간단한 증거수집기를 만들고 있는데요...

저는 지금 프로세스 정보 수집부분을 맡고 있고여...

대상 OS는 WIN XP 모든 버전이구여. WIN32 API로 작업하고 있습니다.

구현 부분에 대해서는 직접 API를 호출하는 방법대신 외부 유틸리티의 output을 재가공해서 새로운 포맷을 로그로 출력하는 부분을 맞았습니다.

이를 위해 간단한 로그 파서를 제작하려고 하는데 웹상이나 주위에서 마땅한 조언을 얻지 못하여

이렇게 글을 올립니다...잘 부탁드려용^^

첨부사진 1,2 에서 빨간색 줄친 Column 중에서...
data.txt 에서 name(해당 process의 이름) cpu time(해당 프로세스의 할당 시간) 의 column 정보만 쏙 빼고

data2.txt 에서 해당 프로세스의 pid( data.txt에서 해당 프로세스의 pid를 얻을수 있으므로)에 의해 열려있는 포트 column만 쫙 빼서 새로운 출력을 뽑을려구 하는데...

정리해서 말하자면 두개의 input file , data.txt data2.txt 에서 출력을 받은 후
그것을 파싱후 새로운 포맷의 로그로 마이닝 하려고 합니다.

새로운 포맷의 출력은 이런식으로..

(해당_process_name) (해당_process 가 사용한 cpu time) (해당 process의 열린포트)
.................. ..................................... ...........................

..................... .................................. .............................

용책(compilers principles, techniques, & tools)으로 컴파일러 배웠지만 지금은 좀 마이 가물한 상태입니다.
방법론만 제시된다면 재미있고 열성적이게 덤빌수 있는 열정이 있습니다...

외부 로그 파서없이 순수하게 컴파일러 이론을 이용해서 전용로그파서를 제작하고 싶지만

어떠한 로직을 통해서 구현해야 될지 몰라서 헤매이고 있습니다.

간단한 PATH COMPILER,형태소 분석기,구문분석기 등을 구현해봤습니다.

어떠한 부분에는 어떤 컴파일 이론으로 나누고 자르고 붙여넣어야 되는지

통~ 감을 못잡겠습니다.


지금까지 읽어 주셔서 감사합니다.

따뜻한 봄 맞이하세용. ^^

File attachments: 
첨부파일 크기
Image icon -parser_1.jpg178.39 KB
Image icon -parser_2.jpg132.54 KB
imyejin의 이미지

이정도 수준이면 파서까지 코딩할 필요도 없이 cut paste sed 같은 유닉스 텍스트 처리 유틸리티로 해결될 수도 있는 수준 같은데요, 일단 기본적인 유틸리티로 간단히 스크립트 작성해서 해결할 수 있으면 그렇게 해결하시는 게 관리하기도 좋습니다. 윈도우즈라 유닉스 유틸리티를 사용하기 곤란하다면 펄 등 정규식을 쓰기 편한 스크립트 언어 기반으로 스크립트 작성해서 돌리던가요. 이미지를 대강 보니 포맷이 정규식 수준에서도 해결 가능할 것 같은데요, 닭 잡는 데 소 잡는 칼을 쓰실 필요 없습니다.

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

dragonkun의 이미지

정규식(Regular Expression)만으로도 쉽게 해결 가능해 보입니다.
WIN32 API 말고.. 파이썬이나 루비 같은 스크립트 언어를 알고 계시다면, 수십분 내에 만들 수 있을 것 같습니다.
---
Emerging the World!

Emerging the World!

inniskun의 이미지

#!/usr/bin/ruby -KU
data = Hash.new
File.open("data.txt","r") { |f|
    f.each_line do |line|
        row = line.split(/\s+/)
        data[row[1]] = { "name" => row[0], "cputime" => row[6] } if row[1] != "Pid"
    end
}
File.open("data2.txt","r") { |f|
    f.each_line do |line|
        pid = line[/^(\d+)\s/,1]
        port = line[/->\s+(\d+)\s/,1]
        data[pid]["port"] = Array.new if !data[pid]["port"]
        data[pid]["port"].push(port)
    end
}
data.each do |pid, val|
    puts "#{val["name"]}\t#{val["cputime"]}\t#{val["port"].join(", ")}"
end

이정도?? 물론 검증은 안해봤습니다...

눈에 보이는 모든것은 보이지 않는 것들로 이루워져 있다.
Nobody reachs the Truth~*

눈에 보이는 모든것은 보이지 않는 것들로 이루워져 있다.
Nobody reachs the Truth~*

cyberuls의 이미지

http://ykei.egloos.com/4829001

이쪽 글에서 나오는 logparser 라는 것을 참고해보면 좋을 듯 합니다.

ms에서 만든 툴인데 text내용을 db에 나오는 query 형태로 조회가능하고 ms office 가 깔려있으면 통계 정보를 차트까지 같이 만들줍니다.

------------------------------------------
php로 웹놀이터 만드실 분을 찾습니다.
home : http://easylogic.co.kr/

php로 웹놀이터 만드실 분을 찾습니다.
home : http://easylogic.co.kr/

superdma의 이미지

질우선 c언어로 제한되어 있어서여...

그에 맞춰 아무생각 없이 코딩했더니

몇백줄이 되더군여...ㅠ 물론 다른 포맷이 들어오면 대대적인 수정이 필요한 그런 코드여..

제시해주신 스크립트나 유닉스 유틸같은 것을 사용하는 것도 아니라서여...

c언어를 이용해서 칼럼만 딱딱 가지고 오게 구문적으로 어떻게 플그래밍 해야될지 ..

막상 떠오르는게 컴파일러시간에 배웠던 것이면 어떻게든 해결 가능하지 않을까 싶어서여.

imyejin의 이미지

웬만하면 이런 건 C로 하지 말고 스크립트로 처리하면 편할텐데 왜 C만 써야된다는 건지도 잘 이해가 안가지만, C만 써야 하는 상황이라도 정규식 라이브러리면 해결될 문제에요. 컴파일러 시간에 LL, LR 문법 분석 같은 거 배우기 전에 정규식이랑 FSM 배우셨을 거 아닙니까? 정규식 라이브러리는 직접 구현할 일 없고 그냥 있는 거 쓰시면 됩니다.

그리고 왜 C만 되고 C++은 안되는지도 모르겠는데 C++ 쓰시면 boost::regexp 쓰시면 되고요. 다음 C++ 표준엔 boost::regexp 도 들어간다고 하죠.

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

jick의 이미지

...숙제라면, 열심히 하시라는 말밖에 별로 드릴 말씀이 없고 -_-

숙제가 아닌데 꼭 C를 써야만 한다면 lex, 혹은 자주 쓰이는 확장판인 flex를 찾아보세요. 파싱의 전단계인 lexical analyzer를 만들어 주는 툴이고, 생성되는 코드는 C 코드이므로 C밖에 못쓰는 환경이라도 잘 쓸 수 있습니다.

* 제 경험이 짧아서인지도 모르지만, LL, LR 파서를 손으로 직접 짜는 사람은 본 적이 없습니다. 그거 대마왕급 삽질입니다. -_-;;

lifthrasiir의 이미지

C라면 그냥 sscanf 쓰면 안 되나요?

// buf에 한 줄이 들어 있다 치면
sscanf(buf, "%20[^\n] %d %d %d %d %d %s %s",
    name, &pid, &prio, &thread, &handle, &priv, cputimestr, elapsedtimestr);
parse_time(cputimestr, &cputime);
parse_time(elapsedtimestr, &elapsedtime);

이를테면 이런 식으로 말입니다. sscanf는 생각보다 강력한 파서를 내장하고 있으니 man 페이지나 그런 걸 읽어 보시면 많은 도움이 될 것 같습니다. (parse_time은 직접 짜 보셔도 되고요.)

그나저나... "증거 수집기"라는 것이 무엇입니까? 뭐 수사기관-_-용은 아닐 것 같고... 근무 시간에 직원들 딴짓 하는 증거를 수집한다거나?;;; 아무리 생각해도 뭘 원하는 것인지 종잡을 수 없어서요.

superdma의 이미지

저희가 간단히 만들고 있는게
http://www.security-database.com/evidence.php
이런 비슷한 것입니다...
기능은 축소판이고, 로그파일에 대해 무결성 부분을 추가한 뭐... 그저 그런거죠 ㅋㅋ

수사용으로 사용여부는
http://cist.korea.ac.kr/~forensic/forensic/info.php
참고해 주세요.

지금은 boost::regexp 를 이용하거나

단순히 입력값을 받아서 자료구조형식으로 구조체에 넣어서 작업하려고 생각중입니다.

CMD>netstat -a > log.txt

그런데 또 고민을 해봐야 겠네여..파일을 버퍼에 저장하고.
sscanf로 버퍼를 읽어들이면서 각각 필드값을 구조체 변수에 저장하고..

각각 해당 리스트로 관리하는 방식으로 필요한 데이터를 뽑아오면 될꺼같은데...

동적할당시 미리 라인수를 확보해서 알맞게 리스트를 생성해야 하겠구...

아... 아직은 아이디어를 더 모아서 좀더 나은 throughput을 만들려구여.
아이디어 갱신되면 또 조언을 구하러 오겠습니다.

감사합니다 ~

댓글 달기

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