(almost) finish implementing gui

This commit is contained in:
Akash Mozumdar 2018-07-28 12:41:21 -07:00
parent 5fbf92bc07
commit 4acd030e54
6 changed files with 51 additions and 32 deletions

View File

@ -1,32 +1,35 @@
#include "extensions.h" #include "extensions.h"
#include <map> #include <map>
#include <QDir>
std::map<int, ExtensionFunction> extensions; std::map<int, ExtensionFunction> extensions;
std::map<int, std::wstring> LoadExtensions() std::map<int, QString> LoadExtensions()
{ {
std::map<int, std::wstring> extensionNames; extensions = std::map<int, ExtensionFunction>();
wchar_t path[MAX_PATH]; std::map<int, QString> extensionNames;
wchar_t* end = path + GetModuleFileNameW(nullptr, path, MAX_PATH); wchar_t path[MAX_PATH] = {};
while (*(--end) != L'\\'); (QDir::currentPath() + "/*_nexthooker_extension.dll").toWCharArray(path);
*(end + 1) = L'*';
*(end + 2) = L'\0';
WIN32_FIND_DATAW fileData; WIN32_FIND_DATAW fileData;
HANDLE file = FindFirstFileW(path, &fileData); HANDLE file = FindFirstFileW(path, &fileData);
do do
if (!(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) if (GetProcAddress(GetModuleHandleW(fileData.cFileName), "OnNewSentence") ||
if (wcsstr(fileData.cFileName, L"_nexthooker_extension.dll")) GetProcAddress(LoadLibraryW(fileData.cFileName), "OnNewSentence")
if (GetProcAddress(LoadLibraryW(fileData.cFileName), "OnNewSentence")) )
{ {
extensions[std::wcstol(fileData.cFileName, nullptr, 10)] = (ExtensionFunction)GetProcAddress(LoadLibraryW(fileData.cFileName), "OnNewSentence"); extensions[std::wcstol(fileData.cFileName, nullptr, 10)] = (ExtensionFunction)GetProcAddress(GetModuleHandleW(fileData.cFileName), "OnNewSentence");
extensionNames[std::wcstol(fileData.cFileName, nullptr, 10)] = fileData.cFileName; QString name = QString::fromWCharArray(fileData.cFileName);
} name.chop(sizeof("_nexthooker_extension.dll") - 1);
name.remove(0, name.split("_")[0].length() + 1);
extensionNames[std::wcstol(fileData.cFileName, nullptr, 10)] = name;
}
while (FindNextFileW(file, &fileData) != 0); while (FindNextFileW(file, &fileData) != 0);
return extensionNames; return extensionNames;
} }
std::wstring DispatchSentenceToExtensions(std::wstring sentence, std::unordered_map<std::string, int> miscInfo) std::wstring DispatchSentenceToExtensions(std::wstring sentence, std::unordered_map<std::string, int> miscInfo)
{ {
for (auto extension : extensions) sentence = extension.second(sentence, miscInfo); for (auto extension : extensions)
extension.second(sentence, miscInfo);
return sentence; return sentence;
} }

View File

@ -8,10 +8,10 @@
#include <vector> #include <vector>
#include <QComboBox> #include <QComboBox>
std::map<int, std::wstring> LoadExtensions(); std::map<int, QString> LoadExtensions();
std::wstring DispatchSentenceToExtensions(std::wstring sentence, std::unordered_map<std::string, int> miscInfo); std::wstring DispatchSentenceToExtensions(std::wstring sentence, std::unordered_map<std::string, int> miscInfo);
typedef std::wstring(*ExtensionFunction)(std::wstring, std::unordered_map<std::string, int>&); typedef void(*ExtensionFunction)(std::wstring&, std::unordered_map<std::string, int>&);
extern QComboBox* ttCombo; extern QComboBox* ttCombo;
#endif // EXTENSIONS_H #endif // EXTENSIONS_H

View File

@ -62,8 +62,8 @@ MainWindow::MainWindow(QWidget *parent) :
connect(hostSignaller, &HostSignaller::AddThread, this, &MainWindow::AddThread); connect(hostSignaller, &HostSignaller::AddThread, this, &MainWindow::AddThread);
connect(hostSignaller, &HostSignaller::RemoveThread, this, &MainWindow::RemoveThread); connect(hostSignaller, &HostSignaller::RemoveThread, this, &MainWindow::RemoveThread);
connect(hostSignaller, &HostSignaller::ThreadOutput, this, &MainWindow::ThreadOutput); connect(hostSignaller, &HostSignaller::ThreadOutput, this, &MainWindow::ThreadOutput);
std::map<int, std::wstring> extensions = LoadExtensions(); std::map<int, QString> extensions = LoadExtensions();
for (auto i : extensions) extenCombo->addItem(QString::number(i.first) + ":" + QString::fromWCharArray(i.second.c_str())); for (auto i : extensions) extenCombo->addItem(QString::number(i.first) + ":" + i.second);
Host::Open(); Host::Open();
} }
@ -157,7 +157,7 @@ void MainWindow::on_hookButton_clicked()
{ {
bool ok; bool ok;
QString hookCode = QInputDialog::getText(this, "Add Hook", QString hookCode = QInputDialog::getText(this, "Add Hook",
"Enter hook code\r\n/H{A|B|W|S|Q}[N][data_offset[*drdo]][:sub_offset[*drso]]@addr[:module]", "Enter hook code\r\n/H{A|B|W|S|Q}[N]data_offset[*drdo][:sub_offset[*drso]]@addr[:module]",
QLineEdit::Normal, "/H", &ok QLineEdit::Normal, "/H", &ok
); );
if (ok) Host::InsertHook(processCombo->currentText().split(":")[0].toInt(), ParseHCode(hookCode)); if (ok) Host::InsertHook(processCombo->currentText().split(":")[0].toInt(), ParseHCode(hookCode));
@ -197,6 +197,27 @@ void MainWindow::on_ttCombo_activated(int index)
void MainWindow::on_addExtenButton_clicked() void MainWindow::on_addExtenButton_clicked()
{ {
QFileDialog extenSelector; QString extenFileName = QFileDialog::getOpenFileName(this, "Select extension dll", "C:\\", "Extensions (*.dll)");
if (!extenFileName.length()) return;
QString extenName = extenFileName.split("/")[extenFileName.split("/").count() - 1];
extenName.chop(4);
QString copyTo = QString::number(extenCombo->itemText(extenCombo->count() - 1).split(":")[0].toInt() + 1) + "_" +
extenName +
"_nexthooker_extension.dll";
QFile::copy(extenFileName, copyTo);
extenCombo->clear();
std::map<int, QString> extensions = LoadExtensions();
for (auto i : extensions) extenCombo->addItem(QString::number(i.first) + ":" + i.second);
}
void MainWindow::on_rmvExtenButton_clicked()
{
QString extenFileName = extenCombo->currentText().split(":")[0] + "_" + extenCombo->currentText().split(":")[1] + "_nexthooker_extension.dll";
FreeLibrary(GetModuleHandleW(extenFileName.toStdWString().c_str()));
QString disabledFileName = extenFileName;
disabledFileName.replace("extension", "disabled_extension");
QFile::rename(extenFileName, disabledFileName);
extenCombo->clear();
std::map<int, QString> extensions = LoadExtensions();
for (auto i : extensions) extenCombo->addItem(QString::number(i.first) + ":" + i.second);
} }

View File

@ -36,6 +36,8 @@ private slots:
void on_saveButton_clicked(); void on_saveButton_clicked();
void on_addExtenButton_clicked(); void on_addExtenButton_clicked();
void on_rmvExtenButton_clicked();
private: private:
QVector<HookParam> GetAllHooks(DWORD processId); QVector<HookParam> GetAllHooks(DWORD processId);

View File

@ -191,16 +191,9 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="enableExtenButton"> <widget class="QPushButton" name="rmvExtenButton">
<property name="text"> <property name="text">
<string>Enable extension</string> <string>Remove extension</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="disableExtenButton">
<property name="text">
<string>Disable extension</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -98,7 +98,7 @@ namespace Host
CloseHandle(CreateMutexW(nullptr, FALSE, (ITH_HOOKMAN_MUTEX_ + std::to_wstring(processId)).c_str())); CloseHandle(CreateMutexW(nullptr, FALSE, (ITH_HOOKMAN_MUTEX_ + std::to_wstring(processId)).c_str()));
if (GetLastError() == ERROR_ALREADY_EXISTS) if (GetLastError() == ERROR_ALREADY_EXISTS)
{ {
AddConsoleOutput(L"already locked"); AddConsoleOutput(L"already injected");
return false; return false;
} }