Как из AddressOfEntryPoint получить смещение в файле? Посмотрел в PE tools AddressOfEntryPoint =2654h Смещение = 1A54h Как это высщитывается? Читать статьи про вирусы нету времени..
Code (Text): CalculateOffsetEntryPoint proc uses ebx ImageBase:PVOID, ResultOffset:PULONG, ResultRva:PULONG invoke RtlImageNtHeader, ImageBase test eax,eax jz err_format_ lea ebx,[eax+SizeOf IMAGE_NT_HEADERS-SizeOf IMAGE_SECTION_HEADER] assume ebx:PIMAGE_SECTION_HEADER movzx ecx,IMAGE_NT_HEADERS.FileHeader.NumberOfSections[eax] test ecx,ecx jz err_format_ mov edx,IMAGE_NT_HEADERS.OptionalHeader.AddressOfEntryPoint[eax] mov eax,ResultRva mov dword ptr [eax],edx loop_: add ebx,SizeOf IMAGE_SECTION_HEADER mov eax,[ebx].VirtualAddress cmp eax,edx jnc err_param_ add eax,[ebx].VirtualSize cmp eax,edx jna next_section_ sub edx,[ebx].VirtualAddress add edx,[ebx].PointerToRawData mov eax,ResultOffset mov dword ptr [eax],edx xor eax,eax jmp exit_ next_section_: loop loop_ mov eax,STATUS_OBJECT_NAME_NOT_FOUND exit_: ret err_param_: mov eax,STATUS_INVALID_PARAMETER_2 jmp exit_ err_format_: mov eax,STATUS_INVALID_IMAGE_FORMAT jmp exit_ CalculateOffsetEntryPoint endp
В таблице секций смотрим смещение в файле секции кода и ее смещение в памяти (RVA). Разница этих смещений определяет коррекцию RVA точки входа.