【학습】 Windows PE 파일 학습(1: 테이블 내보내기)

21072 단어
오늘은 PE 파일 내보내기 표를 읽는 작은 프로그램을 만들어서 공부에 사용했다.
WindowsPE Wide Guide라는 책을 참조하십시오.
먼저 PE 파일의 전체 이름은 Portable Executable이고 이식 가능한 실행 가능한 파일이며 흔히 볼 수 있는 EXE, DLL, OCX, SYS,COM은 모두 PE 파일이다.
우리는 Windows 프로그램이 실행하는 모든 기능이 시스템 DLL에서 제공하는 API 함수를 거의 호출하는 것을 알고 있다.DLL에서 제공하는 함수를 사용하려면 가져오기 테이블에 사용할 수 있도록 가져와야 합니다.그러나 내보낸 함수를 제공하는 DLL 프로그램의 경우 내보내기 테이블을 사용하여 함수를 내보낸 다음 다른 프로그램에서 사용할 수 있습니다.시스템이 제공하는 표준 DLL이든 개인이 작성한 DLL이든 자신의 함수를 다른 사람에게 제공하려면 내보내기 표를 만들어야 한다.일반적으로 개발 환경을 사용하여 내보내기 기능을 가진 프로그램을 작성하는데 내보내기 테이블은 링크가 자동으로 만든다.프로그래머는 내보낸 함수 이름이나 번호만 지정하면 됩니다.
내보내기 테이블은 일반적으로 DLL 파일에 나타납니다.도다타 축제에서
내보내기 표의 위치를 알면 내보내기 함수의 주소를 얻을 수 있고 이 함수에 대해 훅을 할 수 있다.현재 우리의 목적은 PE 파일에서 도출된 표의 구성을 배우기 위해서이기 때문에 PE 파일의 구조를 이해할 필요가 있다.
  
1 기본 개념
참고: 다음 참조 섹션은 모두 네트워크에서 온 것입니다.
다음 표에서는 이 문서에 포함된 몇 가지 개념을 설명합니다. 이름: 묘사 소재지 물리적 주소가 아닌 가상 주소입니다.왜'물리적 주소'가 아니죠?데이터가 메모리에 있는 위치가 자주 바뀌기 때문에 메모리 비용을 절약하고 잘못된 메모리 위치를 피하는 등 장점이 있다.또한 사용자는 구체적인'실제 주소'를 알 필요가 없다. 왜냐하면 시스템 자체가 프로그램을 위해 메모리 공간을 준비할 것이다(메모리가 충분하기만 하면) 파일 대칭복사 EXE 파일은 실행 파일로, DLL 파일은 Dynamic Link Library로 표시됩니다.미러링을 사용하는 이유이것은 그들이 자주 메모리에 직접 복제되기 때문에, '거울' 이라는 어떤 뜻이 있기 때문이다.서양인들은 상상력이 좋은가 봐요^0^ RVA 영어의 전체 이름은 Relatively Virtual Address입니다.오프셋(상대 가상 주소라고도 함)대칭복사 기준의 상대적 오프셋(때로는 상대적인 거울의 주소가 아니라 어떤 구조의 첫 번째 주소를 주소로 할 수도 있다) 명절 섹션은 PE 파일의 코드 또는 데이터의 기본 단위입니다.원칙적으로 말하자면, 절은'코드 절'과'데이터 절'로만 나뉜다.(파일의 바이트 크기는 보통 디스크의 물리적 섹터인 512B로 정렬되며, 거울 파일이 메모리에 불러오면 메모리 페이지 크기로 32비트는 4K, 64비트는 8K) VA 영어 전체 이름은 Virtual Address입니다.가상 주소(가상 메모리의 정상 주소, 변환 필요 없음)

