@@ -161,65 +161,34 @@ void ApiReader::ParseModuleWithOwnProcess(ModuleInfo* pModule) {
161161 }
162162}
163163
164- void ApiReader::FindApiInProcess (ModuleInfo* pModule, char * searchName , WORD ordinal, DWORD_PTR* pVA, DWORD_PTR* pRVA) {
164+ void ApiReader::FindApiInProcess (ModuleInfo* pModule, char * pSearchName , WORD ordinal, DWORD_PTR* pVA, DWORD_PTR* pRVA) {
165165 PIMAGE_NT_HEADERS pNtHeader = nullptr ;
166166 PIMAGE_DOS_HEADER pDosHeader = nullptr ;
167- BYTE* pPE = nullptr ;
168- PIMAGE_EXPORT_DIRECTORY pExportTable = nullptr ;
169-
170- pPE = GetHeaderFromProcess (pModule);
171- if (pPE == nullptr )
172- return ;
167+ BYTE* pPE = new BYTE[pModule->_modBaseSize ];
173168
174- pDosHeader = (PIMAGE_DOS_HEADER)pPE;
175- pNtHeader = (PIMAGE_NT_HEADERS)((BYTE*)pPE + pDosHeader->e_lfanew );
176- if (IsPEAndExportTableValid (pNtHeader)) {
177- pExportTable = GetExportTableFromProcess (pModule, pNtHeader);
178- if (pExportTable) {
179- FindApiInExportTable (pModule, pExportTable,
180- (DWORD_PTR)pExportTable - pNtHeader->OptionalHeader .DataDirectory [IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress ,
181- searchName, ordinal, pVA, pRVA);
182- delete[] pExportTable;
183- }
184- }
169+ ReadMemoryFromProcess (pModule->_modBaseAddr , pModule->_modBaseSize , pPE);
170+
171+ PEParser parser (pPE);
185172
186- delete[] pPE;
187- }
173+ auto exports = parser.GetExports ();
188174
189- bool ApiReader::FindApiInExportTable (ModuleInfo* pModule, PIMAGE_EXPORT_DIRECTORY pExportDir,
190- DWORD_PTR deltaAddress, char * searchName,WORD ordinal, DWORD_PTR* pVA, DWORD_PTR* pRVA)
191- {
192- DWORD* pAddressOfFunctions = nullptr , * pAddressOfNames = nullptr ;
193- WORD* pAddressOfNameOrdinals = nullptr ;
194- char * pFunctionName = nullptr ;
195-
196- pAddressOfFunctions = (DWORD*)((DWORD_PTR)pExportDir->AddressOfFunctions + deltaAddress);
197- pAddressOfNames = (DWORD*)((DWORD_PTR)pExportDir->AddressOfNames + deltaAddress);
198- pAddressOfNameOrdinals = (WORD*)((DWORD_PTR)pExportDir->AddressOfNameOrdinals + deltaAddress);
199-
200- if (searchName) {
201- for (DWORD i = 0 ; i < pExportDir->NumberOfNames ; i++) {
202- pFunctionName = (char *)(pAddressOfNames[i] + deltaAddress);
203- if (!strcmp (pFunctionName, searchName)) {
204- *pRVA = pAddressOfFunctions[pAddressOfNameOrdinals[i]];
205- *pVA = *pRVA + pModule->_modBaseAddr ;
206- return true ;
175+ for (ExportedSymbol symbol : exports) {
176+ if (pSearchName != nullptr ) {
177+ if (!strcmp (symbol.Name .c_str (), pSearchName)) {
178+ *pVA = symbol.Address + pModule->_modBaseAddr ;
179+ *pRVA = symbol.Address ;
180+ break ;
207181 }
208182 }
209- }
210- else {
211- for (DWORD i = 0 ; i < pExportDir->NumberOfFunctions ; i++)
212- {
213- if (ordinal == (i + pExportDir->Base ))
214- {
215- *pRVA = pAddressOfFunctions[i];
216- *pVA = *pRVA + pModule->_modBaseAddr ;
217- return true ;
218- }
183+ if (symbol.Ordinal == ordinal) {
184+ *pVA = symbol.Address + pModule->_modBaseAddr ;
185+ *pRVA = symbol.Address ;
186+ break ;
219187 }
220188 }
189+
221190
222- return false ;
191+ delete[] pPE ;
223192}
224193
225194BYTE* ApiReader::GetHeaderFromProcess (ModuleInfo* pModule)
@@ -685,34 +654,72 @@ void ApiReader::ParseIAT(DWORD_PTR iat, BYTE* pIAT, SIZE_T size) {
685654 ModuleInfo* pModule = nullptr ;
686655 bool isSuspect = false ;
687656 int countApiFound = 0 , countApiNotFound = 0 ;
688- DWORD_PTR* pIATAddress = (DWORD_PTR*)pIAT;
689- SIZE_T iatSize = size / sizeof (DWORD_PTR);
690-
691- for (SIZE_T i = 0 ; i < iatSize; i++) {
692- if (!IsInvalidMemoryForIAT (pIATAddress[i])) {
693- if (pIATAddress[i] > _minApiAddress && pIATAddress[i] < _maxApiAddress) {
694- pApiFound = GetApiByVirtualAddress (pIATAddress[i], &isSuspect);
695- if (pApiFound != nullptr ) {
696- countApiFound++;
697- if (pModule != pApiFound->pModule ) {
698- pModule = pApiFound->pModule ;
699- AddFoundApiToModuleList (iat + (DWORD_PTR)&pIATAddress[i] - (DWORD_PTR)pIAT, pApiFound, true , isSuspect);
657+ DWORD_PTR* p64 = (DWORD_PTR*)pIAT;
658+ DWORD* p32 = reinterpret_cast <DWORD*>(pIAT);
659+ SIZE_T iatSize = 0 ;
660+ DWORD pointerSize = 0 ;
661+ BOOL isWow64 = FALSE ;
662+ ::IsWow64Process (_hProcess, &isWow64);
663+ if (isWow64) {
664+ pointerSize = 4 ;
665+ iatSize = size / pointerSize;
666+ for (SIZE_T i = 0 ; i < iatSize; i++) {
667+ if (!IsInvalidMemoryForIAT (p32[i])) {
668+ if (p32[i] > _minApiAddress && p32[i] < _maxApiAddress) {
669+ pApiFound = GetApiByVirtualAddress (p32[i], &isSuspect);
670+ if (pApiFound != nullptr ) {
671+ countApiFound++;
672+ if (pModule != pApiFound->pModule ) {
673+ pModule = pApiFound->pModule ;
674+ AddFoundApiToModuleList (iat + (DWORD_PTR)&p32[i] - (DWORD_PTR)pIAT, pApiFound, true , isSuspect);
675+ }
676+ else {
677+ AddFoundApiToModuleList (iat + (DWORD_PTR)&p32[i] - (DWORD_PTR)pIAT, pApiFound, false , isSuspect);
678+ }
700679 }
701680 else {
702- AddFoundApiToModuleList (iat + (DWORD_PTR)&pIATAddress[i] - (DWORD_PTR)pIAT, pApiFound, false , isSuspect);
681+ countApiNotFound++;
682+ AddNotFoundApiToModuleList (iat + (DWORD_PTR)&p32[i] - (DWORD_PTR)pIAT, p32[i]);
703683 }
704684 }
705685 else {
706686 countApiNotFound++;
707- AddNotFoundApiToModuleList (iat + (DWORD_PTR)&pIATAddress [i] - (DWORD_PTR)pIAT, pIATAddress [i]);
687+ AddNotFoundApiToModuleList (iat + (DWORD_PTR)&p32 [i] - (DWORD_PTR)pIAT, p32 [i]);
708688 }
709689 }
710- else {
711- countApiNotFound++;
712- AddNotFoundApiToModuleList (iat + (DWORD_PTR)&pIATAddress[i] - (DWORD_PTR)pIAT, pIATAddress[i]);
690+ }
691+ }
692+ else {
693+ pointerSize = 8 ;
694+ iatSize = size / pointerSize;
695+ for (SIZE_T i = 0 ; i < iatSize; i++) {
696+ if (!IsInvalidMemoryForIAT (p64[i])) {
697+ if (p64[i] > _minApiAddress && p64[i] < _maxApiAddress) {
698+ pApiFound = GetApiByVirtualAddress (p64[i], &isSuspect);
699+ if (pApiFound != nullptr ) {
700+ countApiFound++;
701+ if (pModule != pApiFound->pModule ) {
702+ pModule = pApiFound->pModule ;
703+ AddFoundApiToModuleList (iat + (DWORD_PTR)&p64[i] - (DWORD_PTR)pIAT, pApiFound, true , isSuspect);
704+ }
705+ else {
706+ AddFoundApiToModuleList (iat + (DWORD_PTR)&p64[i] - (DWORD_PTR)pIAT, pApiFound, false , isSuspect);
707+ }
708+ }
709+ else {
710+ countApiNotFound++;
711+ AddNotFoundApiToModuleList (iat + (DWORD_PTR)&p64[i] - (DWORD_PTR)pIAT, p64[i]);
712+ }
713+ }
714+ else {
715+ countApiNotFound++;
716+ AddNotFoundApiToModuleList (iat + (DWORD_PTR)&p64[i] - (DWORD_PTR)pIAT, p64[i]);
717+ }
713718 }
714719 }
715720 }
721+
722+
716723}
717724
718725void ApiReader::AddApi (const char * pName, WORD hint, WORD ordinal,
0 commit comments