2012-11-25 2 views
0

왜 여기에 1을 사용하는지 혼란 스럽습니다. 누군가가이 라인이 매우 매우 매우 낮은 수준의 세부 사항에서하고있는 것을 설명 할 수 있습니까? 아니요. 오히려 그 구조를 1을 뺀 것 .... 더 자세히 ... 저수준에 대해 ... 감사해야합니다 ...PE 파일 형식 섹션 추가 기능

PIMAGE_SECTION_HEADER last_section = IMAGE_FIRST_SECTION(nt_headers) + (nt_headers->FileHeader.NumberOfSections - 1); 

위의 코드는 아래 함수이다

++ C 및 C에서
//Reference: http://www.codeproject.com/KB/system/inject2exe.aspx 
PIMAGE_SECTION_HEADER add_section(const char *section_name, unsigned int section_size, void *image_addr) { 
    PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)image_addr; 
    if(dos_header->e_magic != 0x5A4D) { 
     wprintf(L"Could not retrieve DOS header from %p", image_addr); 
     return NULL; 
    } 
    PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD_PTR)dos_header + dos_header->e_lfanew); 
    if(nt_headers->OptionalHeader.Magic != 0x010B) { 
     wprintf(L"Could not retrieve NT header from %p", dos_header); 
     return NULL; 
    } 
    const int name_max_length = 8; 
    PIMAGE_SECTION_HEADER last_section = IMAGE_FIRST_SECTION(nt_headers) + (nt_headers->FileHeader.NumberOfSections - 1); 
    PIMAGE_SECTION_HEADER new_section = IMAGE_FIRST_SECTION(nt_headers) + (nt_headers->FileHeader.NumberOfSections); 
    memset(new_section, 0, sizeof(IMAGE_SECTION_HEADER)); 
    new_section->Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_CNT_CODE; 
    memcpy(new_section->Name, section_name, name_max_length); 
    new_section->Misc.VirtualSize = section_size; 
    new_section->PointerToRawData = align_to_boundary(last_section->PointerToRawData + last_section->SizeOfRawData, 
     nt_headers->OptionalHeader.FileAlignment); 
    new_section->SizeOfRawData = align_to_boundary(section_size, nt_headers->OptionalHeader.SectionAlignment); 
    new_section->VirtualAddress = align_to_boundary(last_section->VirtualAddress + last_section->Misc.VirtualSize, 
     nt_headers->OptionalHeader.SectionAlignment); 
    nt_headers->OptionalHeader.SizeOfImage = new_section->VirtualAddress + new_section->Misc.VirtualSize; 
    nt_headers->FileHeader.NumberOfSections++; 
    return new_section; 
} 
+0

마지막 섹션을 가져 오려면 첫 번째 섹션과 섹션 수에서 1을 뺀 값으로 이동해야합니다. 예를 들어 섹션이 하나뿐이라면 마지막 섹션이기도하며 0을 추가해야합니다. 두 개의 섹션이있는 경우 마지막 섹션이 첫 번째 섹션입니다. –

+0

배열의 색인이 0부터 시작되기 때문에. 마지막 요소의 인덱스는'count - 1'입니다. 'last_section'은 마지막으로 존재하는 섹션을 가리키는 포인터이고,'new_section'은 다음 메모리가 갈 곳을 가리키는 포인터입니다 (유효한 메모리 주소 지정 방법을 알 수는 없지만). – DCoder

답변

1

은 배열 요소 (n1에서 FORTRAN에서) n-10에서 인덱싱된다. 따라서 첫 번째 요소에 포인터 p0이 있지만 마지막 요소에 포인터를 추가하려는 경우 n-1 : plast=p0+n-1을 추가해야합니다. 이 모든 것이 이것에 있습니다.

+0

감사합니다. 답변을 얻은 시간에 감사드립니다. 나는 시각적 인 코드화 된 예제를 답으로 찾고 있었다. 나는 내가 가지 않을 것이라고 생각한다. 위의 PE 파일 구조 사용. 당신이 건설중인 것처럼 시각적으로 기억 속에있는 것을보기가 어렵습니다. 나는 건축에서 무엇을 만들고 있는지보고 싶어하지만 프로그래밍에서 이것을 할 수는 없습니다. 그것은 나를 위해 열심히 배웁니다. –