Python - PE Parser
2016.05.16
Python - Yara Launcher
2016.03.06
Pytsk3를 통한 MFT 추출
2016.02.23
Python - Simple Extract File
2016.02.17
Python - MFT Path Parsing
$MFT Path Parsing 추출된 $MFT에서 파일의 경로를 조합하기 위하여 만들어보았다. 영어의 경우 이상이 없지만, 한글의 경우 인코딩 문제로 인하여 깨짐 현상이 발생한다. 그러한 면에서는 아직 미완성이지만 $MFT에서 파일의 경로를 알아낼 때 필요하기에 만들어보았다.+ 한글 인코딩 문제도 해결
2016.02.04
no image
Prefetch Parser 제작기
1. 개요1.1 동기Prefetch 분석 도구를 제작하고자 현재 프리패치와 관련된 툴로 WinPrefetchView를 사용하고 있지만 불편한 점을 느꼈다. 실행 시 프리패치 파일에 대하여 상세히 분석을 해주지만 현재 실행시킨 시스템에서의 파일만 분석을 한다는 것이다. Figure 1. WinPrefetchView 그렇기에 다른 PC의 프리패치 파일을 분석하기 위해선 그 해당 PC에서 실행을 하거나 해야한다. 하지만 모든 상황에서 실행이 가능한 것은 아니기 때문에 최대한 흔적을 적게 남기는 것을 목표로 하고자 한번 만들게 되었다. 1.2 구상우선 어떻게 만들지 구상을 해보았다. 여러 가지 고려 해야 할 사항은 매우 많지만 가장 크게 뽑는 다면 다음과 같다. 제작에 사용할 프로그래밍 언어 - Python 윈..
2015.12.26
Windows Timestamp Convert 64bit
from datetime import datetime,timedelta dt = '01cb17701e9c885a' us = int(dt,16) / 10. print datetime(1601,1,1) + timedelta(microseconds=us)Output2010-06-29 09:47:42.754212
2015.12.12
no image
hex viewer의 일대기
개요최근에 들어 포렌식 공부를 하고 있는데 나중에 취업을 생각하면 내가 공부한 것을 증명할 수 있어야 할 것 같다. 비전공자인 나로써는 아무런 정보도 없이 독학하는 편인데 흔히 컴공을 졸업하면 그 동안에 만들었던 프로그램들을 하나의 포트폴리오로 제출할 수가 있겠구나라는 생각이 들면서 이젠 나도 그러한 준비를 해야겠다는 생각이 들어서 무엇이든 간에 직접 만들어보자라는 마음으로 헥사뷰어를 만들고자 다짐했다. 리버싱으로 보안 공부를 시작한 내 입장에선 가장 먼저 접한 툴이 바로 OllyDBG와 HxD인데 디버거를 구현하기엔 프로그래밍 실력이 너무나 허접할 것 같기에 HxD의 기능을 가진 프로그램을 만들어보게 되었다. 그래서 그 과정에서 어떠한 생각을 하고 어떻게 프로그래밍을 했는지 담아보고자 이렇게 문서로 작..
2015.11.04

Python - PE Parser

Kail-KM
|2016. 5. 16. 16:45


'Programming > Python' 카테고리의 다른 글

Python - Yara Launcher  (2) 2016.03.06
Pytsk3를 통한 MFT 추출  (2) 2016.02.23
Python - Simple Extract File  (0) 2016.02.17
Python - MFT Path Parsing  (0) 2016.02.04
Prefetch Parser 제작기  (4) 2015.12.26



'Programming > Python' 카테고리의 다른 글

Python - PE Parser  (1) 2016.05.16
Pytsk3를 통한 MFT 추출  (2) 2016.02.23
Python - Simple Extract File  (0) 2016.02.17
Python - MFT Path Parsing  (0) 2016.02.04
Prefetch Parser 제작기  (4) 2015.12.26



'Programming > Python' 카테고리의 다른 글

Python - PE Parser  (1) 2016.05.16
Python - Yara Launcher  (2) 2016.03.06
Python - Simple Extract File  (0) 2016.02.17
Python - MFT Path Parsing  (0) 2016.02.04
Prefetch Parser 제작기  (4) 2015.12.26



