Skip to content

Commit

Permalink
Added process selection for multiple processes with target name
Browse files Browse the repository at this point in the history
  • Loading branch information
belazr committed May 24, 2024
1 parent 1347ab5 commit 88c6956
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 23 deletions.
48 changes: 48 additions & 0 deletions src/io.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,41 @@ namespace io {
}


void printProcessIdMenu(const std::vector<DWORD>& procIds) {
clearConsole(cursorAfterTargetInfo, cursorAfterSelect);

printMenuItem("Select process ID:");

for (size_t i = 0; i < procIds.size(); i++) {
std::string menuItem{};

if (i == 0) {
menuItem += "[";
}
else {
menuItem += " ";
}

menuItem += std::to_string(i + 1);

if (i == 0) {
menuItem += "]";
}
else {
menuItem += " ";
}

menuItem += " " + std::to_string(procIds.at(i));

printMenuItem(menuItem);
}

std::cout << std::endl;

return;
}


static int getIntInput();

void selectAction(action* pAction) {
Expand Down Expand Up @@ -190,6 +225,19 @@ namespace io {
}


void selectProcessIdIndex(size_t* pProcIdIndex) {
const int input = getIntInput();

if (input < 1) return;

*pProcIdIndex = static_cast<DWORD>(input) - 1;

SetConsoleCursorPosition(hStdOut, cursorAfterLog);

return;
}


static void getTargetInput(std::string info, std::string* pTargetInfo);

void selectTargets(std::string* pProcName, std::string* pDllName, std::string* pDllDir) {
Expand Down
16 changes: 16 additions & 0 deletions src/io.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,14 @@ namespace io {
// Handle creation currently selected. Number is printed in brackets: " [2] label".
void printHandleCreationMenu(action curAction, handleCreation curHandleCreation);

// Prints the sub menu to select the process ID.
//
// Parameters:
//
// [in] procIds:
// List with all process IDs that are offered as a selection.
void printProcessIdMenu(const std::vector<DWORD>& procIds);

// Lets the user select the action to be executed.
//
// Parameters:
Expand All @@ -87,6 +95,14 @@ namespace io {
// Handle creation currently selected. Only overwritten for valid user input. For invalid input it keeps its value.
void selectHandleCreation(handleCreation* pHandleCreation);

// Lets the user select the target process ID.
//
// Parameters:
//
// [in/out] pProcIdIndex:
// Index of process id currently selected. Only overwritten for valid user input. For invalid input it keeps its value.
void selectProcessIdIndex(size_t* pProcIdIndex);

// Lets the user select the targets.
//
// Parameters:
Expand Down
50 changes: 27 additions & 23 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -112,30 +112,35 @@ static void takeInjectionAction(io::action curAction, io::launchMethod curLaunch
}


static bool searchProcId(const std::string* pProcName, std::vector<DWORD>* pProcIds);
static bool findProcIds(const std::string* pProcName, std::vector<DWORD>& procIds);

static HANDLE getProcessHandle(const std::string* pProcName, io::handleCreation curHandleCreation) {
std::vector<DWORD> procIds{};

if (!searchProcId(pProcName, &procIds)) return nullptr;
if (!findProcIds(pProcName, procIds)) return nullptr;

HANDLE hProc = nullptr;
size_t targetProcIdIndex = 0;

if (procIds.size() > 1) {
io::printProcessIdMenu(procIds);
io::selectProcessIdIndex(&targetProcIdIndex);
}

for (DWORD procId : procIds) {

switch (curHandleCreation) {
case io::OPEN_PROCESS:
hProc = OpenProcess(PROCESS_REQUIRED_ACCESS, FALSE, procId);
break;
case io::DUPLICATE_HANDLE:
hProc = hax::proc::getDuplicateProcessHandle(PROCESS_REQUIRED_ACCESS, FALSE, procId);
break;
default:
break;
}
const DWORD procId = procIds.at(targetProcIdIndex);

if (hProc && hProc != INVALID_HANDLE_VALUE) break;
io::printInfo("Injecting into process with ID: " + std::to_string(procId) + ".");

HANDLE hProc = nullptr;

switch (curHandleCreation) {
case io::OPEN_PROCESS:
hProc = OpenProcess(PROCESS_REQUIRED_ACCESS, FALSE, procId);
break;
case io::DUPLICATE_HANDLE:
hProc = hax::proc::getDuplicateProcessHandle(PROCESS_REQUIRED_ACCESS, FALSE, procId);
break;
default:
break;
}

if (!hProc || hProc == INVALID_HANDLE_VALUE) {
Expand All @@ -148,8 +153,8 @@ static HANDLE getProcessHandle(const std::string* pProcName, io::handleCreation
}


static bool searchProcId(const std::string* pProcName, std::vector<DWORD>* pProcIds) {
io::printInfo("Looking for process '" + *pProcName + "'...");
static bool findProcIds(const std::string* pProcName, std::vector<DWORD>& procIds) {
io::printInfo("Looking for processes with name: '" + *pProcName + "'...");

size_t size = 0u;

Expand All @@ -162,7 +167,7 @@ static bool searchProcId(const std::string* pProcName, std::vector<DWORD>* pProc
}

if (!size) {
io::printWinError("Could not find target process.");
io::printWinError("Could not find any processes.");

return false;
}
Expand All @@ -175,21 +180,20 @@ static bool searchProcId(const std::string* pProcName, std::vector<DWORD>* pProc
return false;
}

if (!hax::proc::getProcessIds(pProcName->c_str(), pIds, &size)) {
if (!hax::proc::getProcessIds(pProcName->c_str(), pIds, &size) || !size) {
delete[] pIds;
io::printWinError("Failed to get process IDs.");

return false;
}

io::printInfo("Found target process.");
io::printInfo(std::to_string(size) + " porcess(es) found.");

for (size_t i = 0u; i < size; i++) {
#pragma warning(push)
#pragma warning(disable:6385)

io::printInfo("ID: " + std::to_string(pIds[i]));
pProcIds->emplace_back(pIds[i]);
procIds.emplace_back(pIds[i]);

#pragma warning(pop)
}
Expand Down

0 comments on commit 88c6956

Please sign in to comment.