2011-11-19 38 views

Trả lời

9

IMAGE_OPTIONAL_HEADER.SizeOfImage là kích thước của tệp thi hành/dll được tải trong bộ nhớ ảo. Nó không giống như kích thước trên đĩa.

Bạn có thể tính toán với VirtualAddress + VirtualSize phần cuối cùng.

IMAGE_OPTIONAL_HEADER.SizeOfImage là giá trị đó được làm tròn lên giá trị IMAGE_OPTIONAL_HEADER.SectionAlignment (thường giống với kích thước trang).

2
if(LastSectionVirtualSize >= LastSectionSizeOfRawData) 
{ 
    if(LastSectionVirtualSize % LastSectionSectionAlignment) 
    { 
     TempValue = LastSectionVirtualSize - (LastSectionVirtualSize % LastSectionSectionAlignment) + LastSectionSectionAlignment ; 
    } 
    else 
    { 
     TempValue = LastSectionVirtualSize ;  
    } 
} 
else 
{ 
    if(LastSectionSizeOfRawData % LastSectionSectionAlignment) 
    { 
     TempValue = LastSectionSizeOfRawData - (LastSectionSizeOfRawData % LastSectionSectionAlignment) + LastSectionSectionAlignment ; 
    } 
    else 
    { 
     TempValue = LastSectionSizeOfRawData ; 
    } 
} 

OH.SizeOfImage = TempValue + dwLastSecRVA ; 
1

Thực ra, câu trả lời được chấp nhận là không chính xác. Để có được kích thước của tệp thực thi trên đĩa, bạn nên tính toán PointerToRawData + SizeOfRawData của phần cuối, chứ không phải các đối tác ảo. Ví dụ: xem http://www.strchr.com/creating_self-extracting_executables

Cũng lưu ý rằng một số trình biên dịch muốn thêm thông tin gỡ lỗi sau phần cuối cùng. Hãy chắc chắn để loại bỏ bất kỳ bảng biểu tượng hoặc thiết lập chế độ phát hành, tùy thuộc vào trình biên dịch bạn sử dụng, để làm việc này.

+0

Tôi đã tìm thấy một số thứ tồn tại * bên ngoài * của các phần như bảng chứng chỉ, hãy xem KERNEL32.DLL chẳng hạn, phần di chuyển kết thúc theo sau là bảng chứng chỉ, vì vậy cũng như điều này tôi cũng kiểm tra đối với bảng thư mục dữ liệu. – Lloyd