UPack 의 추억

column 2009.09.21 01:12


<사진 출처 : UPack 제작자 dwing's homepage>


그 동안 총 5 회에 걸쳐서 UPack 의 PE Header 분석과 Debugging 에 대해서 연재를 하였습니다.

UPack 상세 분석 – PE Header 완전 정복 (1)
UPack 상세 분석 – PE Header 완전 정복 (2)
UPack 상세 분석 – PE Header 완전 정복 (3)
UPack 상세 분석 – PE Header 완전 정복 (4)
UPack 디버깅 - OEP 찾기


다른 Packer 도 많은데 굳이 이 UPack 에 이렇게 많은 공(?)을 들인 까닭은 제 개인적인 추억(경험) 때문입니다.

예전에 PE 공부를 마치고 PE File Format 에 자신 있던 그때에, 전혀 새로운 PE 세계가 있다는 걸 알려준 소중한 Packer 입니다. 또한 PE 스펙은 그냥 스펙일 뿐이고, 실제 구현은 PE Loader 개발자에 의해 좌우되기 때문에 OS 별로 실제 테스트를 해봐야 한다는 깨우침(?)을 주었습니다.

제 블로그를 방문하시는 여러분들께서도 저와 같은 경험과 느낌을 가져보시라는 뜻으로 UPack 을 상세히 소개하였습니다.

물론 UPack 에서 소개된 내용이 PE Header Patch 의 전부는 아닙니다.

하지만 제가 분명히 장담할 수 있는 것은 "UPack 을 정복한 사람에겐 앞으로 어떤 PE Header 변형이 나타나더라도 두렵지 않다." 는 것입니다. PE Header 에서 실제 사용되는 값들과 사용되지 않는 값들을 잘 숙지 하고 있다면 어떤 변형도 무리 없이 분석이 가능합니다. (제 경험입니다. ^^)

감사합니다.


ReverseCore


  1. 신화창조 2009.09.21 23:25 신고 댓글주소 | 수정 | 삭제 | 댓글

    열심히 써주신 글들 RSS로 정말 잘 읽었습니다. ^^

    확실히 국내 몇 안되게 체계적이고 내용도 쉬운 것(!) 같습니다. 고맙습니다!

  2. Sun2Day 2009.09.22 10:01 신고 댓글주소 | 수정 | 삭제 | 댓글

    좌절의 UPack..;;

    주말에 가지고 놀아보다가.. 안되면 문의 드리러 올께요 (+__)ㅋ

  3. 2009.09.24 01:03 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

  4. 2010.12.09 20:47 댓글주소 | 수정 | 삭제 | 댓글

    비밀댓글입니다

    • reversecore 2010.12.03 16:23 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      사실 합법/불법을 저조차도 딱부러지게 100% 판단하기는 어렵습니다.

      다만 제 기준은 이렇습니다.

      누군가에게 피해를 끼쳤느냐 아니냐로 구분하는 것이죠.

      가령 리버싱을 해서 패커의 고유 압축 알고리즘을 공개해버리면 소중한 지식을 공개한 셈이 되지 않을까요? 제작자 입장에서는 피해를 보는 상황이라고 생각합니다.

      저는 법에 대해 문외한 이므로 참고만 하시기 바랍니다. ^^

      감사합니다.

  5. プラダ トートバッグ 2013.04.25 16:28 신고 댓글주소 | 수정 | 삭제 | 댓글

    누구냐고 물어보면 윤동주라고

  6. netinfil 2013.10.08 14:38 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요. 책을 구매한 후에 Upack의 OEP 찾는 부분을 진행하고있습니다.

    그런데 압축되어있는 실습예제의 notepad.exe가 언패킹이 되지 않은 것 같습니다.

    참고해주셨으면 합니다!

    또한 책 전반에 걸쳐서 16진수와 10진수의 구분이 애매하게 되어있어서

    PE구조를 분석할때 자주 헷갈리네요. 혹시 다음에 개정판을 내실 의향이 있으시다면

    '0x'와 같이 분류를 해주셨으면 합니다^^




PE File Format