'Programming > Python' 카테고리의 다른 글

Python - Yara Launcher  (2) 2016.03.06
Pytsk3를 통한 MFT 추출  (2) 2016.02.23
Python - MFT Path Parsing  (0) 2016.02.04
Prefetch Parser 제작기  (4) 2015.12.26
Windows Timestamp Convert 64bit  (0) 2015.12.12

$MFT Path Parsing


  추출된 $MFT에서 파일의 경로를 조합하기 위하여 만들어보았다. 영어의 경우 이상이 없지만, 한글의 경우 인코딩 문제로 인하여 깨짐 현상이 발생한다. 그러한 면에서는 아직 미완성이지만 $MFT에서 파일의 경로를 알아낼 때 필요하기에 만들어보았다.

+ 한글 인코딩 문제도 해결 




'Programming > Python' 카테고리의 다른 글

Pytsk3를 통한 MFT 추출  (2) 2016.02.23
Python - Simple Extract File  (0) 2016.02.17
Prefetch Parser 제작기  (4) 2015.12.26
Windows Timestamp Convert 64bit  (0) 2015.12.12
hex viewer의 일대기  (1) 2015.11.04


prefetch_parser.exe


1. 개요


1.1 동기

Prefetch 분석 도구를 제작하고자 현재 프리패치와 관련된 툴로 WinPrefetchView를 사용하고 있지만 불편한 점을 느꼈다. 실행 시 프리패치 파일에 대하여 상세히 분석을 해주지만 현재 실행시킨 시스템에서의 파일만 분석을 한다는 것이다.

Figure 1. WinPrefetchView

 

그렇기에 다른 PC의 프리패치 파일을 분석하기 위해선 그 해당 PC에서 실행을 하거나 해야한다. 하지만 모든 상황에서 실행이 가능한 것은 아니기 때문에 최대한 흔적을 적게 남기는 것을 목표로 하고자 한번 만들게 되었다.

  

1.2 구상

우선 어떻게 만들지 구상을 해보았다. 여러 가지 고려 해야 할 사항은 매우 많지만 가장 크게 뽑는 다면 다음과 같다.

      • 제작에 사용할 프로그래밍 언어 - Python
      • 윈도우 버전 – Win10의 경우 압축이 되어있음
      • GUI vs CLI – 흔적을 최소화 하기 위하여 CLI

이와 같이 3가지 사항에 대하여 크게 고민을 하였다. 프로그래밍 언어의 경우 다룰 수 있는 것이 파이썬 밖에 없었기에 결정하는데 큰 고민이 없었지만 윈도우 버전의 경우 압축 해제 과정이 들어가야 하기에 어느 버전으로 할 것 인지 고민했다.

하지만 WinPrefetchView에서는 두 가지 모두 지원을 하고 있었다. 그러므로 하나로 통합은 힘들 테니 각 버전에 맞는 2개를 만들어보자 라는 생각을 하게 되었다.

GUI의 경우 사용에 있어 편의성을 향상 시키겠지만, 우선 내가 아직 GUI를 한번도 만들어보지 않았다는 점이 크게 작용하여 결국 CLI로 택하였다.

  

1.3 전체적인 흐름

어떻게 프로그래밍을 해야 할까 고민을 해보았다. 어떻게 동작을 해야 하나 고민을 하고 다음과 같이 생각하였다.

      1. 우선 파일을 읽어야 한다. f=open('.pf','rb'). 그렇다면 이 파일은 어떻게 지정할 것인가?
      2. sys라이브러리를 통해 인자로 받는 것이 별 힘이 안 들 것 같음
      3. 읽은 파일이 압축 된 것일 경우 압축을 해제 – 압축 해제에는 다른 분의 소스를 사용
      4. 해제된 데이터를 읽어 .pf파일의 포맷에 맞게 읽음
      5. 이름, 사이즈, 마지막 실행시간, pf파일생성시간, pf파일 수정시간, 런카운트, 실행에 포함되는 파일의 이름들
      6. 5의 사항들을 출력

