Skip to content

Commit bc4bc23

Browse files
Implemented the BuildNewImportTable.
1 parent af7637e commit bc4bc23

File tree

8 files changed

+322
-154
lines changed

8 files changed

+322
-154
lines changed

PEParser/PEParser.cpp

Lines changed: 176 additions & 82 deletions
Large diffs are not rendered by default.

PEParser/PEParser.h

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,12 @@ class PEParser {
190190
bool WriteMemoryToFile(HANDLE hFile, LONG offset, DWORD size, LPVOID pData);
191191
bool WriteZeroMemoryToFile(HANDLE hFile, DWORD fileOffset, DWORD size);
192192
void GetSectionHeaders();
193-
193+
DWORD IsMemoryNotNull(BYTE* pData, int dataSize);
194194
int GetSectionCount() const;
195195
void SetSectionCount(WORD count);
196-
const IMAGE_SECTION_HEADER* GetSectionHeader(ULONG section) const;
197-
const IMAGE_DATA_DIRECTORY* GetDataDirectory(int index) const;
196+
void SetImportTable(DWORD va, DWORD size);
197+
IMAGE_SECTION_HEADER* GetSectionHeader(ULONG section) const;
198+
IMAGE_DATA_DIRECTORY* GetDataDirectory(int index) const;
198199
const IMAGE_DOS_HEADER& GetDosHeader() const;
199200
void* GetBaseAddress() const;
200201
void AlignAllSectionHeaders();
@@ -243,11 +244,6 @@ class PEParser {
243244
return *_opt32;
244245
}
245246

246-
//IMAGE_COR20_HEADER* GetCLRHeader() const;
247-
//CLRMetadataParser* GetCLRParser() const;
248-
//std::vector<std::pair<DWORD, WIN_CERTIFICATE>> EnumCertificates() const;
249-
//const IMAGE_LOAD_CONFIG_DIRECTORY64* GetLoadConfiguration64() const;
250-
//const IMAGE_LOAD_CONFIG_DIRECTORY32* GetLoadConfiguration32() const;
251247
PVOID GetDataDirectoryAddress(UINT index, PULONG size) const;
252248
void SetDefaultFileAligment();
253249
DWORD GetSectionAlignment();
@@ -294,10 +290,13 @@ class PEParser {
294290
HANDLE _hFile{ INVALID_HANDLE_VALUE };
295291
IMAGE_DOS_HEADER* _dosHeader = nullptr;
296292
IMAGE_NT_HEADERS64* _ntHeader = nullptr;
293+
IMAGE_NT_HEADERS64 _ntHeader64Copy;
294+
IMAGE_NT_HEADERS32 _ntHeader32Copy;
297295
IMAGE_FILE_HEADER* _fileHeader = nullptr;
298296
IMAGE_SECTION_HEADER* _sections = nullptr;
299297
IMAGE_OPTIONAL_HEADER32* _opt32{ nullptr };
300298
IMAGE_OPTIONAL_HEADER64* _opt64{ nullptr };
299+
301300
//CComPtr<IMetaDataImport> _spMetadata;
302301
std::wstring _path;
303302
mutable HMODULE _resModule{ nullptr };

WinArk/ApiReader.cpp

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,10 @@ void ApiReader::ParseModule(ModuleInfo* pModule) {
2828
ParseModuleWithMapping(pModule);
2929
}
3030
else {
31-
ParseModuleWithProcess(pModule);
31+
bool success = ParseModuleWithProcess(pModule);
32+
if (!success) {
33+
ParseModuleWithMapping(pModule);
34+
}
3235
}
3336
}
3437
}
@@ -37,7 +40,7 @@ void ApiReader::ParseModuleWithMapping(ModuleInfo* pModule) {
3740
ParseExportTable(pModule, true, true);
3841
}
3942

