Skip to content

Commit 8a8fac6

Browse files
committed
Cleanups/refactors
God I hate windows code and this DWORD and WORD and HANDLE crap.
1 parent 4b607aa commit 8a8fac6

File tree

1 file changed

+59
-61
lines changed

1 file changed

+59
-61
lines changed

UWPInjector/source/main.cpp

Lines changed: 59 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -53,49 +53,56 @@ typedef struct {
5353
WCHAR ReparseTarget[1];
5454
} REPARSE_MOUNTPOINT_DATA_BUFFER, * PREPARSE_MOUNTPOINT_DATA_BUFFER;
5555

56-
static void CreateJunction(LPCSTR szJunction, LPCSTR szPath) {
57-
BYTE buf[sizeof(REPARSE_MOUNTPOINT_DATA_BUFFER) + MAX_PATH * sizeof(WCHAR)];
56+
static DWORD CreateJunction(LPCSTR szJunction, LPCSTR szPath)
57+
{
58+
DWORD LastError = ERROR_SUCCESS;
59+
std::byte buf[sizeof(REPARSE_MOUNTPOINT_DATA_BUFFER) + MAX_PATH * sizeof(WCHAR)] = {};
5860
REPARSE_MOUNTPOINT_DATA_BUFFER& ReparseBuffer = (REPARSE_MOUNTPOINT_DATA_BUFFER&)buf;
59-
char szTarget[MAX_PATH] = "\\??\\";
61+
char szTarget[MAX_PATH] = {};
6062

6163
strcat_s(szTarget, szPath);
6264
strcat_s(szTarget, "\\");
6365

64-
if (!::CreateDirectory(szJunction, NULL)) throw ::GetLastError();
66+
if( !CreateDirectory(szJunction, nullptr) ) return GetLastError();
6567

6668
// Obtain SE_RESTORE_NAME privilege (required for opening a directory)
67-
HANDLE hToken = NULL;
69+
HANDLE hToken = nullptr;
6870
TOKEN_PRIVILEGES tp;
6971
try {
70-
if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) throw ::GetLastError();
71-
if (!::LookupPrivilegeValue(NULL, SE_RESTORE_NAME, &tp.Privileges[0].Luid)) throw ::GetLastError();
72+
if( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) throw GetLastError();
73+
if( !LookupPrivilegeValue(nullptr, SE_RESTORE_NAME, &tp.Privileges[0].Luid)) throw GetLastError();
7274
tp.PrivilegeCount = 1;
7375
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
74-
if (!::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) throw ::GetLastError();
76+
if( !AdjustTokenPrivileges(hToken, false, &tp, sizeof(TOKEN_PRIVILEGES), nullptr, nullptr) ) throw GetLastError();
77+
}
78+
catch (DWORD LastError)
79+
{
80+
if( hToken ) CloseHandle(hToken);
81+
return LastError;
7582
}
76-
catch (DWORD) {} // Ignore errors
77-
if (hToken) ::CloseHandle(hToken);
83+
if( hToken ) CloseHandle(hToken);
7884

79-
HANDLE hDir = ::CreateFile(szJunction, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, NULL);
80-
if (hDir == INVALID_HANDLE_VALUE) throw ::GetLastError();
85+
const HANDLE hDir = CreateFile(szJunction, GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, nullptr);
86+
if( hDir == INVALID_HANDLE_VALUE ) return GetLastError();
8187

82-
memset(buf, 0, sizeof(buf));
8388
ReparseBuffer.ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
84-
int len = ::MultiByteToWideChar(CP_ACP, 0, szTarget, -1, ReparseBuffer.ReparseTarget, MAX_PATH);
85-
ReparseBuffer.ReparseTargetMaximumLength = (len--) * sizeof(WCHAR);
86-
ReparseBuffer.ReparseTargetLength = len * sizeof(WCHAR);
89+
int32_t len = MultiByteToWideChar(CP_ACP, 0, szTarget, -1, ReparseBuffer.ReparseTarget, MAX_PATH);
90+
ReparseBuffer.ReparseTargetMaximumLength = static_cast<WORD>((len--) * sizeof(WCHAR));
91+
ReparseBuffer.ReparseTargetLength = static_cast<WORD>(len * sizeof(WCHAR));
8792
ReparseBuffer.ReparseDataLength = ReparseBuffer.ReparseTargetLength + 12;
8893

8994
DWORD dwRet;
90-
if (!::DeviceIoControl(hDir, FSCTL_SET_REPARSE_POINT, &ReparseBuffer, ReparseBuffer.ReparseDataLength + REPARSE_MOUNTPOINT_HEADER_SIZE, NULL, 0, &dwRet, NULL)) {
91-
DWORD dr = ::GetLastError();
92-
::CloseHandle(hDir);
93-
::RemoveDirectory(szJunction);
94-
throw dr;
95+
if( !DeviceIoControl(hDir, FSCTL_SET_REPARSE_POINT, &ReparseBuffer, ReparseBuffer.ReparseDataLength + REPARSE_MOUNTPOINT_HEADER_SIZE, nullptr, 0, &dwRet, nullptr) )
96+
{
97+
LastError = GetLastError();
98+
CloseHandle(hDir);
99+
RemoveDirectory(szJunction);
100+
return LastError;
95101
}
96102

97-
::CloseHandle(hDir);
98-
} // CreateJunction
103+
CloseHandle(hDir);
104+
return ERROR_SUCCESS;
105+
}
99106

