MCPcopy Create free account
hub / github.com/NtQuery/Scylla / patchDirectJumpTable

Method patchDirectJumpTable

Scylla/IATReferenceScan.cpp:619–657  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

617}
618
619void IATReferenceScan::patchDirectJumpTable( DWORD_PTR stdImagebase, DWORD directImportsJumpTableRVA, PeParser * peParser, BYTE * jmpTableMemory, DWORD newIatBase )
620{
621
622 std::set<DWORD_PTR> apiPointers;
623 for (std::vector<IATReference>::iterator iter = iatDirectImportList.begin(); iter != iatDirectImportList.end(); iter++)
624 {
625 IATReference * ref = &(*iter);
626 apiPointers.insert(ref->targetPointer);
627 }
628
629 DWORD patchBytes;
630
631 for (std::set<DWORD_PTR>::iterator apiIter = apiPointers.begin(); apiIter != apiPointers.end(); apiIter++)
632 {
633 DWORD_PTR refTargetPointer = *apiIter;
634 if (newIatBase) //create new iat in section
635 {
636 refTargetPointer = (*apiIter - IatAddressVA) + newIatBase + ImageBase;
637 }
638 //create jump table in section
639 DWORD_PTR newIatAddressPointer = refTargetPointer - ImageBase + stdImagebase;
640
641#ifdef _WIN64
642 patchBytes = (DWORD)(newIatAddressPointer - (directImportsJumpTableRVA + stdImagebase) - 6);
643#else
644 patchBytes = newIatAddressPointer;
645 DWORD relocOffset = (directImportsJumpTableRVA + 2);
646 directImportLog.log(L"Relocation direct imports fix: Base RVA %08X Type HIGHLOW Offset %04X RelocTableEntry %04X", relocOffset & 0xFFFFF000, relocOffset & 0x00000FFF, (IMAGE_REL_BASED_HIGHLOW << 12) + (relocOffset & 0x00000FFF));
647#endif
648 jmpTableMemory[0] = 0xFF;
649 jmpTableMemory[1] = 0x25;
650 *((DWORD *)&jmpTableMemory[2]) = patchBytes;
651
652 patchDirectJumpTableEntry(*apiIter, stdImagebase, directImportsJumpTableRVA, peParser, jmpTableMemory, newIatBase);
653
654 jmpTableMemory += 6;
655 directImportsJumpTableRVA += 6;
656 }
657}
658
659void IATReferenceScan::patchDirectImportInDump32( int patchPreFixBytes, int instructionSize, DWORD patchBytes, BYTE * memory, DWORD memorySize, bool generateReloc, DWORD patchOffset, DWORD sectionRVA )
660{

Callers 1

Calls 1

logMethod · 0.80

Tested by

no test coverage detected