40-
void ApiReader::ParseExportTable(ModuleInfo* pModule,bool isMapping,bool ownProcess) {
43+
bool ApiReader::ParseExportTable(ModuleInfo* pModule,bool isMapping,bool ownProcess) {
4144
if (isMapping) {
4245
PEParser parser(pModule->_fullPath);
4346
auto exports = parser.GetExports();
@@ -61,7 +64,7 @@ void ApiReader::ParseExportTable(ModuleInfo* pModule,bool isMapping,bool ownProc
6164
pPE = new BYTE[pModule->_modBaseSize];
6265
if (!ReadMemoryFromProcess(pModule->_modBaseAddr, pModule->_modBaseSize, pPE)) {
6366
delete[] pPE;
64-
return;
67+
return false;
6568
}
6669

6770
PEParser parser(pPE);
@@ -101,6 +104,7 @@ void ApiReader::ParseExportTable(ModuleInfo* pModule,bool isMapping,bool ownProc
101104
}
102105
}
103106
}
107+
return true;
104108
}
105109

106110
void ApiReader::FindApiByModuleAndOrdinal(ModuleInfo* pModule, WORD ordinal, DWORD_PTR* pVA, DWORD_PTR* pRVA)
@@ -166,24 +170,44 @@ void ApiReader::FindApiInProcess(ModuleInfo* pModule, char* pSearchName, WORD or
166170
PIMAGE_DOS_HEADER pDosHeader = nullptr;
167171
BYTE* pPE = new BYTE[pModule->_modBaseSize];
168172

169-
ReadMemoryFromProcess(pModule->_modBaseAddr, pModule->_modBaseSize, pPE);
170-
171-
PEParser parser(pPE);
173+
bool success = ReadMemoryFromProcess(pModule->_modBaseAddr, pModule->_modBaseSize, pPE);
174+
if (success) {
175+
PEParser parser(pPE);
172176

173-
auto exports = parser.GetExports();
177+
auto exports = parser.GetExports();
174178

175-
for (ExportedSymbol symbol : exports) {
176-
if (pSearchName != nullptr) {
177-
if (!strcmp(symbol.Name.c_str(), pSearchName)) {
179+
for (ExportedSymbol symbol : exports) {
180+
if (pSearchName != nullptr) {
181+
if (!strcmp(symbol.Name.c_str(), pSearchName)) {
182+
*pVA = symbol.Address + pModule->_modBaseAddr;
183+
*pRVA = symbol.Address;
184+
break;
185+
}
186+
}
187+
if (symbol.Ordinal == ordinal) {
178188
*pVA = symbol.Address + pModule->_modBaseAddr;
179189
*pRVA = symbol.Address;
180190
break;
181191
}
182192
}
183-
if (symbol.Ordinal == ordinal) {
184-
*pVA = symbol.Address + pModule->_modBaseAddr;
185-
*pRVA = symbol.Address;
186-
break;
193+
}
194+
else {
195+
PEParser parser(pModule->_fullPath);
196+
auto exports = parser.GetExports();
197+
198+
for (ExportedSymbol symbol : exports) {
199+
if (pSearchName != nullptr) {
200+
if (!strcmp(symbol.Name.c_str(), pSearchName)) {
201+
*pVA = symbol.Address + pModule->_modBaseAddr;
202+
*pRVA = symbol.Address;
203+
break;
204+
}
205+
}
206+
if (symbol.Ordinal == ordinal) {
207+
*pVA = symbol.Address + pModule->_modBaseAddr;
208+
*pRVA = symbol.Address;
209+
break;
210+
}
187211
}
188212
}
189213

@@ -839,8 +863,8 @@ void ApiReader::HandleForwardedApi(const char* pForwardName, const char* pFuncti
839863
}
840864
}
841865

842-
void ApiReader::ParseModuleWithProcess(ModuleInfo* pModule) {
843-
ParseExportTable(pModule, false);
866+
bool ApiReader::ParseModuleWithProcess(ModuleInfo* pModule) {
867+
return ParseExportTable(pModule, false);
844868
}
845869

846870
ModuleInfo* ApiReader::FindModuleByName(WCHAR* name) {

WinArk/ApiReader.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ class ApiReader : public ProcessAccessHelper
3737
inline bool IsApiForwarded(DWORD_PTR rva, PIMAGE_NT_HEADERS pNtHeader);
3838
void HandleForwardedApi(const char* pForwardName, const char* pFunctionNameParent, DWORD_PTR rvaParent, WORD ordinalParent, ModuleInfo* pModuleParent);
3939
void ParseModule(ModuleInfo* pModule);
40-
void ParseModuleWithProcess(ModuleInfo* pModule);
41-
void ParseExportTable(ModuleInfo* pModule, bool isMapping, bool ownProcess = false);
40+
bool ParseModuleWithProcess(ModuleInfo* pModule);
41+
bool ParseExportTable(ModuleInfo* pModule, bool isMapping, bool ownProcess = false);
4242

4343
ModuleInfo* FindModuleByName(WCHAR* name);
4444

0 commit comments

Comments
 (0)