|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Фев 11, 2003 17:16:45 Две функции для удобства работы с PE имджем ;####################################################### Offs etToRVA proc uses edi esi ebx pImage :dword, Offst:dword mov esi, pImage add esi, dword ptr [esi+03Ch] ASSUME esi : ptr IMAGE_NT_HEADERS mov edi, esi add edi, sizeof IMAGE_NT_HEADERS ASSUME edi : ptr IMAGE_SECTION_HEADER movsx ebx, [esi].FileHeader.NumberOfSections mov eax, Offst mov bh, 0 push esi .while bl != 0 xor ecx, ecx .if eax >= [edi].PointerToRawData inc cl mov esi, [edi].PointerToRawData add esi, [edi].SizeOfRawData .if eax <= esi inc ch .endif .endif .if cx == 0101h mov dl, bh .endif add edi, sizeof IMAGE_SECTION_HEADER dec bl inc bh .endw movzx cx, byte ptr dl pop esi mov eax, sizeof IMAGE_SECTION_HEADER mul cx mov edi, esi add edi, sizeof IMAGE_NT_HEADERS add edi, eax mov ecx, Offst sub ecx, [edi].PointerToRawData mov eax, [edi].VirtualAddress add eax, ecx ASSUME esi : nothing ASSUME edi : nothing ret OffsetToRVA endp ;######################################################### RVAtoOffset proc uses edi esi ebx edx pImage :dword, RVAadr:dword mov esi, pImage add esi, dword ptr [esi+03Ch] ASSUME esi : ptr IMAGE_NT_HEADERS mov edi, esi add edi, sizeof IMAGE_NT_HEADERS ASSUME edi : ptr IMAGE_SECTION_HEADER movsx ebx, [esi].FileHeader.NumberOfSections mov eax, RVAadr mov bh, 0 push esi .while bl != 0 xor ecx, ecx .if eax >= [edi].VirtualAddress inc cl mov esi, [edi].VirtualAddress add esi, [edi].Misc.VirtualSize .if eax <= esi inc ch .endif .endif .if cx == 0101h mov dl, bh .endif add edi, sizeof IMAGE_SECTION_HEADER dec bl inc bh .endw movzx cx, byte ptr dl pop esi mov eax, sizeof IMAGE_SECTION_HEADER mul cx mov edi, esi add edi, sizeof IMAGE_NT_HEADERS add edi, eax mov ecx, RVAadr sub ecx, [edi].VirtualAddress mov eax, [edi].PointerToRawData add eax, ecx ASSUME esi : nothing ASSUME edi : nothing ret RVAtoOffset endp ;######################################################### |
|
|
Дата: Фев 26, 2003 12:36:41 Гм, а на С это пишется в пять строчек :) BTW, функции далеки от совершенства, есть полно файлов на которых они дадут неверный результат (пример: у секции PointerToRawData == 0, а размер ненулевой - это будет tls секцию у веткомовских бинарников), или если скажем я суну адрес до первой секции, типа часть заголовка. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.089 |