이렇게 전체적인 흐름을 생각하였고 이에 맞추어 코드를 하나하나 타이핑 하였고, 하면서도 많은 부분 분노와 슬픔이 있었다.



2 코드 쓰기


2.1 경로 인자 받기 & 압축 해제

우선 파일의 경로를 인자로 받아야 한다. Sys 모듈을 사용하고 인자로 받은 pf파일이 있는 경로에서 .pf 확장자를 찾아 선별하여야 한다.

Figure 2. 인자받기 & PF확장자 찾기

위의 코드와 같이 첫 번째 줄에서 sys.argv[1]로 인자를 받는다. 그리고 그 해당 경로에서 .pf 확장자를 갖는 file을 찾는 코드이다.

 

이제 인자로 받은 파일이 XPRESS 압축이 되어 있는 경우 압축을 해제하여야 한다. 이는 francesco.picasso@gmail.com 분의 소스를 가져왔으며 원래는 인자로 2개를 받아 input file과 output file을 지정해주어야 하지만, 이를 수정하여 output을 파일이 아니라 bytearray의 형태로 압축 해제된 데이터를 반환하도록 하였다.

Figure 3. XPRESS 압축해제

  

2.2 Pf 파일 이름 읽기

이제 윈도우 10의 경우에도 압축이 해제된 데이터를 가질 수가 있다. 그러므로 포맷에 맞게 간단히 데이터를 읽기만 하면 되는 줄 알았다. F.read()의 데이터를 buf라 했을 때 Pf 파일의 이름은 buf[16:49]이다. 그대로 읽기만 하면 되는데 문제가 생겼다. 아래의 그림을 보자.

Figure 4. NULL이 포함된 이름

파일의 이름이 Unicode의 형태처럼 2바이트씩 쓰여 있는 것을 알 수가 있다. 따라서 이를 그냥 출력하면 'M E L O N . E X E'와 같이 출력이 된다. 그냥 써도 별 문제는 없겠지만 나중에 해당 파일의 이름을 복붙하는 과정에 있어 저 공백 부분을 매번 지우기가 귀찮을 것 같아 공백 없이 출력되도록 하였다.

Figure 5. NULL 없애기

함수의 인자로 buf[16:49]와 같이 주면 buf[16]부터 buf[49]까지 하나 하나 읽으며 \x00을 buf배열에서 제거한다. 그리고 \x00이 제거된 부분만 반환을 하는 부분이다.

Figure 6. 출력된 파일 이름

이렇게 성공적으로 이름이 출력되는 것을 위의 그림과 같이 확인할 수가 있다. 이제 뭔가 쉽게 잘 풀리는 것 같아서 좋다.


2.3 파일 사이즈 출력

파일 사이즈도 출력을 해보자. 파일의 사이즈는 아래의 그림과 같이 12:15에 존재하고 있다. 이 부분을 10진수로 읽어 출력을 하면 된다.

Figure 7. 파일 사이즈

16진수를 10진수로 나타내기 위해서는 해당 부분을 읽은 다음에 10진수로 변환하여 출력을 해주어야 한다. 하지만 %d로 출력을 바로 하면 아래와 같은 결과를 볼 수가 있다.

 

Figure 8. 파일 사이즈 출력 오류

Bytearray형식으로 읽었기 때문에 %d의 형식으로 출력을 할 수가 없다는 것이다. 그렇다면 %s로 출력을 하면 어떨까?

 

Figure 9. 파일 사이즈 출력 오류

위의 그림과 같이 이상하게 출력되는 것을 확인할 수가 있다. 그렇다면 어떻게 해야 할까 고민을 하던 중 아는 분이 mft와 관련하여 분석하는 Python 코드를 보았는데 리틀엔디언을 십진수로 출력해주는 코드가 있기에 가져왔다.

Figure 10. LittleEndianToInt

이 함수를 통하여 리틀엔디언으로 나타난 부분을 바로 10진수로 출력해주는 것을 확인할 수가 있다. 참 편리한 부분이다.