100107

101108
void IterateThreads(ThreadCallback ThreadProc, std::uint32_t ProcessID, void* Data)
@@ -139,11 +146,11 @@ int main(int argc, char** argv, char** envp)
139146
std::uint32_t ProcessID = 0;
140147
std::filesystem::path TargetPath("C:\\");
141148
bool Logging = false;
142-
if (argc > 1)
149+
if( argc > 1 )
143150
{
144-
for (std::size_t i = 1; i < argc; ++i)
151+
for( std::size_t i = 1; i < argc; ++i )
145152
{
146-
if (std::string_view(argv[i]) == "-h")
153+
if( std::string_view(argv[i]) == "-h" )
147154
{
148155
std::cout << "To Set PID:\n";
149156
std::cout << " -p {pid}\n";
@@ -156,9 +163,9 @@ int main(int argc, char** argv, char** envp)
156163
system("pause");
157164
return 0;
158165
}
159-
else if (std::string_view(argv[i]) == "-p")
166+
else if( std::string_view(argv[i]) == "-p" )
160167
{
161-
if (i != argc)
168+
if( i != argc)
162169
{
163170
ProcessID = (std::uint32_t)atoi(argv[i + 1]);
164171
}
@@ -169,13 +176,13 @@ int main(int argc, char** argv, char** envp)
169176
return 0;
170177
}
171178
}
172-
else if (std::string_view(argv[i]) == "-l")
179+
else if( std::string_view(argv[i]) == "-l" )
173180
{
174181
Logging = true;
175182
}
176-
else if (std::string_view(argv[i]) == "-d")
183+
else if( std::string_view(argv[i]) == "-d" )
177184
{
178-
if (i != argc)
185+
if( i != argc )
179186
{
180187
TargetPath = argv[i + 1];
181188
}
@@ -206,31 +213,29 @@ int main(int argc, char** argv, char** envp)
206213

207214
IPC::SetClientProcess(GetCurrentProcessId());
208215

209-
if (ProcessID == 0)
216+
if( ProcessID == 0)
210217
{
211218
std::cout << "\033[93mCurrently running UWP Apps:" << std::endl;
212219
void* ProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
213220
PROCESSENTRY32 ProcessEntry;
214221
ProcessEntry.dwSize = sizeof(PROCESSENTRY32);
215222

216-
if (Process32First(ProcessSnapshot, &ProcessEntry))
223+
if( Process32First(ProcessSnapshot, &ProcessEntry) )
217224
{
218-
while (Process32Next(ProcessSnapshot, &ProcessEntry))
225+
while (Process32Next(ProcessSnapshot, &ProcessEntry) )
219226
{
220227
void* ProcessHandle = OpenProcess(
221228
PROCESS_QUERY_LIMITED_INFORMATION,
222229
false,
223230
ProcessEntry.th32ProcessID
224231
);
225-
if (ProcessHandle)
232+
if( ProcessHandle)
226233
{
227234
std::uint32_t NameLength = 0;
228235
std::int32_t ProcessCode = GetPackageFamilyName(
229-
ProcessHandle,
230-
&NameLength,
231-
nullptr
236+
ProcessHandle, &NameLength, nullptr
232237
);
233-
if (NameLength)
238+
if( NameLength)
234239
{
235240
std::wcout
236241
<< "\033[92m"
@@ -249,7 +254,7 @@ int main(int argc, char** argv, char** envp)
249254
PackageName.get()
250255
);
251256

252-
if (ProcessCode != ERROR_SUCCESS)
257+
if( ProcessCode != ERROR_SUCCESS)
253258
{
254259
std::wcout << "GetPackageFamilyName Error: " << ProcessCode;
255260
}
@@ -275,31 +280,26 @@ int main(int argc, char** argv, char** envp)
275280
// Get package name
276281
std::wstring PackageFileName;
277282

278-
if (
283+
if(
279284
HANDLE ProcessHandle = OpenProcess(
280285
PROCESS_ALL_ACCESS | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
281-
false,
282-
ProcessID
286+
false, ProcessID
283287
); ProcessHandle
284288
)
285289
{
286290
std::uint32_t NameLength = 0;
287291
std::int32_t ProcessCode = GetPackageFamilyName(
288-
ProcessHandle,
289-
&NameLength,
290-
nullptr
292+
ProcessHandle, &NameLength, nullptr
291293
);
292-
if (NameLength)
294+
if( NameLength )
293295
{
294296
std::unique_ptr<wchar_t[]> PackageName(new wchar_t[NameLength]());
295297

296298
ProcessCode = GetPackageFamilyName(
297-
ProcessHandle,
298-
&NameLength,
299-
PackageName.get()
299+
ProcessHandle, &NameLength, PackageName.get()
300300
);
301301

302-
if (ProcessCode != ERROR_SUCCESS)
302+
if( ProcessCode != ERROR_SUCCESS )
303303
{
304304
std::wcout << "GetPackageFamilyName Error: " << ProcessCode;
305305
}
@@ -320,7 +320,7 @@ int main(int argc, char** argv, char** envp)
320320
size_t len;
321321
errno_t err = _dupenv_s(&LocalAppData, &len, "LOCALAPPDATA");
322322

323-
if ( TargetPath != std::filesystem::path("C:\\") )
323+
if( TargetPath != std::filesystem::path("C:\\") )
324324
{
325325
//get dump folder path
326326
std::filesystem::path DumpFolderPath(LocalAppData);
@@ -340,7 +340,7 @@ int main(int argc, char** argv, char** envp)
340340
IPC::SetTargetProcess(ProcessID);
341341

342342
std::cout << "\033[93mInjecting into remote process: ";
343-
if (!DLLInjectRemote(ProcessID, GetRunningDirectory() + L'\\' + DLLFile))
343+
if( !DLLInjectRemote(ProcessID, GetRunningDirectory() + L'\\' + DLLFile) )
344344
{
345345
std::cout << "\033[91mFailed" << std::endl;
346346
system("pause");
@@ -350,9 +350,9 @@ int main(int argc, char** argv, char** envp)
350350

351351
std::cout << "\033[93mWaiting for remote thread IPC:" << std::endl;
352352
std::chrono::high_resolution_clock::time_point ThreadTimeout = std::chrono::high_resolution_clock::now() + std::chrono::seconds(5);
353-
while (IPC::GetTargetThread() == IPC::InvalidThread)
353+
while( IPC::GetTargetThread() == IPC::InvalidThread )
354354
{
355-
if (std::chrono::high_resolution_clock::now() >= ThreadTimeout)
355+
if( std::chrono::high_resolution_clock::now() >= ThreadTimeout )
356356
{
357357
std::cout << "\033[91mRemote thread wait timeout: Unable to find target thread" << std::endl;
358358
system("pause");
@@ -362,7 +362,7 @@ int main(int argc, char** argv, char** envp)
362362

363363
std::cout << "Remote Dumper thread found: 0x" << std::hex << IPC::GetTargetThread() << std::endl;
364364

365-
if ( Logging )
365+
if( Logging )
366366
{
367367
std::filesystem::path LogFilePath = std::filesystem::current_path();
368368
//add package Name to logfile Path
@@ -383,7 +383,7 @@ int main(int argc, char** argv, char** envp)
383383
LogFilePath.concat(".txt");
384384
std::cout << LogFilePath << std::endl;
385385
LogFile = std::wofstream(LogFilePath);
386-
if (LogFile.is_open())
386+
if( LogFile.is_open() )
387387
{
388388
std::cout << "\033[92mLogging to File: " << LogFilePath << "\033[0m" << std::endl;
389389
}
@@ -403,15 +403,13 @@ int main(int argc, char** argv, char** envp)
403403
while( IPC::PopMessage(CurMessage) )
404404
{
405405
std::wcout << CurMessage << "\033[0m";
406-
if ( Logging )
406+
if( Logging )
407407
{
408408
LogFile << CurMessage << std::flush;
409409
}
410410
}
411411
}
412-
if ( Logging ) {
413-
LogFile.close();
414-
}
412+
if( Logging ) LogFile.close();
415413
system("pause");
416414
return EXIT_SUCCESS;
417415
}

0 commit comments

Comments
 (0)