RvaToRaw рдФрд░ RawToRva рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд┐рдХрд╛рд╕

рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп


рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп RvaToRaw / RawToRva рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдХреБрдЫ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреА рд▓реЗрдЦрдХ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИ, рдЬреЛ рдкреАрдИ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред

рд▓реЗрдЦ рдХрд┐рд╕рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд╣реИ?




рд╢рдмреНрджрд╛рд╡рд▓реА



RVA - рдпрд╣ рдЕрдВрдЧреНрд░реЗрдЬреА рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рд╣реИред рд╢рдмреНрдж рд░рд┐рд▓реЗрдЯрд┐рд╡ рд╡рд░реНрдЪреБрдЕрд▓ рдПрдбреНрд░реЗрд╕ рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдпрд╛ рдЕрдиреБрдорд╛рдирд┐рдд рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдкрддреЗ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдСрдлрд╕реЗрдЯред
RAW - рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдСрдлрд╕реЗрдЯред рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рдирд╛рдо "рдлрд╝рд╛рдЗрд▓ рдСрдлрд╝рд╕реЗрдЯ" рд╣реИред

рдбрд┐рдЬрд╝рд╛рдЗрди


"рдХрдЪреНрдЪреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рд╡" рдпрд╛ "рдСрдлрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рд╡реАрдП" рдХреАрд╡рд░реНрдб рдХреЗ рд▓рд┐рдП Google рдореЗрдВ рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдирд┐рдореНрди рдХреЛрдб рдкрд░ рдареЛрдХрд░ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
DWORD RVAToOffset(IMAGE_NT_HEADERS32* pNtHdr, DWORD dwRVA) { int i; WORD wSections; PIMAGE_SECTION_HEADER pSectionHdr; /* Map first section */ 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); } 


рдХреЛрдб рдореЗрдВ рдХреБрдЫ рд╕рдХрд▓ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ рдФрд░ рдпрд╣ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИред

рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ:


рд▓реЗрдЦрдХ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрдзрд┐рдХ рд╕рд╣реА рдХреЛрдб:

рдСрдлрд╕реЗрдЯ рдСрдлрд╝рд╕реЗрдЯ рдХреНрд▓рд╛рд╕ рдФрд░ рдПрдбреНрд░реЗрд╕ рдХреЛрдб
 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; } } // for } else if (rva < aligner.getVirtualSize(optionalHeader.SizeOfImage)) { result = rva; } return result; } 



рдХреНрдпрд╛ рд╕реБрдзрд░рд╛ рд╣реИ:


рдиреЛрдЯрд╛
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдпрд╣ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд░реАрдм рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рд▓реЛрдбрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдордЭрддрд╛ рд╣реИред

рдкрд░реАрдХреНрд╖рдг


рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдмрдирд╛рдПрдВ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ рдЗрд╕ рд╕реЗрдЯ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдкрдиреЗ RvaToRaw \ RawToRva рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ, рдЬреЛ рдмрдЧреНрд╕ рдХреЛ рд░реАрдлрд╝реИрдХреНтАНрдЯ рдХрд░рдиреЗ рдпрд╛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ:
  1. рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдкреИрдХрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬреЛ рдШрдЯрд┐рдпрд╛ рд╣реЗрдбрд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рдкреИрдХрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг Upack.exe рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рдЕрдиреНрдп рд╣реИрдВред
  2. рд╕рдордп-рд╕рдордп рдкрд░ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдирдП рдирдореВрдиреЛрдВ рдХреЗ рдЕрдкрдиреЗ рд╕рдВрдЧреНрд░рд╣ рдХреА рднрд░рдкрд╛рдИ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдордбреАрдПрд▓ рдХреЗ рд╕рд╛рде (рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд░реЛрдд рджреЗрдЦреЗрдВ)


рдиреЛрдЯрд╛
рдореИрдВ рдЕрдиреБрд╕реНрдорд╛рд░рдХ рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рд╕рдВрджрд┐рдЧреНрдз рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрддрд┐рдерд┐ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, VMWare рдпрд╛ рд╡рд░реНрдЪреБрдЕрд▓рдмреЙрдХреНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рддред

рдЖрдк Hiew, IDA Pro рдпрд╛ рдбреАрдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдХреЛрдб рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рднреА рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрд░реЛрдд:


  1. # рдЬреАрддрдирд╛ <winnt.h>ред рдиреЗрддрд╛ рдХреЛ MSVC рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рди рдХреЗрд╡рд▓ред рдпрд╣ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдкрд╛рд░реНрд╕рд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрд╕реНрдХрдЯреЙрдк рд╕рдВрджрд░реНрдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!
  2. рдореИрдЯ рдкрд┐рдЯреНрд░реЗрдХ "рдкреНрд░рд╛рд░реВрдк PE рдФрд░ COFF рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЗрдВред" rsdn.ru/article/baseserv/pe_coff.xml
  3. рдореИрдХреНрд╕рд┐рдо рдПрдоред рдЧреБрдореЗрд░реЛрд╡ред "рдкреАрдИ рдлрд╝рд╛рдЗрд▓ рд▓реЛрдбрд░ред" rsdn.ru/article/baseserv/peloader.xml
  4. рдордВрдЪ >> рдЖрдИрдбреАрдП рдкреНрд░реЛ >> # рдирдпрд╛ рдкреАрдИ рд▓реЛрдбрд░ рдмрдЧ рдФрд░ рдирдИ рджрд░рд╛рд░-рдореБрдЭреЗред www.openrce.org/forums/posts/969
  5. рдПрдордбреАрдПрд▓ред www.malwaredomainlist.com/mdl.php рд╕рдВрд╕рд╛рдзрди рдЬрд╣рд╛рдБ рдЖрдк рд╕рдВрджрд┐рдЧреНрдз рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдирдореВрдиреЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ


рдкреЛрд╕реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдо:

Source: https://habr.com/ru/post/In129241/


All Articles