Figure 11. 파일 사이즈 출력

원하는 바와 같이 204910이 제대로 출력되는 것을 확인할 수가 있다. 이렇게 파일의 이름과 사이즈의 출력에 성공하였다.


2.4 마지막 실행 시간 출력

포렌식 툴인 만큼 가장 중요한 부분은 바로 시간과 관련된 부분이다. 0x80~0x88까지의 부분이 프리패치 파일이 마지막으로 실행된 시간(Last Run Time)이다.

Figure 12. 마지막 실행시간 위치

 

시간과 관련하여 꽤 시간을 소모하였다. 시간을 출력하는데 datetime 모듈을 사용하였으며 필요한 코드는 아래의 그림과 같다.

Figure 13. 시간 변환 함수

우선 리틀엔디언을 빅엔디언 10진수로 변환해주고 그 다음 time_convert라 써있는 부분의 함수를 호출하여 알맞은 형태로 출력되게 하고자 하였다. 여기서 애를 먹은 부분은 3번째와 5번째라인이다. 우선 5번째 라인의 마지막 timedelta에 hours=9를 해주므로 한국 기준 시간인 UTC 9:00을 맞출 수 있었다. 만약 저 부분을 쓰지 않는다면 한국 시간과 9시간 차이가 나는 값을 얻게 된다.

Figure 14. 시간 출력 오류

3번째 라인의 경우 쓰지 않을 경우 위와 같이 에러가 출력이 되는데, 3번째 라인을 써주므로 문자열의 형태로 만든 다음 원하는 결과를 제대로 나타낼 수 있게 해주므로 나의 코드에서는 반드시 써주어야 했다.

Figure 15. 시간 출력 성공

위의 과정들을 통하여 코드를 완성하였다. 그리고 위와 같이 올바른 값을 출력하도록 할 수 있었다.


2.5 pf파일 생성시간 & 수정시간 출력

생성시간과 수정시간의 경우 실행한 원래의 파일에 대한 것이 아니라 프리패치 파일이 생성된 시간과 수정된 시간에 관하여 출력을 나타낸다.

Figure 16. 생성시간 & 수정시간

이 둘은 datetime 모듈과 os.path의 getctime과 getmtime을 통하여 쉽게 얻을 수가 있었다. 이에 대한 출력 결과는 아래와 같다.

Figure 17. 생성시간 & 수정시간 출력 성공

  

2.6 실행 횟수 출력

프리패치 파일에는 해당 파일을 몇 번 실행했는지 또한 나타나있다. 이는 pf 파일의 0xD0에서 0xD3까지에 위치해 있다.

Figure 18. Run Count 위치

이 경우도 2.3에서 파일의 사이즈 출력과 비슷한 작업을 거쳐 출력을 해주면 된다. 우선 리틀 엔디언의 형태로 되어있으므로 빅엔디언으로 변환하고 10진수로 출력을 해주면 된다. 여기선 위와 같이 LittleEndianToInt 함수를 사용하였다.

Figure 19. Run Count 출력 성공


2.7 포함되는 파일 목록

프리패치 파일에는 해당 프로그램이 실행 될 때 로드하는 파일에 대하여 목록을 가지고 있다. 이러한 파일의 목록은 분석을 하는 입장에서도 중요한데, 만약 잘못된 위치에서 의심스러운 파일이 로드 되는 등의 행위는 분석에 있어 시간을 단축할 수 있게 해주는 중요한 단서가 된다.

Figure 20. 파일 목록 & 크기

0x64~0x68까지는 로드되는 파일의 이름이 있는 위치를 나타내며 0x68~0x6C는 파일 목록이 저장된 위치의 크기를 나타내어 준다. 따라서 offset은 0x64~0x68이며 size는 0x68~0x6C이므로 로드된 파일의 목록이 나타나는 마지막 위치는 offset+size이 된다.

Figure 21. 로드된 파일 목록 함수

우선 file list의 offset을 0x64에서 확인을 해주고 size는 0x68에서 확인을 해준다. 그리고 이를 통해 마지막 위치를 알 수가 있으니 해당 부분을 읽으면 된다. 하지만 여기서 아래의 그림을 확인하자.