지금까지 오랜 시간에 걸쳐 PE(Portable Executable) File Format 에 대해 살펴보았습니다.

PE 스펙을 보면 각 구조체 멤버 하나하나 자세히 기술하고 있지만
리버싱에서 주목해야 하는 멤버들만 추려서 설명드렸습니다.

특히 IAT, EAT 에 관한 내용은 실행압축(Run-Time Packer), Anti-Debugging, DLL Injection, API Hooking
매우 다양한 중/고급 리버싱 주제들의 기반 지식이 됩니다.

hex editor 와 연필, 종이만 가지고 IAT/EAT 의 주소를 하나하나 계산해서
파일/메모리 에서 실제 주소를 찾는 훈련을 많이 해보시기 바랍니다.

쉽지 않은 내용이지만 그만큼 리버싱에서 중요한 위치를 차지하고 있기 때문에
고급 리버싱을 원하는 분들께서는 반드시 습득하셔야 합니다.



PEView.exe


간단하고 사용하기 편리한 PE Viewer 프로그램(PEView.exe)을 소개해 드립니다.
(개인이 만든 무료 공개 SW 입니다.)

http://www.magma.ca/~wjr/PEview.zip

아래는 PEView.exe 의 실행 화면입니다.


PE Header 를 각 구조체 별로 보기 쉽게 표현해주고, RVA <-> File Offset 변환을 간단히 수행해줍니다.
(제가 설명드렸던 내용과 용어 사용에 있어서 약간 틀릴 수 있습니다. 둘 다 익혀두시는게 의사소통에 좋습니다.)

위와 같은 PE Viewer 를 직접 제작해 보시는 것을 추천드립니다.
저 또한 처음 PE Header 를 공부할 때 (검증을 위해) 콘솔 기반의 PE Viewer 를 만들어서 지금까지 잘 사용하고 있습니다.
직접 제작하다 보면 자신이 잘 몰랐거나 잘 못 이해하던 부분을 정확히 파악하고 제대로 공부할 수 있습니다.



PE Patch


PE 스펙은 말 그대로 권장 스펙이기 때문에 각 구조체 내부에 보면 사용되지 않는 많은 멤버들이 많이 있습니다.

또한 말 그대로 스펙만 맞추면 PE 파일이 되기 때문에 일반적인 상식을 벗어나는 PE 파일을 만들어 낼 수 있습니다.

PE Patch 란 바로 그런 PE 파일을 말합니다.
PE 스펙에 어긋나지는 않지만 굉장히 창의적인(?) PE Header 를 가진 파일들입니다.
(정확히 표현하면 PE Header 를 이리저리 꼬아 놨다고 할 수 있습니다.)

PE Patch 만 해도 따로 고급 주제로 다뤄야 할 만큼 (리버싱에 있어서) 넓고도 깊은 분야입니다.

한가지만 소개해 드리겠습니다.
지금까지 배웠던 PE Header 에 대한 상식이 사뿐히 깨지는 경험을 하실 수 있습니다.
(그러나 PE 스펙에 벗어난건 없답니다.)

아래 사이트는 tiny pe 라고 가장 작은 크기의 PE 파일을 만드는 내용입니다.

http://blogs.securiteam.com/index.php/archives/675

411 byte 크기의 (정상적인) PE 파일을 만들어 냈습니다.
IMAGE_NT_HEADERS 구조체 크기만 해도 248 byte 라는걸 생각하면 이것은 매우 작은 크기의 PE 파일입니다.

다른 사람들이 계속 도전해서 304 byte 크기의 파일까지 나타나게 됩니다.

그리고 마지막으로 어떤 다른 사람이 위 사이트를 본 후 자극을 받아서
아래와 같이 극단적이고 매우 황당한 PE 파일을 만들어 내었습니다.

http://www.phreedom.org/solar/code/tinype/

이곳에 가면 Windows XP 에서 정상 실행되는 97 byte 짜리 PE 파일을 다운 받을 수 있습니다.
(2009년 4월 현재까지 최고 기록입니다.)
또한 PE Header 와 tiny pe 제작과정에 대한 내용을 자세히 설명하고 있어서 읽어보시면 크게 도움이 되실 겁니다.
(약간의 assembly 언어에 대한 지식이 요구됩니다.)

