make host play nice with larger addresses, and more refactoring

This commit is contained in:
Akash Mozumdar 2018-08-04 03:16:14 -04:00
parent bc6c1325ed
commit c32066e43c
7 changed files with 29 additions and 18 deletions

View File

@ -17,6 +17,5 @@ struct InfoForExtension
InfoForExtension* nextProperty; InfoForExtension* nextProperty;
}; };
typedef const wchar_t*(*ExtensionFunction)(const wchar_t*, const InfoForExtension*); typedef const wchar_t*(*ExtensionFunction)(const wchar_t*, const InfoForExtension*);
extern QComboBox* ttCombo;
#endif // EXTENSIONS_H #endif // EXTENSIONS_H

View File

@ -117,10 +117,7 @@ void MainWindow::AddThread(TextThread* thread)
); );
thread->RegisterOutputCallBack([&](TextThread* thread, std::wstring output) thread->RegisterOutputCallBack([&](TextThread* thread, std::wstring output)
{ {
output = DispatchSentenceToExtensions(output, output = DispatchSentenceToExtensions(output, GetInfoForExtensions(thread));
{
{ "current select", ttCombo->currentText().split(":")[0].toInt() == thread->Number() ? 1 : 0 }
});
emit ThreadOutputReceived(thread, QString::fromWCharArray(output.c_str())); emit ThreadOutputReceived(thread, QString::fromWCharArray(output.c_str()));
return output; return output;
}); });
@ -147,6 +144,18 @@ void MainWindow::ThreadOutput(TextThread* thread, QString output)
} }
} }
std::unordered_map<std::string, int> MainWindow::GetInfoForExtensions(TextThread* thread)
{
return
{
{ "current select", ttCombo->currentText().split(":")[0].toInt() == thread->Number() ? 1 : 0 },
{ "text number", thread->Number() },
{ "process id", thread->GetThreadParameter().pid },
{ "hook address", (int)thread->GetThreadParameter().hook },
{ "hook address (upper 32 bits)", (int)(thread->GetThreadParameter().hook >> 32) }
};
}
QVector<HookParam> MainWindow::GetAllHooks(DWORD processId) QVector<HookParam> MainWindow::GetAllHooks(DWORD processId)
{ {
std::unordered_set<DWORD> addresses; std::unordered_set<DWORD> addresses;

View File

@ -41,6 +41,7 @@ private slots:
void on_rmvExtenButton_clicked(); void on_rmvExtenButton_clicked();
private: private:
std::unordered_map<std::string, int> GetInfoForExtensions(TextThread* thread);
QVector<HookParam> GetAllHooks(DWORD processId); QVector<HookParam> GetAllHooks(DWORD processId);
Ui::MainWindow *ui; Ui::MainWindow *ui;

View File

@ -113,9 +113,9 @@ HookParam ParseHCode(QString HCode)
hp.type |= MODULE_OFFSET; hp.type |= MODULE_OFFSET;
hp.module = Hash(HCode); hp.module = Hash(HCode);
} }
if (hp.offset & 0x80000000) if (hp.offset < 0)
hp.offset -= 4; hp.offset -= 4;
if (hp.split & 0x80000000) if (hp.split < 0)
hp.split -= 4; hp.split -= 4;
return hp; return hp;
} }
@ -143,27 +143,29 @@ QString GenerateHCode(HookParam hp, DWORD processId)
} }
if (hp.type & NO_CONTEXT) if (hp.type & NO_CONTEXT)
code += "N"; code += "N";
if (hp.offset >> 31) if (hp.offset < 0) hp.offset += 4;
code += "-" + QString::number(-(hp.offset + 4), 16); if (hp.split < 0) hp.split += 4;
if (hp.offset < 0)
code += "-" + QString::number(-hp.offset, 16);
else else
code += QString::number(hp.offset, 16); code += QString::number(hp.offset, 16);
if (hp.type & DATA_INDIRECT) if (hp.type & DATA_INDIRECT)
{ {
if (hp.index >> 31) if (hp.index < 0)
code += "*-" + QString::number(-hp.index, 16); code += "*-" + QString::number(-hp.index, 16);
else else
code += "*" + QString::number(hp.index, 16); code += "*" + QString::number(hp.index, 16);
} }
if (hp.type & USING_SPLIT) if (hp.type & USING_SPLIT)
{ {
if (hp.split >> 31) if (hp.split < 0)
code += ":-" + QString::number(-(hp.split + 4), 16); code += ":-" + QString::number(-hp.split, 16);
else else
code += ":" + QString::number(hp.split, 16); code += ":" + QString::number(hp.split, 16);
} }
if (hp.type & SPLIT_INDIRECT) if (hp.type & SPLIT_INDIRECT)
{ {
if (hp.split_index >> 31) if (hp.split_index < 0)
code += "*-" + QString::number(-hp.split_index, 16); code += "*-" + QString::number(-hp.split_index, 16);
else else
code += "*" + QString::number(hp.split_index, 16); code += "*" + QString::number(hp.split_index, 16);

View File

@ -28,7 +28,7 @@ struct ThreadParameterHasher
{ {
size_t operator()(const ThreadParameter& tp) const size_t operator()(const ThreadParameter& tp) const
{ {
return std::hash<DWORD>()(tp.pid << 6) + std::hash<DWORD>()(tp.hook) + std::hash<DWORD>()(tp.retn) + std::hash<DWORD>()(tp.spl); return std::hash<__int64>()(tp.pid << 6) + std::hash<__int64>()(tp.hook) + std::hash<__int64>()(tp.retn) + std::hash<__int64>()(tp.spl);
} }
}; };

View File

@ -12,9 +12,9 @@
struct ThreadParameter struct ThreadParameter
{ {
DWORD pid; // jichi: 5/11/2014: The process ID DWORD pid; // jichi: 5/11/2014: The process ID
DWORD hook; // Artikash 6/6/2018: The start address of the hook unsigned __int64 hook; // Artikash 6/6/2018: The start address of the hook
DWORD retn; // jichi 5/11/2014: The return address of the hook unsigned __int64 retn; // jichi 5/11/2014: The return address of the hook
DWORD spl; // jichi 5/11/2014: the processed split value of the hook paramete __int64 spl; // jichi 5/11/2014: the processed split value of the hook paramete
// Artikash 5/31/2018: required for unordered_map to work with struct key // Artikash 5/31/2018: required for unordered_map to work with struct key
friend bool operator==(const ThreadParameter& one, const ThreadParameter& two) friend bool operator==(const ThreadParameter& one, const ThreadParameter& two)

View File

@ -77,7 +77,7 @@ struct Hook { // size: 0x80
BYTE recover[0x68 - sizeof(HookParam)]; BYTE recover[0x68 - sizeof(HookParam)];
BYTE original[0x10]; BYTE original[0x10];
DWORD Address() const { return hp.address; } unsigned __int64 Address() const { return hp.address; }
DWORD Type() const { return hp.type; } DWORD Type() const { return hp.type; }
WORD Length() const { return hp.hook_len; } WORD Length() const { return hp.hook_len; }
LPSTR Name() const { return hook_name; } LPSTR Name() const { return hook_name; }