Figure 22. 유니코드와 NULL 구분

표시한 부분이 바로 로드된 파일의 나누는 기준이 된다. 전체적으로 유니코드로 나타나기에 \x00\x00을 통해 파일을 나누어야 한다. 그렇기에 위의 코드에서 Unicode_split를 추가한 것이다.

이렇게 \x00\x00을 통해 각 파일들을 나눌 수가 있다. 하지만 유니코드의 형태를 그대로 읽었기에 출력을 할 경우 "V O L U M E . . ."처럼 2.2에서 파일의 이름에 공백이 추가되어있듯이 나타난다. 하지만 이번에는 bytearray의 형태가 아니라 문자열의 형태로 파일의 목록을 읽었기 때문에 다른 방식으로 접근해야 했다.

Figure 23. 로드된 파일 목록 공백 제거

"V.O.L.U.M.E …"와 같이 파일 경로를 하나 하나 인자로 remove_uni_null 함수에 주게 되면 임시로 만든 tmp배열에 \x00이 아닌 경우에만 추가된다. 그러므로 \x00은 자연히 떨어져 나가게 되며 이렇게 만들어진 새로운 tmp 배열은 join(tmp)를 통해 일반적인 문자열과 같이 출력되는 결과를 확인할 수가 있다.

Figure 24. 출력 결과

이렇게 전체적인 내용을 모두 완성하였으며 출력 결과 또한 만족스럽다.



3. 후기


일단 원하는 내용의 프로그램은 만들었기에 매우 뿌듯하다. 하지만 다 만들면서 또는 만든 후에 느끼는 점이 매우 많은데 이에 대해 정리하면 다음과 같다.

첫째, 확실히 프로그래밍은 많이 해보아야 하는 것 같다. 전체적인 구성을 하는 것보다는 유니코드에 포함된 NULL을 제거하거나 리틀엔디언을 10진수로 출력하거나 시간을 변환하고자 하는데 해당 형식은 안된다는 등의 오류를 해결하는데 오히려 훨씬 더 많은 시간을 지체하였다. 결국 오랜 시간 끝에 하나하나 해결을 하였기에 이와 유사한 프로그램을 만들 때에는 내가 만든 소스를 보므로 시간을 훨씬 단축할 수 있을 것 같다.

둘째, 원하는 내용을 만들었지만 아쉬운 점이 많이 느껴진다. 예를 들어 CLI의 형태이므로 어떠한 컬럼을 기준으로 정렬을 할 수 없다는 점이 가장 크다. 내가 만든 프로그램의 경우 지정된 폴더에 이름 순서에 따라 나타나는 정도이기에 다소 불편함이 있기는 하다.

셋째, 전체적으로 코드에 대한 이해가 부족한 느낌이 크다. 왜 굳이 bytearray를 사용했는지, 왜 bytearray는 변환이 되고 str은 안되는지 등에 대하여 자세한 이유를 모른다는 점에서 부족함을 많이 느꼈다.

넷째, 부족한 프로그램이지만 내가 만든 프로그램은 내가 애정을 가져야 하는 것 같다. 다른 사람이 더 잘 만들 수 있지만, 만들면서 많은 고민을 했다는 것 자체만으로도 큰 도움이 되는 것 같다.


참고


http://www.forensicswiki.org/wiki/Windows_Prefetch_File_Format   프리패치 파일 포맷

http://devanix.tistory.com/306  datetime 모듈

http://tt-share.blogspot.kr/2015/05/python_35.html    파일 mac 시간 구하기

https://gist.github.com/dfirfpi/113ff71274a97b489dfd#file-w10pfdecomp-py   XPRESS 압축 해제

https://gist.github.com/craSH/393155/19cb41b9f536593cb16a978af8ebeb00ffae500f 프리패치 해시 값

http://www.forensicfocus.com/Forums/viewtopic/p=6542386/#6542386


4. 첨부

완성된 코드




압축해제에 참고한 코드



'Programming > Python' 카테고리의 다른 글

