Skip to content

Commit 91c418f

Browse files
Implement the IATReferenceScan and IATSearcher.
1 parent 477cb30 commit 91c418f

32 files changed

+15022
-6
lines changed

Anti-Rootkit.sln

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libMinHook", "minhook\build
2929
EndProject
3030
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Test", "Test\Test.vcxproj", "{F967758B-AE4A-44F6-AC12-7F63A9CE23E3}"
3131
EndProject
32+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "diStorm3", "diStorm3\diStorm3.vcxproj", "{BF8907F1-25D4-4F6F-AB03-7FF29FF56588}"
33+
EndProject
3234
Global
3335
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3436
Debug|ARM = Debug|ARM
@@ -236,6 +238,18 @@ Global
236238
{F967758B-AE4A-44F6-AC12-7F63A9CE23E3}.Release|x86.ActiveCfg = Release|Win32
237239
{F967758B-AE4A-44F6-AC12-7F63A9CE23E3}.Release|x86.Build.0 = Release|Win32
238240
{F967758B-AE4A-44F6-AC12-7F63A9CE23E3}.Release|x86.Deploy.0 = Release|Win32
241+
{BF8907F1-25D4-4F6F-AB03-7FF29FF56588}.Debug|ARM.ActiveCfg = Debug|Win32
242+
{BF8907F1-25D4-4F6F-AB03-7FF29FF56588}.Debug|ARM64.ActiveCfg = Debug|Win32
243+
{BF8907F1-25D4-4F6F-AB03-7FF29FF56588}.Debug|x64.ActiveCfg = Debug|x64
244+
{BF8907F1-25D4-4F6F-AB03-7FF29FF56588}.Debug|x64.Build.0 = Debug|x64
245+
{BF8907F1-25D4-4F6F-AB03-7FF29FF56588}.Debug|x86.ActiveCfg = Debug|Win32
246+
{BF8907F1-25D4-4F6F-AB03-7FF29FF56588}.Debug|x86.Build.0 = Debug|Win32
247+
{BF8907F1-25D4-4F6F-AB03-7FF29FF56588}.Release|ARM.ActiveCfg = Release|Win32
248+
{BF8907F1-25D4-4F6F-AB03-7FF29FF56588}.Release|ARM64.ActiveCfg = Release|Win32
249+
{BF8907F1-25D4-4F6F-AB03-7FF29FF56588}.Release|x64.ActiveCfg = Release|x64
250+
{BF8907F1-25D4-4F6F-AB03-7FF29FF56588}.Release|x64.Build.0 = Release|x64
251+
{BF8907F1-25D4-4F6F-AB03-7FF29FF56588}.Release|x86.ActiveCfg = Release|Win32
252+
{BF8907F1-25D4-4F6F-AB03-7FF29FF56588}.Release|x86.Build.0 = Release|Win32
239253
EndGlobalSection
240254
GlobalSection(SolutionProperties) = preSolution
241255
HideSolutionNode = FALSE

PEParser/PEParser.cpp

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@
99

1010

1111
PEParser::PEParser(const wchar_t* path) :_path(path) {
12-
_hFile = ::CreateFile(path, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr);
12+
_hFile = ::CreateFile(path, GENERIC_READ | GENERIC_WRITE,
13+
FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr);
1314
if (_hFile == INVALID_HANDLE_VALUE)
1415
return;
1516
::GetFileSizeEx(_hFile, &_fileSize);
16-
_hMemMap = ::CreateFileMapping(_hFile, nullptr, PAGE_READONLY, 0, 0, nullptr);
17+
_hMemMap = ::CreateFileMapping(_hFile, nullptr, PAGE_READWRITE, 0, 0, nullptr);
1718
if (!_hMemMap)
1819
return;
1920

20-
_address = (PBYTE)::MapViewOfFile(_hMemMap, FILE_MAP_READ, 0, 0, 0);
21+
_address = (PBYTE)::MapViewOfFile(_hMemMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
2122
if (!_address)
2223
return;
2324

@@ -306,6 +307,26 @@ unsigned PEParser::RvaToFileOffset(unsigned rva) const {
306307
return rva;
307308
}
308309

310+
DWORD_PTR PEParser::RVAToRelativeOffset(DWORD_PTR rva) const {
311+
auto sections = _sections;
312+
for (int i = 0; i < GetSectionCount(); ++i) {
313+
if (rva >= sections[i].VirtualAddress && rva < sections[i].VirtualAddress + _sections[i].Misc.VirtualSize)
314+
return rva - sections[i].VirtualAddress;
315+
}
316+
317+
return 0;
318+
}
319+
320+
int PEParser::RVAToSectionIndex(DWORD_PTR rva) const {
321+
auto sections = _sections;
322+
for (int i = 0; i < GetSectionCount(); ++i) {
323+
if (rva >= sections[i].VirtualAddress && rva < sections[i].VirtualAddress + _sections[i].Misc.VirtualSize)
324+
return i;
325+
}
326+
327+
return -1;
328+
}
329+
309330
bool PEParser::GetImportAddressTable() const {
310331
auto dir = GetDataDirectory(IMAGE_DIRECTORY_ENTRY_IAT);
311332
if (dir->Size == 0)
@@ -471,4 +492,8 @@ void PEParser::RelocateImageByDelta(std::vector<RelocInfo>& relocs, const uint64
471492
*reinterpret_cast<uint64_t*>(current_reloc.address + offset) += delta;
472493
}
473494
}
495+
}
496+
497+
PVOID PEParser::GetDataDirectoryAddress(UINT index, PULONG size) const {
498+
return ::ImageDirectoryEntryToData(_address, FALSE, index, size);
474499
}

PEParser/PEParser.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,13 +213,15 @@ class PEParser final {
213213
//std::vector<std::pair<DWORD, WIN_CERTIFICATE>> EnumCertificates() const;
214214
//const IMAGE_LOAD_CONFIG_DIRECTORY64* GetLoadConfiguration64() const;
215215
//const IMAGE_LOAD_CONFIG_DIRECTORY32* GetLoadConfiguration32() const;
216-
//PVOID GetDataDirectoryAddress(UINT index, PULONG size) const;
216+
PVOID GetDataDirectoryAddress(UINT index, PULONG size) const;
217217

218218
bool IsImportLib() const;
219219
bool IsObjectFile() const;
220220
ULONG GetExportByName(PCSTR exportName);
221221
HANDLE GetFileHandle();
222222
unsigned RvaToFileOffset(unsigned rva) const;
223+
DWORD_PTR RVAToRelativeOffset(DWORD_PTR rva) const;
224+
int RVAToSectionIndex(DWORD_PTR rva) const;
223225
IMAGE_SECTION_HEADER* GetSections();
224226

225227
LARGE_INTEGER GetFileSize() const;

0 commit comments

Comments
 (0)