모두 다운 받아서 하나씩 분석해 보시기 바랍니다. 분명 크게 도움이 됩니다.



Epilogue


이러한 PE patch 파일들은 저뿐만 아니라 일반적인 리버서들의 고정관념을 깨트리는 내용이며
그래서 리버싱 공부가 더 즐겁습니다.

PE Header 에 대해서 다시 한번 강조 하고 싶은 내용은 아래와 같습니다.

- PE 스펙은 그저 스펙일 뿐이다. (만들어 놓고 사용되지 않는 내용이 많다.)
- 내가 지금 알고 있는 PE Header 에 대한 지식도 잘 못된 부분이 있을 수 있다.
   (tiny pe 외에도 PE header 를 조작하는 여러 창의적인 기법들이 계속 쏟아져 나온다.)
- 항상 모르는 부분을 체크해서 보강하자.

앞으로 제 블로그에서 다양한 형태의 PE 파일들을 분석할 예정입니다.
재밌고 특이한 PE Header 조작 기법에 대해서는 그때 그때 소개해 드리도록 하겠습니다.




  1. Ezbeat 2009.12.26 12:12 신고 댓글주소 | 수정 | 삭제 | 댓글

    오호... 97Byte짜리 PE파일... 신기하네요..

  2. hd5535 2010.01.22 18:04 신고 댓글주소 | 수정 | 삭제 | 댓글

    앗! PE뷰어 찾고 있었는데, 잘쓸게요^ㅡ^*
    PE 내용도 잘 읽어보고 갑니다

  3. straycat45 2010.01.27 03:10 신고 댓글주소 | 수정 | 삭제 | 댓글

    ^^* 우와~ ㅋㅋ
    파일 오프셋(RAW)구하는거랑, 임포트, 익스포트 함수가 이해 안돼서
    엄청 고생하고 있었는데, ㅠㅠㅋㅋ
    설명이 넘 잘돼있어요 ^^ㅋㅋ
    잘 보구 갑니다 !!

  4. Vi0 2010.08.04 22:45 신고 댓글주소 | 수정 | 삭제 | 댓글

    정말 이런블로그가 있다는것에 감사합니다 !
    설명이 너무 자세하게 잘나와있네요.
    웬만하면 댓글같은거 달지않는데
    질문도 올리고 이렇게 좋은 설명 받아먹으면서
    감사하단 말도 써놓지 않기엔 양심이 걸려서..
    정말로 감사드립니다 : )
    www.reversecore.com/2 부터 쭉 읽고있는데
    다 읽으면 제 리버싱에 엄청난 발전이 있을거같은 기대감이 ~.~

  5. 초보 2011.03.16 00:58 신고 댓글주소 | 수정 | 삭제 | 댓글

    PE에 대한 글을 읽고 궁금증이 생겼습니다.
    Relese로 만들어진 파일도 이렇게 분석이 가능한가요?
    Debug로 만들어진 파일만..?

    • reversecore 2011.03.16 21:33 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      Debug/Release 상관없이 전부 해석 가능합니다.
      두 버전의 차이는 주로 디버깅을 위한 추가적인 코드가 있느냐 없느냐의 차이입니다.

      감사합니다.

  6. 궁금한너구리 2011.07.17 03:39 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버스코어님 강의 너무 좋습니다. (쵝오!!~^^b)
    이제야겨우 PE부분 다 봤네요.
    앞으로도 강의 열심히 습득하겠습니다.~ㅋㅋㅋㅋㅋㅋ

    아.. 그리고 하나 궁금한게 있는데요. 문뜩 떠오른건데
    notepad.exe 하고 보통 .txt로 저장된 파일하고, 아이콘모양은 같애보여도 다른파일이지요?
    예를들어 메모장에 문자열"AAAA"를 입력하고 저장한 파일은 메모장(notepad.exe)에 연결된
    파일이지만 실질적으로 "AAAA"문자열이 바이너리의 전부인거죠? 파일입출력하려는데 약간
    헷갈려서 질문합니다. ㅋㅋㅋ

    아!.. 또생각났는데요;; 만약 위에 AAAA 파일 바이너리가 AAAA뿐이라면 이 .txt파일의 제목은 어디다 저장하죠?

    • reversecore 2011.07.20 08:43 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      파일은 확장자 보다는 파일의 형식에 의해서 구분되는 것이죠. 다만 윈도우즈 기본 쉘인 탐색기에서 확장자를 보고 아이콘을 연결해 준 것이구요.

      파일이름은 파일시스템(NTFS, FAT32)에 저장됩니다. 파일에 저장되지 않습니다.

      감사합니다.

  7. Genesis 2012.03.08 01:59 신고 댓글주소 | 수정 | 삭제 | 댓글

    오늘 dll 인젝션 공부할려고 검색하다가 왔는데 API 후킹에, PE 까지 잘 배우고 갑니다^^

  8. taso 2012.07.05 06:55 신고 댓글주소 | 수정 | 삭제 | 댓글

    리버싱을 본격적으로 시작한지 별로 안되서
    아직, 배운 내용이 얼마나 활용될진 아직 예측도 못하겠지만,,
    계속 공부하다보면 감사하단 말 안써놓은게 후회될거같아서 이렇게 댓글남겨요 ㅋ
    좋은 내용 잘 배우고 갑니다.
    계속 공부 열심히할게요 ㅋ

  9. ace 2012.07.12 14:51 신고 댓글주소 | 수정 | 삭제 | 댓글

    정말 글 잘읽었습니다. 힘들게 공부하신거 이렇게 쉽게 가져가도 될까 싶을정도로 쉽게 잘 정리해놓으셨네요!! 자주 들러서 공부하겠습니다. 감사합니다~