Python - Simple Extract File  (0) 2016.02.17
Python - MFT Path Parsing  (0) 2016.02.04
Windows Timestamp Convert 64bit  (0) 2015.12.12
hex viewer의 일대기  (1) 2015.11.04
Upgrade - Hex_Viewer.py  (0) 2015.11.03
from datetime import datetime,timedelta
dt = '01cb17701e9c885a'
us = int(dt,16) / 10.
print datetime(1601,1,1) + timedelta(microseconds=us)

Output

2010-06-29 09:47:42.754212


'Programming > Python' 카테고리의 다른 글

Python - MFT Path Parsing  (0) 2016.02.04
Prefetch Parser 제작기  (4) 2015.12.26
hex viewer의 일대기  (1) 2015.11.04
Upgrade - Hex_Viewer.py  (0) 2015.11.03
Simple - Hex_View.py  (0) 2015.11.02

개요


최근에 들어 포렌식 공부를 하고 있는데 나중에 취업을 생각하면 내가 공부한 것을 증명할 수 있어야 할 것 같다. 비전공자인 나로써는 아무런 정보도 없이 독학하는 편인데 흔히 컴공을 졸업하면 그 동안에 만들었던 프로그램들을 하나의 포트폴리오로 제출할 수가 있겠구나라는 생각이 들면서 이젠 나도 그러한 준비를 해야겠다는 생각이 들어서 무엇이든 간에 직접 만들어보자라는 마음으로 헥사뷰어를 만들고자 다짐했다.

리버싱으로 보안 공부를 시작한 내 입장에선 가장 먼저 접한 툴이 바로 OllyDBG와 HxD인데 디버거를 구현하기엔 프로그래밍 실력이 너무나 허접할 것 같기에 HxD의 기능을 가진 프로그램을 만들어보게 되었다. 그래서 그 과정에서 어떠한 생각을 하고 어떻게 프로그래밍을 했는지 담아보고자 이렇게 문서로 작성하여 본다.


고뇌의 시작


우선 그나마 친한 프로그래밍 언어가 파이썬이기에 파이썬으로 프로그래밍을 하고자 하였다. 먼저 헥사뷰어의 기능을 생각해보았을 때 어떻게 코드가 구성이 될지를 생각해보았다.  f=open(file,'rb'), f.read()...음....답이 없었다. 큰 흐름이 보이지 않았다. 결국 구글링을 통해 다른 사람이 만들어놓은 코드를 한번 직접 보고 실행해보자라는 결정에 이르게 되었다. 그렇게 해서 찾게 된것이 아래의 코드였다.

출처 : http://mwultong.blogspot.com/2007/04/python-hex-viewer-file-dumper.html


우선 소스코드를 한번 읽어본 다음에 바로 실행하였다. 그 결과 아래와 같은데 이를 보자마자 들었던 생각은 "오....!!이거다 이거"라는 생각이였다. 따라서 이를 토대로 한번 직접 코드를 수정해서 '백문이불여일타'라는 어느 프로그래밍 책에서 보았던 말을 실천해보기로 하였다.


고뇌의 연속


우선 전체적인 코드를 읽어봤을 때 내용은 쉬웠다. 하지만 딱 한 곳 이해가 잘 안되는 곳이 있었는데 바로, 위의 코드에서 30번째 라인이다. 한 줄에 비트씩 기록이 되는데 그 길이가 16이 아닐 경우 공백으로 채우는 것이다. 하지만 for i in range( ((16 - bufLen) *3 ) + 1): 에서 곱하기 3이 쫌 불편해보였다. 단순한걸 좋아하는데 곱셈이라니.. 그래서 결국 해당 공백을 채우는 목적만 같으면 되므로 저 부분만 수정을 하고 거의 대체적으로 비슷하게 코드가 완성되었다. (거의 빼껴씀..)

위에서 말했던 부분을 그냥 for i in range(16-len_data) : result+='   '과 같이 그냥 공백을 세칸으로 주었다. 그 외에는 너무 유사(모방은 창조의 어머니)하다. 하지만 직접 코드를 따라 쓰고 실행을 했을 때 결과는 똑같았다. 하지만 문제가 있었다. 헥사뷰어를 통해서 보통 exe파일을 보던 사람임으로 실제 exe파일을 넣고 해보았더니 아래와 같이 되었다.

