왜 여기에 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;
}
마지막 섹션을 가져 오려면 첫 번째 섹션과 섹션 수에서 1을 뺀 값으로 이동해야합니다. 예를 들어 섹션이 하나뿐이라면 마지막 섹션이기도하며 0을 추가해야합니다. 두 개의 섹션이있는 경우 마지막 섹션이 첫 번째 섹션입니다. –
배열의 색인이 0부터 시작되기 때문에. 마지막 요소의 인덱스는'count - 1'입니다. 'last_section'은 마지막으로 존재하는 섹션을 가리키는 포인터이고,'new_section'은 다음 메모리가 갈 곳을 가리키는 포인터입니다 (유효한 메모리 주소 지정 방법을 알 수는 없지만). – DCoder