NT header



NT header 구조체 IMAGE_NT_HEADERS 입니다.

typedef struct _IMAGE_NT_HEADERS {
    DWORD Signature;                          // PE Signature : 50450000 ("PE"00)
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

* 출처 : Microsoft 의 Visual C++ 에서 제공하는 winnt.h


위 구조체는 32 bit 용이며, 64 bit 용은 세번째 멤버가 IMAGE_OPTIONAL_HEADER64 입니다.

IMAGE_NT_HEADER 구조체는 3개의 멤버로 되어 있는데요,
제일 첫 멤버는 Signature 로서 50450000h ("PE"00) 값을 가집니다. (변경불가!)
그리고 FileHeader OptionalHeader 구조체 멤버가 있습니다.

notepad.exe 의 IMAGE_NT_HEADERS 의 내용을 hex editor 로 살펴보겠습니다.


IMAGE_NT_HEADERS 구조체의 크기는 F8h 입니다. 상당히 큰 구조체 입니다.
FileHeader 와 OptionalHeader 구조체를 하나하나 살펴보겠습니다.



IMAGE_NT_HEADERS - IMAGE_FILE_HEADER


파일의 개략적인 속성을 나타내는 IMAGE_FILE_HEADER 구조체 입니다.

typedef struct _IMAGE_FILE_HEADER {
    WORD    Machine;
    WORD    NumberOfSections;

    DWORD   TimeDateStamp;
    DWORD   PointerToSymbolTable;
    DWORD   NumberOfSymbols;
    WORD    SizeOfOptionalHeader;
    WORD    Characteristics;

} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

* 출처 : Microsoft 의 Visual C++ 에서 제공하는 winnt.h

IMAGE_FILE_HEADER 구조체에서 아래 4 가지 멤버들이 중요합니다.
(이 값들이 정확히 세팅되어 있지 않으면 파일은 정상적으로 실행되지 않습니다.)


#1. Machine
Machine
넘버는 CPU 별로 고유한 값이며 32 bit Intel 호환 칩은 14Ch 의 값을 가집니다.
아래는 winnt.h 파일에 정의된 Machine 넘버의 값들입니다. (일반적인 14Ch 의 값을 기억하면 됩니다.)

#define IMAGE_FILE_MACHINE_UNKNOWN           0
#define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.
#define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian
#define IMAGE_FILE_MACHINE_R4000             0x0166  // MIPS little-endian
#define IMAGE_FILE_MACHINE_R10000            0x0168  // MIPS little-endian
#define IMAGE_FILE_MACHINE_WCEMIPSV2         0x0169  // MIPS little-endian WCE v2
#define IMAGE_FILE_MACHINE_ALPHA             0x0184  // Alpha_AXP
#define IMAGE_FILE_MACHINE_POWERPC           0x01F0  // IBM PowerPC Little-Endian
#define IMAGE_FILE_MACHINE_SH3               0x01a2  // SH3 little-endian
#define IMAGE_FILE_MACHINE_SH3E              0x01a4  // SH3E little-endian
#define IMAGE_FILE_MACHINE_SH4               0x01a6  // SH4 little-endian
#define IMAGE_FILE_MACHINE_ARM               0x01c0  // ARM Little-Endian
#define IMAGE_FILE_MACHINE_THUMB             0x01c2
#define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64
#define IMAGE_FILE_MACHINE_MIPS16            0x0266  // MIPS
#define IMAGE_FILE_MACHINE_MIPSFPU           0x0366  // MIPS
#define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466  // MIPS
#define IMAGE_FILE_MACHINE_ALPHA64           0x0284  // ALPHA64
#define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64



#2. NumberOfSections
PE 파일은 코드, 데이타, 리소스 등이 각각의 섹션에 나뉘어서 저장된다고 설명드렸습니다.
NumberOfSections 는 바로 그 섹션의 갯수를 나타냅니다.

이 값은 반드시 0 보다 커야 합니다.

정의된 섹션 갯수보다 실제 섹션이 적다면 실행 에러가 발생하며,
정의된 섹션 갯수보다 실제 섹션이 많다면 정의된 갯수만큼만 인식됩니다.


#3. SizeOfOptionalHeader
IMAGE_NT_HEADERS 구조체의 마지막 멤버는 IMAGE_OPTIONAL_HEADER32 구조체입니다.
SizeOfOptionalHeader 멤버는 바로 이 IMAGE_OPTIONAL_HEADER32 구조체의 크기를 나타냅니다.

IMAGE_OPTIONAL_HEADER32 는 C 언어의 구조체이기 때문에 이미 그 크기가 결정되어 있습니다.
그런데 Windows 의 PE Loader 는 IMAGE_FILE_HEADER 의 SizeOfOptionalHeader 값을 보고
IMAGE_OPTIONAL_HEADER32 구조체의 크기를 인식합니다.


IMAGE_DOS_HEADER 의 e_lfanew 멤버와 IMAGE_FILE_HEADER 의 SizeOfOptionalHeader 멤버 때문에
일반적인(상식적인) PE 파일 형식을 벗어나는 일명 '꽈배기' PE 파일(PE Patch) 이 만들 수 있습니다.
(나중에 PE Patch 에 대해서 상세히 설명하도록 하겠습니다.)


#4. Characteristics
파일의 속성을 나타내는 값으로써, 실행이 가능한 형태인지(executable or not)
혹은 DLL 파일인지 등의 정보들이 bit OR 형식으로 조합됩니다.

아래는 winnt.h 파일에 정의된 Characteristics 값들입니다. (0002h 와 2000h 의 값을 기억해 두세요.)

#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // Relocation info stripped from file.
#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable 
                                                     // (i.e. no unresolved externel references).

#define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // Line nunbers stripped from file.
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED       0x0008  // Local symbols stripped from file.
#define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010  // Agressively trim working set
#define IMAGE_FILE_LARGE_ADDRESS_AWARE       0x0020  // App can handle >2gb addresses
#define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
#define IMAGE_FILE_32BIT_MACHINE             0x0100  // 32 bit word machine.
#define IMAGE_FILE_DEBUG_STRIPPED            0x0200  // Debugging info stripped from
                                                     // file in .DBG file

#define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // If Image is on removable media, 
                                                     // copy and run from the swap file.

#define IMAGE_FILE_NET_RUN_FROM_SWAP         0x0800  // If Image is on Net,
                                                     // copy and run from the swap file.

#define IMAGE_FILE_SYSTEM                    0x1000  // System File.
#define IMAGE_FILE_DLL                       0x2000  // File is a DLL.
#define IMAGE_FILE_UP_SYSTEM_ONLY            0x4000  // File should only be run on a UP machine
#define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.


참고로 PE 파일중에 Characteristics 값에 0002h 가 없는 경우(not executable)가 있을까요?
네, 있습니다. 예를 들어 *.obj 와 같은 object 파일이 그런 경우이고, resource DLL 같은 파일이 그런 경우 입니다.

이 정도면 IMAGE_FILE_HEADER 의 구조를 이해하는데 부족함이 없을 것입니다.

마지막으로 IMAGE_FILE_HAEDER 의 TimeDateStamp 멤버에 대해서 설명드리겠습니다.
이 값은 파일의 실행에 영향을 미치지 않는 값으로써 해당 파일의 빌드 시간을 나타낸 값입니다.
단, 개발 도구에 따라서 이 값을 세팅해주는 도구(VB, VC++)가 있고, 그렇지 않은 도구(Delphi)가 있습니다.
(또한 개발 도구의 옵션에 따라서 달라질 수 있습니다.)


이제 실제로 notepad.exe 의 IMAGE_FILE_HEADER 를 확인해 보겠습니다.


위 그림은 hex editor 로 봤을때의 그림이고, 이를 알아보기 쉽게 구조체 멤버로 표현하면 아래와 같습니다.

[ IMAGE_FILE_HEADER ] - notepad.exe

 offset   value   description

-------------------------------------------------------------------------------
000000E4     014C machine
000000E6     0003 number of sections
000000E8 48025287 time date stamp (Mon Apr 14 03:35:51 2008)
000000EC 00000000 offset to symbol table
000000F0 00000000 number of symbols
000000F4     00E0 size of optional header
000000F6     010F characteristics
                      IMAGE_FILE_RELOCS_STRIPPED
                      IMAGE_FILE_EXECUTABLE_IMAGE
                      IMAGE_FILE_LINE_NUMS_STRIPPED
                      IMAGE_FILE_LOCAL_SYMS_STRIPPED
                      IMAGE_FILE_32BIT_MACHINE


다음에는 NT header 의 세번째 멤버인 IMAGE_OPTIONAL_HEADER32 에 대해서 알아보겠습니다.

(continue)


 

  1. hoon038 2009.11.28 18:52 신고 댓글주소 | 수정 | 삭제 | 댓글

    감사합니다 잘 봤어요^^

  2. Ezbeat 2009.12.22 15:42 신고 댓글주소 | 수정 | 삭제 | 댓글

    시간날 때마다 조금씩 잘 읽어보고 있습니다 ^^
    음.. 잘못 표기한 부분이 있으신거 같네요;;
    IMAGE_FILE_HEADER부분을 설명 하신 후
    실제로 notepad.exe의 IMAGE_FILE_HEADER를 확인해 주신다고 하셨을 때
    IMAGE_FILE_HEADER부분이 아닌 IMAGE_NT_HEADERS멤버인 Signature변수가
    그림에 포함이 되어 있네요 ^^;;(4Byte)

  3. Lum4n 2010.07.17 08:41 신고 댓글주소 | 수정 | 삭제 | 댓글

    유익하게 보고있습니다ㅎㅎ 정말 이해하기 쉽게 설명해놓으셨군요 : )

  4. Acaicat 2010.08.12 00:03 신고 댓글주소 | 수정 | 삭제 | 댓글

    Charateristics에 관해 궁금한게 있는데요.
    그 0x0002와 0x2000을 기억해 두라고 하셨는데,
    아래 hex를 보면 0x010F인데 이것은 어떻게 봐야하나요?
    제 컴에서 켰을 때는 0x0102가 나와서
    winnt.h를 열어서 봤는데 이런 것 정의 에 없더라구요.
    혹시나 해서 win32 콘솔로 컴파일된 실행 파일을 넣어 봤는데 0x0102가 나오더라구요.
    이건 또 어떻게 봐야하는지 궁금합니다.

  5. db_click 2011.01.17 16:49 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요!
    눈팅만 하다가,
    궁금한게 생겼는데,

    검색 능력이 턱없이 부족한지라..
    질문 해도 되나요..ㅎㅎ

    * TimeDateStamp 값 해석
    노트패드를 PEView로 확인해 보니
    TimeDateStamp에 저장되는 값이
    0x47918EA2 가 나오던데요,
    이 값이 2008/01/19, 05:46:10 UTC 로
    풀어져있더라구요.
    어떻게 하면, 이렇게 해석이 될까요..

  6. TeamKhan 2011.04.01 17:59 신고 댓글주소 | 수정 | 삭제 | 댓글

    IMAGE_NT_HEADERS 구조체의 크기는 F8h 이란걸 어떻게 파악하신건가요 ?
    그리고 어떻게 실제로
    hex editor 부분에서
    이부분까지가 IMAGE_FILE_HEADER 인걸
    파악하셧나요 ?

    • reversecore 2011.04.06 01:07 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      C 언어의 구조체는 크기가 정해져 있으니 자연히 그 크기를 알 수 있구요. sizeof(IMAGE_NT_HEADERS) 연산자를 써도 알 수 있지요.

      그리고 구조체의 내부 구조를 훤히 알고 있으니 IMAGE_NT_HEADERS 구조체 시작부터 4 byte 이후가 IMAGE_FILE_HEADER 인걸 아는 거지요. ^^

      감사합니다.

  7. 강한이 2011.05.26 23:39 신고 댓글주소 | 수정 | 삭제 | 댓글

    위에 마지막 케릭터리스틱스에 010F로 되어있는데 원래 핵스는 뒤에서 읽어와서 그런건지 알겠고
    그밑에 부가적인 값들은 어떻게 계산하는건가요? 보니까 뒤에 읽어보니 OR명령어도 되있다고하는데 추가설명이 없네요.
    그리고 타임스템프는 어떻게 변환해야하는거죠?
    48025287-> Mon Apr 14 03:35:51 2008
    답변 부탁드려요

    • Zero 2011.05.31 14:35 신고 댓글주소 | 수정 | 삭제

      010F는 위에 써있는 옵션들을 모두 OR연산 할경우 나오는 값입니다.

      옵션으로인해

      0001
      0002
      0004
      0008
      값들이 합쳐서 F가 되는거구요.
      0100도 OR연산이 되어
      010F가 되는것입니다.

      타임스템프는 위에 C언어 함수를 사용하면 된다고 댓글에 있군요..

    • reversecore 2011.06.03 22:18 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      Zero 님께서 답변을 잘 해주셨네요~ 감사합니다. ^^

      참고로 VC++, SDK 를 설치하신 후 winnt.h 파일에 보시면 저 값의 정의가 나와 있습니다.

      #define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file.
      #define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references).
      #define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file.
      #define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file.
      #define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine.

      감사합니다.

  8. bp 2012.11.30 16:42 신고 댓글주소 | 수정 | 삭제 | 댓글

    안녕하세요.
    characteristics에서 add 연산을 사용할 수는 없을까요?
    or 연산을 사용하는 특별한 이유가 있나요?

    • reversecore 2012.12.02 19:00 신고 댓글주소 | 수정 | 삭제

      안녕하세요.

      좋은 질문이네요~

      Characteristics 는 각 bit 별로 의미를 가지는 형태입니다. 이러한 형태는 C언어의 강력한 bit 단위 처리 능력을 활용할 수 있기 때문에 관례적으로 OR 명령으로 처리되고 있습니다.

      말씀하신대로 ADD 로도 됩니다만, 의미를 부여하기 위해 (그 bit 를 ON 시킨다.) OR 를 쓰게되면 프로그래머들끼리 의사 전달이 명확하게 되지요. "아~ bit 처리를 이용한 FLAG 사용법이군~" 하고 말이죠. ^^

      감사합니다.





티스토리 툴바