특수한 바이트가 있습니다. 파일에서든 메모리에서든, 정렬 입도는 다른 바이트와 다릅니다. 예를 들어 자원 바이트는 두 글자로 정렬됩니다.
2 PE 파일의 구조
PE 문서의 전체적인 구조: 형상적으로 말하면 머리 3개와 몸통이다.3개의 머리는 Dos 머리, Nt 머리와 바이트(바이트)이고 몸은 하나의 바이트(데이터와 코드를 저장하는 곳) 이상의 각 머리는 데이터 구조로 winnt에서 사용할 수 있다.h헤드 파일에서 대응하는 struct 정의를 찾았습니다. (Nt 헤드는 32비트와 64비트로 나뉘어 있습니다.)
PE 파일은 Windows NT 이전의 Dos 시스템을 호환하기 때문에 현재의 어떤 PE 파일도 Dos 시스템에 가져가면 실행할 수 있지만 대부분은'This program cannot be run in DOS mode'라는 한마디만 할 수 있다.PE 파일의 구조에서 Dos 헤드에 의해 결정됩니다.
메모장으로 모든 거울 파일을 열 때, 첫 두 바이트는 반드시 문자열 'MZ' 이다. 이것은 마크 Zbikowski의 이름 줄임말로, 그는 최초의 MS-DOS 디자이너 중의 하나이다.그 다음은 MS-DOS에서 프로그램을 실행할 때 사용할 매개 변수입니다.이러한 매개변수의 끝 부분인 파일의 오프셋 0x3C(60바이트)에는 4바이트 PE 파일 서명의 오프셋 주소가 있습니다.이 주소에는 "E lfanew"라는 고유 이름이 있습니다.이 서명은 'PE00' (자모 'P' 와 'E' 뒤에 두 개의 빈 바이트가 뒤따른다) 이다.뒤이어 Elfanew는 MS-DOS 프로그램입니다.MS-DOS에서 실행되는 올바른 애플리케이션입니다.실행 가능한 파일 (일반적으로 exe,com 파일) 이 MS-DOS에서 실행될 때, 이 프로그램은 "This program cannot be run in DOS mode (이 프로그램은 DOS 모드에서 실행할 수 없습니다)" 라는 메시지를 표시합니다.사용자도 스스로 이 프로그램을 변경할 수 있는데, 일부 복원 소프트웨어는 이렇게 한다.또한, 일부 프로그램은 DOS와 Windows에서 실행될 수 있기 때문이다.Notepad.exe 전체 DOS 헤더 크기는 24바이트입니다. DOS에서 실행할 수 없는 대부분의 Win32 파일은 이 값입니다.MS-DOS 프로그램은 있어도 되고 없어도 된다. 만약 파일 크기를 가능한 한 작게 하려면 MS-DOS 프로그램을 절약하고 앞의 매개 변수를 모두 0으로 정리할 수 있다.

3 Nt 헤드 IMAGENT_HEADERS
PE 파일의 비교적 복잡한 부분이 바로 여기다.
2에서 말한 DosHeader->Elfanew가 가리키는 서명'PE\0\0'은 바로 Nt 헤드의 첫 번째 구성원입니다. 우리가 프로그래밍에서 Nt 헤드를 얻는 방법도 이렇게 합니다. 왜냐하면 Dos 헤드의 두 번째 부분인 MS-DOS 프로그램 부분의 크기는 바꿀 수 있기 때문입니다. 전체 Dos와 함께 길지 않습니다. 그 중의 E 만 있습니다.lfanew는 자신의 끝을 가리킨다.
Nt 헤드는 서명 4바이트를 제외한 두 부분으로 나뉘어져 있습니다.
winnt를 주십시오.h의 정의
1 typedef struct _IMAGE_NT_HEADERS {
2     DWORD Signature;                        //4 bytes PE     :(e_lfanew)->‘PE\0\0’
3     IMAGE_FILE_HEADER FileHeader;           //20 bytes PE         
4     IMAGE_OPTIONAL_HEADER32 OptionalHeader; //224bytes PE         
5 } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

