· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.VIROLOGY —› RVAtoOffset и OffsettoRVA

Посл.отвђт Сообщен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