366 lines
14 KiB
Plaintext
366 lines
14 KiB
Plaintext
void loadImageImportThunks(DWORD deltaOffset,PureViewOfFile &pureView,ImageSectionHeaders &imageSectionHeaders,ImageExportDescriptors &imageExportDescriptors);
|
|
|
|
|
|
void ImageImportDescriptor::loadImageImportThunk(DWORD virtualAddress,DWORD deltaOffset,Block<ImageThunkData> &imageThunkImportOrdinals,Block<ImageThunkName> &imageThunkImportNames,PureViewOfFile &pureView,ImageSectionHeaders &imageSectionHeaders,ImageExportDescriptors &imageExportDescriptors)
|
|
{
|
|
ImageSectionHeader imageSectionHeader;
|
|
|
|
imageThunkImportOrdinals.remove();
|
|
imageThunkImportNames.remove();
|
|
pureView.push();
|
|
pureView.seek(virtualAddress-deltaOffset,PureViewOfFile::SeekSet);
|
|
while(TRUE)
|
|
{
|
|
ImageThunkData imageThunkData;
|
|
imageThunkData<<pureView;
|
|
if(!imageThunkData.isOkay())break;
|
|
if(imageThunkData.isOrdinalImport())
|
|
{
|
|
ImageExportDescriptor imageExportDescriptor;
|
|
ImageThunkName imageThunkName;
|
|
DWORD exportIndex;
|
|
if(imageExportDescriptors.locateImageExportOrdinal(imageThunkData.ordinal(),imageExportDescriptor,exportIndex))
|
|
{
|
|
imageThunkName.importName(imageExportDescriptor.imageExportName());
|
|
imageThunkImportNames.insert(&imageThunkName);
|
|
}
|
|
else imageThunkImportOrdinals.insert(&imageThunkData);
|
|
}
|
|
else
|
|
{
|
|
ImageThunkName imageThunkName;
|
|
pureView.push();
|
|
imageSectionHeaders.enclosingSectionHeader(imageThunkData.addressOfDataRVA(),imageSectionHeader,deltaOffset);
|
|
pureView.seek(imageThunkData.addressOfDataRVA()-deltaOffset,PureViewOfFile::SeekSet);
|
|
imageThunkName<<pureView;
|
|
imageThunkImportNames.insert(&imageThunkName);
|
|
pureView.pop();
|
|
}
|
|
}
|
|
pureView.pop();
|
|
}
|
|
|
|
|
|
|
|
void ImageImportDescriptor::loadImageImportThunks(DWORD deltaOffset,PureViewOfFile &pureView,ImageSectionHeaders &imageSectionHeaders,ImageExportDescriptors &imageExportDescriptors)
|
|
{
|
|
if(!isOkay())return;
|
|
if(!firstThunkRVA()&&!originalFirstThunkRVA())return;
|
|
if(originalFirstThunkRVA())loadImageImportThunk(originalFirstThunkRVA(),deltaOffset,
|
|
imageOriginalThunkImportOrdinals(),imageOriginalThunkImportNames(),pureView,imageSectionHeaders,imageExportDescriptors);
|
|
else if(firstThunkRVA())loadImageImportThunk(firstThunkRVA(),deltaOffset,
|
|
imageThunkImportOrdinals(),imageThunkImportNames(),pureView,imageSectionHeaders,imageExportDescriptors);
|
|
}
|
|
|
|
|
|
WORD PEHeader::loadImageImportDescriptors(Block<ImageImportDescriptor> &imageImportDescriptors,ImageSectionHeader &importSectionHeader,ImageExportDescriptors &imageExportDescriptors,PureViewOfFile &pureView)
|
|
{
|
|
DirectoryEntryKey sectionKey(DirectoryEntryKey::ImportDirectory);
|
|
ImageDataDirectory imageSectionDirectory(((ImageOptionalHeader&)*this)[sectionKey]);
|
|
ImageImportDescriptor imageImportDescriptor;
|
|
ImageSectionHeader importNamesSectionHeader;
|
|
ImageSectionHeader exportSectionHeader;
|
|
DWORD deltaOffset;
|
|
DWORD deltaNames;
|
|
|
|
imageImportDescriptors.remove();
|
|
imageExportDescriptors.size(0);
|
|
if(!enclosingSectionHeader(imageSectionDirectory.virtualAddress(),importSectionHeader,deltaOffset))return FALSE;
|
|
pureView.seek(imageSectionDirectory.virtualAddress()-deltaOffset,PureViewOfFile::SeekSet);
|
|
while(TRUE)
|
|
{
|
|
String moduleName;
|
|
imageImportDescriptor<<pureView;
|
|
if(!imageImportDescriptor.isOkay())break;
|
|
enclosingSectionHeader(imageImportDescriptor.nameRVA(),importNamesSectionHeader,deltaNames);
|
|
pureView.push();
|
|
pureView.seek(imageImportDescriptor.nameRVA()-deltaNames,PureViewOfFile::SeekSet);
|
|
pureView.getLine(moduleName);
|
|
loadImageExportDescriptors(imageExportDescriptors,exportSectionHeader,moduleName);
|
|
imageImportDescriptor.moduleName(moduleName);
|
|
pureView.pop();
|
|
imageImportDescriptor.loadImageImportThunks(deltaOffset,pureView,(ImageSectionHeaders&)*this,imageExportDescriptors);
|
|
imageImportDescriptors.insert(&imageImportDescriptor);
|
|
}
|
|
return imageImportDescriptors.size();
|
|
}
|
|
|
|
|
|
WORD loadImageImportDescriptors(Block<ImageImportDescriptor> &imageImportDescriptors,ImageSectionHeader &importSectionHeader,ImageExportDescriptors &imageExportDescriptors,PureViewOfFile &pureView);
|
|
|
|
// ::sprintf(entryPointString,"&0x%08lx",(DWORD)((PureVector<ImageExportDescriptor>&)*this)[functionIndex].imageExportEntryPoint());
|
|
|
|
void replaceImageImportOrdinals(Block<ImageImportDescriptor> &imageImportDescriptors,PureViewOfFile &pureView);
|
|
void PEHeader::replaceImageImportOrdinals(Block<ImageImportDescriptor> &imageImportDescriptors,PureViewOfFile &pureView)
|
|
{
|
|
ImageExportDescriptors imageExportDescriptors;
|
|
ImageExportDescriptor imageExportDescriptor;
|
|
ImageSectionHeader exportSectionHeader;
|
|
DWORD itemCount;
|
|
DWORD importModuleCount;
|
|
DWORD exportIndex;
|
|
|
|
if(!(importModuleCount=imageImportDescriptors.size()))return;
|
|
loadImageExportDescriptors(imageExportDescriptors,exportSectionHeader,pureView);
|
|
for(short importModuleIndex=0;importModuleIndex<importModuleCount;importModuleIndex++)
|
|
{
|
|
ImageImportDescriptor &imageImportDescriptor(imageImportDescriptors[importModuleIndex]);
|
|
itemCount=imageImportDescriptor.imageOriginalThunkImportOrdinals().size();
|
|
for(DWORD itemIndex=0;itemIndex<itemCount;itemIndex++)
|
|
{
|
|
ImageImportDescriptorExpand::ImageThunkDataBlock &imageThunkDataBlock(imageImportDescriptor.imageOriginalThunkImportOrdinals());
|
|
if(imageExportDescriptors.locateImageExportOrdinal(imageThunkDataBlock[itemIndex].ordinal(),imageExportDescriptor,exportIndex))
|
|
{
|
|
imageImportDescriptor.imageOriginalThunkImportNames().insert
|
|
}
|
|
}
|
|
itemCount=imageImportDescriptor.imageThunkImportOrdinals().size();
|
|
for(itemIndex=0;itemIndex<itemCount;itemIndex++)
|
|
{
|
|
ImageImportDescriptorExpand::ImageThunkDataBlock &imageThunkDataBlock(imageImportDescriptor.imageThunkImportOrdinals());
|
|
if(imageExportDescriptors.locateImageExportOrdinal(imageThunkDataBlock[itemIndex].ordinal(),imageExportDescriptor,exportIndex))
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ((PureVector<ImageExportDescriptor>&)*this)[(WORD)exportOrdinals[nameIndex]-1].imageExportName(exportNames[nameIndex]);
|
|
// ((PureVector<ImageExportDescriptor>&)*this)[(WORD)exportOrdinals[nameIndex]-1].imageExportOrdinal(exportOrdinals[nameIndex]);
|
|
|
|
WORD PEHeader::enclosingSectionHeader(DWORD virtualAddress,ImageSectionHeader &someImageSectionHeader,DWORD &deltaOffset)
|
|
{
|
|
DWORD sectionCount(((PureVector<ImageSectionHeader>&)*this).size());
|
|
|
|
for(short sectionIndex=0;sectionIndex<sectionCount;sectionIndex++)
|
|
{
|
|
ImageSectionHeader &imageSectionHeader(((PureVector<ImageSectionHeader>&)*this)[sectionIndex]);
|
|
if(virtualAddress>=imageSectionHeader.virtualAddress()&&
|
|
virtualAddress<imageSectionHeader.virtualAddress()+imageSectionHeader.virtualSize())
|
|
{
|
|
someImageSectionHeader=imageSectionHeader;
|
|
deltaOffset=imageSectionHeader.virtualAddress()-imageSectionHeader.pointerRawData();
|
|
return TRUE;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
#if 0
|
|
WORD PEHeader::loadImageImportDescriptors(Block<ImageImportDescriptor> &imageImportDescriptors,ImageSectionHeader &importSectionHeader,PureViewOfFile &pureView)
|
|
{
|
|
DirectoryEntryKey sectionKey(DirectoryEntryKey::ImportDirectory);
|
|
ImageDataDirectory imageSectionDirectory(((ImageOptionalHeader&)*this)[sectionKey]);
|
|
ImageImportDescriptor imageImportDescriptor;
|
|
DWORD deltaOffset;
|
|
DWORD deltaNames;
|
|
|
|
imageImportDescriptors.remove();
|
|
if(!enclosingSectionHeader(imageSectionDirectory.virtualAddress(),importSectionHeader))return FALSE;
|
|
deltaOffset=importSectionHeader.virtualAddress()-importSectionHeader.pointerRawData();
|
|
pureView.seek(imageSectionDirectory.virtualAddress()-deltaOffset,PureViewOfFile::SeekSet);
|
|
while(TRUE)
|
|
{
|
|
String moduleName;
|
|
imageImportDescriptor<<pureView;
|
|
if(!imageImportDescriptor.isOkay())break;
|
|
deltaOffset=importNamesSectionHeader.virtualAddress()-importNamesSectionHeader.pointerRawData();
|
|
pureView.push();
|
|
pureView.seek(imageImportDescriptor.nameRVA()-deltaOffset,PureViewOfFile::SeekSet);
|
|
pureView.getLine(moduleName);
|
|
imageImportDescriptor.moduleName(moduleName);
|
|
pureView.pop();
|
|
imageImportDescriptor.loadImageImportThunks(deltaOffset,pureView);
|
|
imageImportDescriptors.insert(&imageImportDescriptor);
|
|
}
|
|
return imageImportDescriptors.size();
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(originalFirstThunkRVA())loadImageImportThunk(originalFirstThunkRVA(),deltaOffset,
|
|
imageOriginalThunkImportOrdinals(),imageOriginalThunkImportNames(),pureView);
|
|
|
|
|
|
void loadImageImportThunks(DWORD virtualAddress,DWORD deltaOffset,Block<ImageThunkData> &imageThunkImportOrdinals,Block<ImageThunkName> &imageThunkImportNames,PureViewOfFile &pureView);
|
|
|
|
|
|
|
|
void PEHeader::loadImageImportThunks(DWORD virtualAddress,DWORD deltaOffset,Block<ImageThunkData> &imageThunkImportOrdinals,Block<ImageThunkName> &imageThunkImportNames,PureViewOfFile &pureView)
|
|
{
|
|
imageThunkImportOrdinals.remove();
|
|
imageThunkImportNames.remove();
|
|
pureView.push();
|
|
pureView.seek(virtualAddress-deltaOffset,PureViewOfFile::SeekSet);
|
|
while(TRUE)
|
|
{
|
|
ImageThunkData imageThunkData;
|
|
imageThunkData<<pureView;
|
|
if(!imageThunkData.isOkay())break;
|
|
if(imageThunkData.isOrdinalImport())imageThunkImportOrdinals.insert(&imageThunkData);
|
|
else
|
|
{
|
|
ImageThunkName imageThunkName;
|
|
pureView.push();
|
|
pureView.seek(imageThunkData.addressOfDataRVA()-deltaOffset,PureViewOfFile::SeekSet);
|
|
imageThunkName<<pureView;
|
|
imageThunkImportNames.insert(&imageThunkName);
|
|
pureView.pop();
|
|
}
|
|
}
|
|
pureView.pop();
|
|
}
|
|
|
|
|
|
|
|
// Block<ImageThunkData> imageOriginalThunkImportOrdinals;
|
|
// Block<ImageThunkName> imageOriginalThunkImportNames;
|
|
// if(imageImportDescriptor.originalFirstThunkRVA())
|
|
// loadImageImportThunks(imageImportDescriptor.originalFirstThunkRVA(),deltaOffset,
|
|
// imageOriginalThunkImportOrdinals,imageOriginalThunkImportNames,pureView);
|
|
|
|
// Block<ImageThunkData> imageThunkImportOrdinals;
|
|
// Block<ImageThunkName> imageThunkImportNames;
|
|
// if(imageImportDescriptor.firstThunkRVA())
|
|
// loadImageImportThunks(imageImportDescriptor.firstThunkRVA(),deltaOffset,
|
|
// imageThunkImportOrdinals,imageThunkImportNames,pureView);
|
|
|
|
|
|
|
|
pureView.push();
|
|
if(imageImportDescriptor.originalFirstThunkRVA())
|
|
{
|
|
pureView.seek(imageImportDescriptor.originalFirstThunkRVA()-deltaOffset,PureViewOfFile::SeekSet);
|
|
while(TRUE)
|
|
{
|
|
ImageThunkData imageThunkData;
|
|
imageThunkData<<pureView;
|
|
if(!imageThunkData.isOkay())break;
|
|
}
|
|
}
|
|
pureView.pop();
|
|
|
|
#if 0
|
|
pureView.push();
|
|
if(imageImportDescriptor.firstThunkRVA())
|
|
{
|
|
pureView.seek(imageImportDescriptor.firstThunkRVA()-deltaOffset,PureViewOfFile::SeekSet);
|
|
while(TRUE)
|
|
{
|
|
ImageThunkData imageThunkData;
|
|
imageThunkData<<pureView;
|
|
if(!imageThunkData.isOkay())break;
|
|
if(imageThunkData.isOrdinalImport())
|
|
{
|
|
}
|
|
else
|
|
{
|
|
ImageThunkName imageThunkName;
|
|
pureView.push();
|
|
pureView.seek(imageThunkData.addressOfDataRVA()-deltaOffset,PureViewOfFile::SeekSet);
|
|
imageThunkName<<pureView;
|
|
pureView.pop();
|
|
}
|
|
}
|
|
}
|
|
pureView.pop();
|
|
#endif
|
|
|
|
|
|
// ImageThunkName imageThunkName;
|
|
// imageThunkName<<pureView;
|
|
// break;
|
|
// pureView.seek(imageImportDescriptor.nameRVA()-deltaOffset,PureViewOfFile::SeekSet);
|
|
// char *lpString((char*)(imageImportDescriptor.nameRVA()-deltaOffset+pureView.base()));
|
|
// if(!lpString)return;
|
|
|
|
|
|
// pureView.seek(deltaOffset-imageImportDescriptor.nameRVA(),PureViewOfFile::SeekSet);
|
|
// char *lpString((char*)(imageImportDescriptor.nameRVA()-deltaOffset+pureView.base()));
|
|
// if(!lpString)return;
|
|
// lpString=0;
|
|
|
|
|
|
|
|
Bitmap kcBitmap("C:\\WORK\\SCENE\\MEDIA\\BMP\\KC.BMP");
|
|
HWND hDisplayWnd;
|
|
|
|
hDisplayWnd=::CreateWindow("BUTTON","",WS_VISIBLE,0,0,100,100,(HWND)0,(HMENU)0,hInstance,(LPVOID)0);
|
|
if(!hDisplayWnd)return FALSE;
|
|
::ShowWindow(hDisplayWnd,SW_SHOW);
|
|
::UpdateWindow(hDisplayWnd);
|
|
kcBitmap.displayBitmap(hDisplayWnd);
|
|
::Sleep(10000);
|
|
::DestroyWindow(hDisplayWnd);
|
|
|
|
|
|
|
|
|
|
// DisAssembler disAssembler;
|
|
// disAssembler.pageBreak(FALSE);
|
|
// disAssembler.disassemble("C:\\COMMAND.COM");
|
|
// winConsole.writeLine("Finished, press any key.");
|
|
// winConsole.read();
|
|
|
|
//#ifndef _COMMON_PUREVIEWOFFILE_HPP_
|
|
//#include <common/pview.hpp>
|
|
//#endif
|
|
//#ifndef _COMMON_BLOCK_TPP_
|
|
//#include <common/block.tpp>
|
|
//#endif
|
|
|
|
|
|
|
|
#if 0
|
|
// Block<SmartPointer<char> > mResStrings;
|
|
|
|
mResStrings.insert(&SmartPointer<char>("???_0"));
|
|
mResStrings.insert(&SmartPointer<char>("CURSOR"));
|
|
mResStrings.insert(&SmartPointer<char>("BITMAP"));
|
|
mResStrings.insert(&SmartPointer<char>("ICON"));
|
|
mResStrings.insert(&SmartPointer<char>("MENU"));
|
|
mResStrings.insert(&SmartPointer<char>("DIALOG"));
|
|
mResStrings.insert(&SmartPointer<char>("STRING"));
|
|
mResStrings.insert(&SmartPointer<char>("FONTDIR"));
|
|
mResStrings.insert(&SmartPointer<char>("FONT"));
|
|
mResStrings.insert(&SmartPointer<char>("ACCELERATORS"));
|
|
mResStrings.insert(&SmartPointer<char>("RCDATA"));
|
|
mResStrings.insert(&SmartPointer<char>("MESSAGETABLE"));
|
|
mResStrings.insert(&SmartPointer<char>("GROUP_CURSOR"));
|
|
mResStrings.insert(&SmartPointer<char>("???_13"));
|
|
mResStrings.insert(&SmartPointer<char>("GROUP_ICON"));
|
|
mResStrings.insert(&SmartPointer<char>("???_15"));
|
|
mResStrings.insert(&SmartPointer<char>("VERSION"));
|
|
for(short itemIndex=0;itemIndex<mResStrings.size();itemIndex++)
|
|
mResStrings[itemIndex].disposition(PointerDisposition::Assume);
|
|
#endif
|
|
|
|
|
|
// imgResDir.read(imageSectionHeader.pointerRawData(),pureView);
|
|
// pureView.seek(imageSectionHeader.pointerRawData(),PureViewOfFile::SeekSet);
|
|
// sectionData.size(imageSectionHeader.sizeofRawData());
|
|
// imgResDir.read(imageSectionHeader.pointerRawData(),pureView);
|
|
// descendResourceDirectory(imgResDir);
|
|
|
|
|
|
void ImageResourceDataEntry::read(DWORD resBase,DWORD deltaOffset,PureViewOfFile &pureView)
|
|
{
|
|
pureView.push();
|
|
pureView.read((char*)&((IMAGE_RESOURCE_DATA_ENTRY&)*this),sizeof(IMAGE_RESOURCE_DATA_ENTRY));
|
|
mRawData.size(size());
|
|
pureView.seek(offsetData()-deltaOffset,PureViewOfFile::SeekSet);
|
|
pureView.read((char*)((BYTE*)mRawData),mRawData.size());
|
|
// FileHandle resFile("RES.DAT",FileHandle::Write,FileHandle::ShareNone,FileHandle::Overwrite);
|
|
// resFile.write((BYTE*)mRawData,mRawData.size());
|
|
pureView.pop();
|
|
}
|
|
|