여기서 IMAGEFILE_HEADER 파일 헤더, IMAGEOPTIONAL_HEADER32를 옵션 이미지 헤더라고 합니다.약간 익살스러운 것은 옵션 헤더는 PE 파일에서 가장 중요하고 복잡한 부분이라고 할 수 있지만 선택할 수 있다.
동시에 우리는 옵션 헤더가 32비트와 64비트 PE 파일에서 구조가 다르다는 것을 보았다. 주의, 단지 다를 뿐이지 대체적으로 별 차이가 없다.그러나 프로그래밍에서 우리는 반드시 그것을 고려해야 한다. 옵션 헤더가 다르기 때문에 Nt 헤더도 다를 것이다.
typedef struct _IMAGE_FILE_HEADER {
    WORD    Machine;                //    
    WORD    NumberOfSections;        //      
    DWORD   TimeDateStamp;            //         
    DWORD   PointerToSymbolTable;    //     (      )
    DWORD   NumberOfSymbols;        //        
    WORD    SizeOfOptionalHeader;        //IMAGE_OPTIONAL_HEADER32     
    WORD    Characteristics;            //    
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

그러나 파일 헤더는 명확했다. 그 중에서 비교적 자주 사용하는 멤버는 Machine과Characteristics였다.모두 판단에 사용되는 것이다. 그 중에서 Machine은 PE 파일이 실행되어야 하는 목표 플랫폼을 상징한다. 즉, 어떤 지령집의 CPU 플랫폼에 불러오기를 기대하는지 일반적으로 PE 파일이 64비트인지 32비트인지 판단할 수 있다.Characteristics는 표지 위치의 방식으로 PE 파일에 대한 많은 정보를 판단하는데 그 중에서 가장 중요한 것은 dll인지 아닌지를 판단하는 것이다. 사용할 때와 (&)에 사용하면 된다.
#define IMAGE_FILE_RELOCS_STRIPPED           0x0001  // Relocation info stripped from file.
#define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable  (i.e. no unresolved external references).            , dll             ,  exe sys        
#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  // Aggressively 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.

#define IMAGE_FILE_MACHINE_UNKNOWN           0
#define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.32 
#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_SH3               0x01a2  // SH3 little-endian
#define IMAGE_FILE_MACHINE_SH3DSP            0x01a3
#define IMAGE_FILE_MACHINE_SH3E              0x01a4  // SH3E little-endian
#define IMAGE_FILE_MACHINE_SH4               0x01a6  // SH4 little-endian
#define IMAGE_FILE_MACHINE_SH5               0x01a8  // SH5
#define IMAGE_FILE_MACHINE_ARM               0x01c0  // ARM Little-Endian
#define IMAGE_FILE_MACHINE_THUMB             0x01c2  // ARM Thumb/Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_ARMNT             0x01c4  // ARM Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_AM33              0x01d3
#define IMAGE_FILE_MACHINE_POWERPC           0x01F0  // IBM PowerPC Little-Endian
#define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1
#define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64 64 
#define IMAGE_FILE_MACHINE_MIPS16            0x0266  // MIPS
#define IMAGE_FILE_MACHINE_ALPHA64           0x0284  // ALPHA64
#define IMAGE_FILE_MACHINE_MIPSFPU           0x0366  // MIPS
#define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466  // MIPS
#define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64
#define IMAGE_FILE_MACHINE_TRICORE           0x0520  // Infineon
#define IMAGE_FILE_MACHINE_CEF               0x0CEF
#define IMAGE_FILE_MACHINE_EBC               0x0EBC  // EFI Byte Code
#define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8) 64 
#define IMAGE_FILE_MACHINE_M32R              0x9041  // M32R little-endian
#define IMAGE_FILE_MACHINE_CEE               0xC0EE

다음은 헤더 IMAGEOPTIONAL_HEADER.
  오프셋(32/64) 크기 영문 중국어 묘사 0 2 Magic 마수 이 무기호 정수는 거울 파일의 상태를 가리킨다.0x10B는 32비트 미러 파일임을 나타냅니다.0x107은 ROM 미러임을 나타냅니다.0x20B는 64비트 미러 파일임을 나타냅니다. 2 1 MajorLinkerVersion 링크의 주 버전 번호 링크의 주 버전 번호입니다. 3 1 MinorLinkerVersion 링크기의 보조 버전 번호 링크의 보조 버전 번호입니다. 4 4 SizeOfCode 코드 바이트 크기 일반적으로 ".text" 섹션에 넣습니다.만약 여러 개의 코드 바이트가 있다면, 그것은 모든 코드 바이트의 합이다.파일의 크기와 FileAlignment의 정수 배가 되어야 합니다. 8 4 SizeOfInitializedData 초기화된 크기 일반적으로 ".data" 섹션에 넣습니다.만약 여러 개의 이런 절이 있다면, 그것은 모든 이 절들의 합이다.파일의 크기와 FileAlignment의 정수 배가 되어야 합니다. 12 4 SizeOfUninitializedData 초기화되지 않은 크기 일반적으로.bss절에 넣는다.만약 여러 개의 이런 절이 있다면, 그것은 모든 이 절들의 합이다.파일의 크기와 FileAlignment의 정수 배가 되어야 합니다. 16 4 AddressOfEntryPoint 입구점 실행 가능한 파일이 메모리에 로드될 때 해당 엔트리 포트 RVA일반 프로그램 렌즈에 대해 말하자면, 그것은 바로 시작 주소이다.0이면 ImageBase에서 시작합니다.dll 파일은 선택할 수 있습니다. 20 4 BaseOfCode 코드 주소 미러가 메모리에 로드될 때 코드 섹션의 시작 RVASectionAlignment의 정수 배여야 합니다. 24 4 BaseOfData 데이터 주소 미러가 메모리에 로드될 때 데이터 섹션의 시작 RVA64비트 파일에서 다음 ImageBase에 병합됩니다.SectionAlignment의 정수 배여야 합니다. 28/24 4/8 ImageBase 미러링 기준 메모리에 불러올 때 거울의 첫 번째 바이트의 첫 번째 주소입니다.64K의 배수여야 합니다.DLL 기본값은 10000000H입니다.Windows CE의 EXE 기본값은 00010000H입니다.Windows 시리즈의 EXE 기본값은 00400000H입니다. 32 4 SectionAlignment 메모리 정렬 메모리에 불러올 때의 정렬 값 (바이트).FileAlignment 이상이어야 합니다.기본값은 해당 시스템의 페이지 크기입니다. 36 4 FileAlignment 파일 정렬 거울 파일의 바이트에 있는 원시 데이터를 정렬하는 데 사용되는 정렬 인자 (바이트).이것은 512와 64K 사이의 2의 멱이어야 한다.기본값은 512입니다.SectionAlignment가 해당 시스템의 페이지 크기보다 작으면 FileAlignment는 SectionAlignment와 같아야 합니다. 40 2 MajorOperatingSystemVersion 마스터 시스템의 마스터 버전 번호 운영 체제의 버전 번호는 내 컴퓨터→도움말에서 볼 수 있으며 Windows XP는 5.1입니다.5는 주 버전 번호이고 1은 차 버전 번호이다 42 2 MinorOperatingSystemVersion 마스터 시스템의 보조 버전 번호 44 2 MajorImageVersion 미러의 1차 버전 번호 46 2 MinorImageVersion 미러의 보조 버전 번호 48 2 MajorSubsystemVersion 서브시스템의 주 버전 번호 50 2 MinorSubsystemVersion 서브시스템의 보조 버전 번호 52 2 Win32VersionValue 보존, 0이어야 함 56 4 SizeOfImage 미러 크기 거울이 메모리에 불러올 때의 크기, 모든 파일 헤더를 포함합니다.SectionAlignment의 배수로 반올림합니다. 60 4 SizeOfHeaders 머리 크기 모든 헤드의 총 크기는 FileAlignment의 배수로 반올림됩니다.이 값을 PE 파일의 첫 번째 섹션에 대한 파일 오프셋으로 사용할 수 있습니다. 64 4 CheckSum 체크섬 대칭복사된 파일의 체크섬계산 검사 알고리즘이 Imagehlp.에 통합되었습니다.DLL다음 프로그램은 로드할 때 모든 드라이버, 부트할 때 로드된 DLL 및 중요한 Windows 프로세스에 로드된 DLL을 확인하는 검증을 받습니다. 68 2 Subsystem 서브시스템 유형 이 미러를 실행하는 데 필요한 서브시스템입니다.다음 Windows 서브시스템 섹션을 참조하십시오. 70 2 DllCharacteristics DLL 식별 뒤에 있는 DLL 피쳐 섹션을 참조하십시오. 72 4/8 SizeOfStackReserve 스택 예약 크기 최대 스택 크기입니다.CPU 스택기본값은 1MB입니다. 76/80 4/8 SizeOfStackCommit 스택 커밋 크기 처음 커밋된 스택 크기입니다.기본값은 4KB입니다. 80/88 4/8 SizeOfHeapReserve 스택 보존 크기 최대 무더기 크기.컴파일러가 분배했어.기본값은 1MB입니다. 84/96 4/8 SizeOfHeapCommit 스택 교차 크기 처음 제출한 부분적 퇴적 공간 크기기본값은 4KB입니다. 88/104 4 LoaderFlags 보존, 0이어야 함 92/108 4 NumberOfRvaAndSizes 디렉토리 항목 수 데이터 디렉토리 항목의 개수입니다.이전 Windows NT 릴리즈로 인해 16 만 지원됩니다. 96/112 8*16 DataDirectory 데이터 카탈로그 카탈로그 항목 배열, 16개의 카탈로그 항목 포함  

이것은 완전한 옵션 헤더의 구조이다. 그 중에서Magic와DataDirectory만 언급하고 거울을 불러올 때의 기본 주소와 방향을 바꾸는 문제에 대해 본고는 소개하지 않는다. 왜냐하면PE 파일 해석은 거울을 우리 프로그램에 불러올 필요가 없기 때문에 메모리에 비추고 그 내용을 분석하면 된다.
Magic 도메인을 판단하면 파일이 64비트인지 32비트인지 구분할 수 있기 때문에 지금까지 두 가지 방법으로 구분할 수 있습니다.
본고의 주역인 도출표는 DataDirectory[0]의 카탈로그 항목에 의해 지적된 것으로 구체적으로 다음과 같다.
typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;
    DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

이를 통해 알 수 있듯이 DataDirectory는 도출표를 직접 가리키는 것이 아니라 진실은 다음과 같다. DataDirectory는 하나의 수조이고 항목마다 똑같다. IMAGEDATA_DIRECTORY, 모든 항목은 하나의 주소와 크기입니다. 이것은 테이블을 내보내는 기본 주소와 크기를 알려 줍니다. (이 크기를 얕보지 마십시오. 우리가 사용할 것입니다.)
도출표의 주소와 크기를 얻으면 우리는 일을 할 수 있다(23333~).
typedef struct _IMAGE_EXPORT_DIRECTORY {
    DWORD   Characteristics;
    DWORD   TimeDateStamp;
    WORD    MajorVersion;
    WORD    MinorVersion;
    DWORD   Name;            //     PE      
    DWORD   Base;           
    DWORD   NumberOfFunctions;     // 
    DWORD   NumberOfNames;      //             ,              ,    
    DWORD   AddressOfFunctions;     // RVA from base of image         EAT,     
    DWORD   AddressOfNames;         // RVA from base of image Nt                         
    DWORD   AddressOfNameOrdinals;  // RVA from base of image Nt                        ,        ,               
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

 
이것은 표를 내보내는 구조인데, 그 중에서 중요한 구역을 나는 빨간색 글자로 표시했다.
내가 인터넷에서 찾은 자료는 비교적 분명하게 말했다.
주소 테이블 내보내기(Export Address Table, EAT) 내보내기 주소표의 형식은 다음 표에서 설명한 두 가지 형식 중 하나입니다.지정한 주소가 내보내기 섹션에 있지 않으면, 이 필드는 Export RVA입니다.그렇지 않으면 이 도메인은 다른 DLL에 있는 기호의 이름을 나타내는 Forwarder RVA입니다. 오프셋 크기 도메인 묘사 0 4 Export RVA 메모리에 로드되면 함수 RVA를 내보냅니다. 0 4 Forwarder RVA 이것은 NULL로 끝나는 내보내기 섹션의 ASCII 문자열에 대한 포인터입니다.이 문자열은 Export Table(내보내기 테이블) 데이터 디렉토리 항목이 제공하는 범위 내에 있어야 합니다.이 문자열은 내보내기 함수가 있는 DLL의 이름과 내보내기 함수의 이름 (예: "MYDLL.expfunc"), 또는 DLL의 이름, 내보내기 함수의 순서 값 (예: "MYDLLL.#27") 을 보여 줍니다. Forwarder RVA는 현재 미러에서 내보낸 것처럼 보이는 다른 미러에 정의된 함수를 내보냅니다.따라서 현재 거울에 대해 말하자면 이 기호는 가져오기 함수이자 내보내기 함수이다. 예를 들어 Windows XP 시스템의 경우 Kernel32.dll 파일에서 내보낸 'HeapAlloc' 가 'NTDLL.RtlAllocateHeap' 으로 전송됩니다.따라서 어플리케이션에서 Windows XP 시스템의 Ntdll을 사용할 수 있습니다.dll 모듈은 실제적으로 가져오는 정보를 포함할 필요가 없습니다.응용 프로그램 가져오기 테이블은 Kernel32에만 적용됩니다.dll 관련. 내보내기 주소표의 값은 때때로 0입니다. 이것은 내보내기 함수가 없다는 것을 나타냅니다.이전 버전과 호환되기 위해 수정의 번거로움을 줄이기 위해서다. 내보내기 이름 포인터 테이블 내보내기 이름 포인터 테이블은 내보내기 이름 테이블에서 문자열의 주소(RVA)로 구성된 배열입니다.검색하기 편리하도록 2진법으로 정렬되었습니다. 이 내보내기 이름은 내보내기 이름 포인터 테이블에 내보내기 이름을 가리키는 포인터가 포함되어 있을 때만 정의됩니다.다시 말하면, 이름 바늘표를 내보내는 값은 0일 수 있는데, 이것은 이전 버전과 호환되기 위해서이다. 시퀀스 테이블 내보내기 내보내기 서열표는 내보내기 주소표의 인덱스로 구성된 그룹으로, 한 서열의 길이는 16자리이다.주소 테이블의 실제 인덱스를 내보내려면 순서 값에서 Ordinal Base 도메인을 빼야 합니다.주소표의 진정한 인덱스를 내보냅니다. 진정한 인덱스는 0에서 시작합니다.이를 통해 알 수 있듯이 마이크로소프트가 Ordinal Base를 만들어내는 것은 번거로움을 초래하는 것이다.내보내기 시퀀스 테이블의 값과 내보내기 주소 테이블의 인덱스의 값은 모두 기호가 없습니다. 내보내기 이름 포인터 테이블과 내보내기 이름 서수 테이블은 두 개의 병렬 그룹으로 각각 경계에 따라 (전자는 4 바이트, 후자는 2 바이트) 정렬할 수 있도록 분리합니다.작업을 진행할 때, 내보내기 이름 포인터라는 열에서 내보내기 함수의 이름을 제시하고, 내보내기 시퀀스라는 열에서 내보내기 함수에 대응하는 시퀀스를 제공한다.내보내기 이름 포인터 테이블의 구성원과 내보내기 시퀀스 테이블의 구성원은 같은 색인을 통해 연결됩니다. 이름 테이블 내보내기(Export Name Table, ENT) 내보내기 이름 테이블의 구조는 길이가 변할 수 있는 NULL로 끝나는 일련의 ASCII 코드 문자열입니다.내보내기 이름 테이블에는 내보내기 이름 포인터 테이블이 실제로 가리키는 문자열이 포함되어 있습니다.이 테이블의 RVA는 내보내기 이름 포인터 테이블의 첫 번째 값으로 결정됩니다.이 테이블의 문자열은 모두 함수 이름이며, 다른 파일은 그것들을 통해 호출할 수 있다.

특히 주의해야 할 것은, 때때로 당신이 주소표를 내보낼 때, 얻을 수 있는 것은 하나의 주소가 아니라 문자열일 수도 있다는 것이다.그럼 이게 함수가 전달되는 경우야.판단 방법은 위에서 말한 판단이다.
PE 파일을 배우면 그 중의 데이터 구조 조직을 상상하기 어려울 수 있습니다. 복잡하기 때문에 저는 인터넷에 접속해서 PE 파일의 각 구조에 대한 설명도를 찾아보는 것을 권장합니다.
전재 대상:https://www.cnblogs.com/Madridspark/p/WinPEFile.html

좋은 웹페이지 즐겨찾기