2012-11-25 65 views
0

我很困惑他們爲什麼使用-1在這裏。有人可以解釋這條線是在非常非常非常非常低的細節做什麼...不是它減去1結構....我需要知道更多...關於低級別...謝謝...PE文件格式部分添加

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

上面的代碼是在下面的功能:

//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

要獲得最後一個部分,您需要轉到第一部分以及減去一部分的部分。例如,如果只有一個部分,那也是最後一個部分,您必須添加零。如果有兩部分,最後一部分是第一部分。 –

+0

因爲數組從零開始索引。最後一個元素的索引是「count-1」。 'last_section'是一個指向最後一個存在段的指針,'new_section'是指向下一個段的指針(儘管我沒有看到它是如何確定它是在尋址有效內存的)。 – DCoder

回答

1

在C和C++,數組元素從0索引到n-1(在FORTRAN從1n)。因此,如果您有第一個元素的指針p0,但想要指向最後一個元素的指針,則必須添加n-1plast=p0+n-1。這就是這一切。

+0

謝謝,我很欣賞你採取迴應的時間。我正在尋找一個視覺編碼的例子作爲答案。我不認爲我會得到。使用上面的PE文件結構。它很難在視覺上看到你在建設中看到的東西。我喜歡看到我在施工中正在建造的東西,但我無法在編程中做到這一點。這讓我很難學習。 –