Skip to content

Commit 6f0b0c3

Browse files
committed
feat(Util): Added checks for invalid DLL
Closes #4
1 parent 791fec2 commit 6f0b0c3

2 files changed

Lines changed: 102 additions & 0 deletions

File tree

src/Util.hpp

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
#pragma once
22
#include "Common.hpp"
33

4+
enum class DllValidityError
5+
{
6+
VALID,
7+
ACCESS_FAILURE,
8+
TOO_SMALL,
9+
ALLOCATION_FAILURE,
10+
NOT_A_DLL,
11+
INVALID_PLATFORM
12+
};
13+
414
namespace Util
515
{
616
inline const wchar_t* CharToWchar(const char* a)
@@ -11,4 +21,68 @@ namespace Util
1121

1222
return wchar;
1323
}
24+
25+
inline DllValidityError CheckIfFileIsValidDll(const std::filesystem::path& dllFile)
26+
{
27+
std::ifstream fileStream(dllFile, std::ios::binary | std::ios::ate);
28+
29+
if (fileStream.fail())
30+
{
31+
fileStream.close();
32+
33+
return DllValidityError::ACCESS_FAILURE;
34+
}
35+
36+
const auto fileSize = fileStream.tellg();
37+
if (fileSize < 0x1000)
38+
{
39+
fileStream.close();
40+
41+
return DllValidityError::TOO_SMALL;
42+
}
43+
44+
auto* pSrcData = new uint8_t[static_cast<uintptr_t>(fileSize)];
45+
if (!pSrcData)
46+
{
47+
fileStream.close();
48+
49+
return DllValidityError::ALLOCATION_FAILURE;
50+
}
51+
52+
fileStream.seekg(0, std::ios::beg);
53+
fileStream.read(reinterpret_cast<char*>(pSrcData), fileSize);
54+
fileStream.close();
55+
56+
if (reinterpret_cast<IMAGE_DOS_HEADER*>(pSrcData)->e_magic != 0x5A4D)
57+
{
58+
delete[] pSrcData;
59+
60+
return DllValidityError::NOT_A_DLL;
61+
}
62+
63+
const auto* pOldNtHeader = reinterpret_cast<IMAGE_NT_HEADERS*>(pSrcData + reinterpret_cast<IMAGE_DOS_HEADER*>(pSrcData)->e_lfanew);
64+
const auto* pOldFileHeader = &pOldNtHeader->FileHeader;
65+
66+
#ifdef _WIN64
67+
if (pOldFileHeader->Machine != IMAGE_FILE_MACHINE_AMD64)
68+
{
69+
delete[] pSrcData;
70+
delete pOldFileHeader;
71+
delete pOldNtHeader;
72+
73+
return DllValidityError::INVALID_PLATFORM;
74+
}
75+
#else
76+
if (pOldFileHeader->Machine != IMAGE_FILE_MACHINE_I386)
77+
{
78+
delete[] pSrcData;
79+
delete pOldFileHeader;
80+
delete pOldNtHeader;
81+
82+
return DllValidityError::INVALID_PLATFORM;
83+
}
84+
#endif
85+
86+
return DllValidityError::VALID;
87+
}
1488
}

src/main.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,34 @@ int main(int argc, const char** argv)
5959
if (!dllFile.is_absolute())
6060
dllFile = std::filesystem::absolute(dllFile);
6161
LOG(INFO) << "Starting injection for " << dllFile.filename().string();
62+
63+
switch (Util::CheckIfFileIsValidDll(dllFile))
64+
{
65+
case DllValidityError::ACCESS_FAILURE:
66+
LOG(WARNING) << "Failed to access DLL on disk.";
67+
68+
return 1;
69+
case DllValidityError::TOO_SMALL:
70+
LOG(WARNING) << "DLL file seems inconceivably small, request to inject ignored.";
71+
72+
return 1;
73+
case DllValidityError::ALLOCATION_FAILURE:
74+
LOG(WARNING) << "Failed to allocate memory when checking DLL file.";
75+
76+
return 1;
77+
case DllValidityError::NOT_A_DLL:
78+
LOG(WARNING) << "The file given does not appear to be a valid DLL.";
79+
80+
return 1;
81+
case DllValidityError::INVALID_PLATFORM:
82+
LOG(WARNING) << "The DLL given did not match the target platform the injector.";
83+
84+
return 1;
85+
case DllValidityError::VALID:
86+
LOG(INFO) << "DLL seems valid, proceeding with injection.";
87+
88+
break;
89+
}
6290

6391
const int processId = Injector::GetProcessId(targetApplication.data());
6492
if (processId == -1)

0 commit comments

Comments
 (0)