рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп
рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп RvaToRaw / RawToRva рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреА рд▓реЗрдЦрдХ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИ, рдЬреЛ рдкреАрдИ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред
рд▓реЗрдЦ рдХрд┐рд╕рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реИ?
- рдкрд╛рдардХ рдкреЛрд░реНрдЯреЗрдмрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реИ
- рд░реАрдбрд░> = 1 рдмрд╛рд░ рдиреЗ рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд▓рд┐рдЦрд╛
- рдкрд╛рдардХ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ RvaToRaw рдХреНрдпрд╛ рд╣реИред
рд╢рдмреНрджрд╛рд╡рд▓реА
RVA - рдпрд╣ рдЕрдВрдЧреНрд░реЗрдЬреА рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╣реИред рд╢рдмреНрдж рд░рд┐рд▓реЗрдЯрд┐рд╡ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдпрд╛ рдЕрдиреБрдорд╛рдирд┐рдд рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдкрддреЗ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдСрдлрд╕реЗрдЯред
RAW - рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдСрдлрд╕реЗрдЯред рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рдирд╛рдо "рдлрд╝рд╛рдЗрд▓ рдСрдлрд╝рд╕реЗрдЯ" рд╣реИред
рдбрд┐рдЬрд╝рд╛рдЗрди
"рдХрдЪреНрдЪреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рд╡" рдпрд╛ "рдСрдлрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рд╡реАрдП" рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП Google рдореЗрдВ рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдирд┐рдореНрди рдХреЛрдб рдкрд░ рдареЛрдХрд░ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
DWORD RVAToOffset(IMAGE_NT_HEADERS32* pNtHdr, DWORD dwRVA) { int i; WORD wSections; PIMAGE_SECTION_HEADER pSectionHdr; pSectionHdr = IMAGE_FIRST_SECTION(pNtHdr); wSections = pNtHdr->FileHeader.NumberOfSections; for (i = 0; i < wSections; i++) { if (pSectionHdr->VirtualAddress <= dwRVA) if ((pSectionHdr->VirtualAddress + pSectionHdr->Misc.VirtualSize) > dwRVA) { dwRVA -= pSectionHdr->VirtualAddress; dwRVA += pSectionHdr->PointerToRawData; return (dwRVA); } pSectionHdr++; } return (-1); }
рдХреЛрдб рдореЗрдВ рдХреБрдЫ рд╕рдХрд▓ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ рдФрд░ рдпрд╣ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИред
рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ:
- Rva value OptionalHeader.SizeOfHeaders рд╕реЗ рдХрдо рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдорд╛рди рд╣реЗрдбрд░ рдХреЗ рдЕрдВрджрд░ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ
- VirtualAddress, VirtualSize, PointerToRawData рдорд╛рди рд╕рдВрд░реЗрдЦрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ
- рдореИрдХреНрд░реЛ IMAGE_FIRST_SECTION рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ 64-рдмрд┐рдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ winh.h рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ
рд▓реЗрдЦрдХ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╣реА рдХреЛрдб:
рдСрдлрд╕реЗрдЯ рдСрдлрд╝рд╕реЗрдЯ рдХреНрд▓рд╛рд╕ рдФрд░ рдПрдбреНрд░реЗрд╕ рдХреЛрдб inline uint32_t alignDown(uint32_t value_, uint32_t factor) { return value_ & ~(factor-1); } inline uint32_t alignUp(uint32_t value_, uint32_t factor) { return alignDown(value_ - 1, factor) + factor; } class Aligner { public: const uint32_t FORCED_FILE_ALIGNMENT = 0x200; const uint32_t MIN_SECTION_ALIGNMENT = 0x1000; public: Aligner(uint32_t fileAlignment_, uint32_t sectionAlignement_) : fileAlignment(fileAlignment_) , sectionAlignement(sectionAlignement_) { } uint32_t getVirtualSize(uint32_t size) { return needAlign(sectionAlignement) ? alignUp(size, sectionAlignement) : size; } uint32_t getVirtualAddress(uint32_t address) { return needAlign(sectionAlignement) ? alignDown(address, sectionAlignement) : address; } uint32_t getFileOffset(uint32_t offset) { return needAlign(sectionAlignement) ? alignDown(offset, FORCED_FILE_ALIGNMENT) : offset; } uint32_t getSectionSize(const ImgSectionHeader& header) { uint32_t fileSize = header.SizeOfRawData; uint32_t virtualSize = header.Misc.VirtualSize; if (needAlign(sectionAlignement)) { fileSize = alignUp(fileSize, fileAlignment); virtualSize = alignUp(virtualSize, sectionAlignement); } return std::min(fileSize, virtualSize); } private: uint32_t fileAlignment; uint32_t sectionAlignement; bool needAlign(uint32_t sectionAlignement) { return sectionAlignement >= MIN_SECTION_ALIGNMENT; } };
рд░рд╛рд╡рд╛ рдХреЛ рд░реЙ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛрдб const uint32_t numInvalidRaw = (uint32_t)( -1 ); uint32_t PeUtils::RvaToRaw( const PeImage& peImage, uint32_t rva ) { uint32_t result = INVALID_RAW; const auto& optionalHeader = peImage.NtHeaders.OptionalHeader; if (rva < optionalHeader.SizeOfHeaders) return rva; Aligner aligner(optionalHeader.FileAlignment, optionalHeader.SectionAlignment); if (peImage.NtHeaders.FileHeader.NumberOfSections > 0) { for (const auto& section : peImage.Sections) { if (section.PointerToRawData == 0) continue; auto sectionStart = aligner.getVirtualAddress(section.VirtualAddress); auto sectionSize = aligner.getSectionSize(section); auto sectionEnd = sectionStart + sectionSize; if (sectionStart <= rva && rva < sectionEnd) { auto sectionOffset = aligner.getFileOffset(section.PointerToRawData); sectionOffset += (rva - sectionStart); if (sectionOffset < peImage.SizeOfFileImage) result = sectionOffset; } }
рдХреНрдпрд╛ рд╕реБрдзрд░рд╛ рд╣реИ:
- рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ (рдЖрд╡рд╢реНрдпрдХрддрд╛ рджреЗрдЦреЗрдВ рд╡рд┐рдзрд┐)
- рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдРрд╕реА рдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ!
- рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ PointerToRawData рдФрд░ VirtualAddress рдХреЛ рдиреАрдЪреЗ рдЧрдардмрдВрдзрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
- рдЕрдзрд┐рдХ рд╕рд╣реА рдЕрдиреБрднрд╛рдЧ рдЖрдХрд╛рд░ рдЧрдгрдирд╛
рдиреЛрдЯрд╛
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдпрд╣ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд░реАрдм рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рд▓реЛрдбрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдордЭрддрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдг
рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдмрдирд╛рдПрдВ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ рдЗрд╕ рд╕реЗрдЯ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдкрдиреЗ RvaToRaw \ RawToRva рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рдЬреЛ рдмрдЧреНрд╕ рдХреЛ рд░реАрдлрд╝реИрдХреНтАНрдЯ рдХрд░рдиреЗ рдпрд╛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ:
- рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдкреИрдХрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬреЛ рдШрдЯрд┐рдпрд╛ рд╣реЗрдбрд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рдкреИрдХрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг Upack.exe рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдЕрдиреНрдп рд╣реИрдВред
- рд╕рдордп-рд╕рдордп рдкрд░ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдирдП рдирдореВрдиреЛрдВ рдХреЗ рдЕрдкрдиреЗ рд╕рдВрдЧреНрд░рд╣ рдХреА рднрд░рдкрд╛рдИ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдордбреАрдПрд▓ рдХреЗ рд╕рд╛рде (рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд░реЛрдд рджреЗрдЦреЗрдВ)
рдиреЛрдЯрд╛рдореИрдВ рдЕрдиреБрд╕реНрдорд╛рд░рдХ рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рд╕рдВрджрд┐рдЧреНрдз рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрддрд┐рдерд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, VMWare рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓рдмреЙрдХреНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рддред
рдЖрдк Hiew, IDA Pro рдпрд╛ рдбреАрдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рднреА рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд░реЛрдд:
- # рдЬреАрддрдирд╛ <winnt.h>ред рдиреЗрддрд╛ рдХреЛ MSVC рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рди рдХреЗрд╡рд▓ред рдпрд╣ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкрд╛рд░реНрд╕рд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рдВрджрд░реНрдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!
- рдореИрдЯ рдкрд┐рдЯреНрд░реЗрдХ "рдкреНрд░рд╛рд░реВрдк PE рдФрд░ COFF рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЗрдВред" rsdn.ru/article/baseserv/pe_coff.xml
- рдореИрдХреНрд╕рд┐рдо рдПрдоред рдЧреБрдореЗрд░реЛрд╡ред "рдкреАрдИ рдлрд╝рд╛рдЗрд▓ рд▓реЛрдбрд░ред" rsdn.ru/article/baseserv/peloader.xml
- рдордВрдЪ >> рдЖрдИрдбреАрдП рдкреНрд░реЛ >> # рдирдпрд╛ рдкреАрдИ рд▓реЛрдбрд░ рдмрдЧ рдФрд░ рдирдИ рджрд░рд╛рд░-рдореБрдЭреЗред www.openrce.org/forums/posts/969
- рдПрдордбреАрдПрд▓ред www.malwaredomainlist.com/mdl.php рд╕рдВрд╕рд╛рдзрди рдЬрд╣рд╛рдБ рдЖрдк рд╕рдВрджрд┐рдЧреНрдз рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдирдореВрдиреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдкреЛрд╕реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдо:
- рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд▓реЗрдЦрдХ рдиреЗ рдЦреБрдж рдХреЛ рдХрд┐рд╕реА рдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рдиреЗ рдпрд╛ рдХрд┐рд╕реА рдХрд╛ рдордЬрд╛рдХ рдмрдирд╛рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд▓реЗрдЦрдХ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреА рдмрд╣реБрдд рдЗрдЪреНрдЫрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ, "рдорд╣рд╛рди Google" рдХрд╛рдлреА рд╕рд╣реА рдХреЛрдб RvaToRaw \ RawToRR рд╕реЗ рд▓рд┐рдВрдХ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛
- рд▓реЗрдЦрдХ рдХрд┐рд╕реА рднреА рдкреНрд░рд╢реНрди, рдХрд┐рд╕реА рднреА рдЖрд▓реЛрдЪрдирд╛ рдФрд░ рдХрд┐рд╕реА рднреА рдЗрдЪреНрдЫрд╛ рд╕реЗ рдкреНрд░рд╕рдиреНрди рд╣реЛрдЧрд╛