해당 exe파일의 시그니처를 보고자 했는데 CMD로는 용량이 어느정도 이상으로 넘어가면 더 이상 윗부분을 볼 수가 없는 것이였다..!!!이는 치명적이였다. 물론 리다이렉션을 통해서 메모장으로 넘긴다음에 볼 수도 있지만 기분이 정말 나빳다. 내가 저딴 CMD에게 굴복하는 듯한 치욕감이 들었다.  그래서 다시 고뇌에 잠기게 되었다.


고뇌의 완화


저걸 어찌해야하나 고민하다가 문득 생각 난것이 그렇다면 특정 오프셋을 지정해주면 그에 해당하는 오프셋으로부터 일정부분만 출력하도록 하는 것은 어떨까라는 생각이였다. 정말 기특했다. 자 이제 이를 어떻게 구현할까 생각해보았다. 고려해야할 사항은 다음과 같았다.

- 원래의 기능이 손상되면 안되었다. 원래의 기능은 유지한채 추가적인 기능을 넣을 것

- 사용자가 해당 오프셋을 지정하기 위해서는 인자를 통해 주는 것이 아무래도 편리

이렇게 초점을 맞추고 구상을 해보았다. 하지만 이렇게 하기에는 앞에 코드가 너무 난잡하였다. 그래서 한번 다시 깔끔하게 정리를 해보기로 하였다. 정말 웬만한건 다 제외시켜 버렸다. 그 결과는 아래와 같다.

오...이렇게 다시 작성을 해보니 뭔가 내 자신이 대단해보였다. 원래 참고했던 코드보다도 간결해보여서 뿌듯했다. 이제 이를 토대로 추가적인 기능을 구현해보고자 했다. 

- 인자가 주어지지 않을 경우에는 원래의 기능으로 동작

- 인자가 주어질 경우 새로 추가할 기능으로 동작

이렇게 정리가 되는데, 떠오른 것이 if와 try였다. 근데 왠지 if는 뭔가 느낌이 좋지 않았다. 따라서 try를 통해서 sys.argv[2]가 존재할 경우를 기술하고 만약 sys.argv[2]가 존재하지 않아 프로그램이 except로 진행이 될 때는 원래의 기능이 실행되도록 하였다. 이를 머리로 생각해보았을 때 대체로 아래와 같은 큰 그림이 그려진다.

위의 그림을 가지고 대체적인 코드를 짜보았다. 그 과정에서 많은 에러가 있었지만 결국 완성하긴 했다. 하지만 뭔가 코드가 쓸 때 없이 반복되고 너무 길었다. 매우 비효율적인 것만 같았다. 

결국 이 또한 수정을 하기로 마음 먹었다. 하지만 여기까지하고 학교 강의로 인하여 중단을 해야만했다. 그래서 수업중에 노트에 한번 구상을 해보기로 했다. 일단 기존 코드에 중첩되는 부분을 def를 통하여 함수로 만들어 뺀 후에 필요한 부분만 좀 수정해주면 될 것 같다는 결론에 이르었다.


완성




이렇게 하여 뭔가 깔끔하게 완성이 되었다. 사실 별로 보잘 것 없는 프로그래밍이지만 비전공자인 나에겐 프로그램 하나를 만들 때마다 매우 흥미롭다. 그렇기에 한번 쯤은 이러한 과정을 담아보고 싶었고, 이 후 다시 어떠한 프로그램을 만들어볼까라는 생각이 들기 전까지는 다시 포렌식 공부를 열심히 할 것 같다.


'Programming > Python' 카테고리의 다른 글

Prefetch Parser 제작기  (4) 2015.12.26
Windows Timestamp Convert 64bit  (0) 2015.12.12
Upgrade - Hex_Viewer.py  (0) 2015.11.03
Simple - Hex_View.py  (0) 2015.11.02
Python API  (0) 2015.10.06