AssembleDialog::AssembleDialog(QWidget* parent) : QDialog(parent), ui(new Ui::AssembleDialog) { ui->setupUi(this); setModal(true); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint | Qt::MSWindowsFixedSizeDialogHint); mSelectedInstrVa = 0; bKeepSizeChecked = false; bFillWithNopsChecked = false; setKeepSizeLabel(""); mValidateThread = new ValidateExpressionThread(this); mValidateThread->setOnExpressionChangedCallback(std::bind(&AssembleDialog::validateInstruction, this, std::placeholders::_1)); connect(ui->lineEdit, SIGNAL(textChanged(QString)), this, SLOT(textChangedSlot(QString))); connect(mValidateThread, SIGNAL(instructionChanged(dsint, QString)), this, SLOT(instructionChangedSlot(dsint, QString))); mValidateThread->start(); duint setting; if(BridgeSettingGetUint("Engine", "Assembler", &setting)) { if(setting == 1) ui->radioKeystone->setChecked(true); else if(setting == 2) ui->radioAsmjit->setChecked(true); } }
/** \brief Get a boolean setting from the configuration file. \param section The section of the setting (UTF-8). \param name The name of the setting (UTF-8). \return true if the setting was set and equals to true, otherwise returns false. */ bool settingboolget(const char* section, const char* name) { duint setting; if(!BridgeSettingGetUint(section, name, &setting)) return false; if(setting) return true; return false; }
void SettingsDialog::GetSettingBool(const char* section, const char* name, bool* set) { duint currentSetting; if(!set || !BridgeSettingGetUint(section, name, ¤tSetting)) return; if(currentSetting) *set = true; else *set = false; }
uint_t Configuration::uintFromConfig(const QString category, const QString id) { duint setting; if(!BridgeSettingGetUint(category.toUtf8().constData(), id.toUtf8().constData(), &setting)) { if(defaultUints.contains(category) && defaultUints[category].contains(id)) { setting = defaultUints[category][id]; uintToConfig(category, id, setting); return setting; } return 0; //DAFUG } return setting; }
bool Configuration::boolFromConfig(const QString category, const QString id) { duint setting; if(!BridgeSettingGetUint(category.toUtf8().constData(), id.toUtf8().constData(), &setting)) { if(defaultBools.contains(category) && defaultBools[category].contains(id)) { bool ret = defaultBools[category][id]; boolToConfig(category, id, ret); return ret; } return false; //DAFUG } return (setting != 0); }
void SettingsDialog::LoadSettings() { //Defaults memset(&settings, 0, sizeof(SettingsStruct)); settings.eventSystemBreakpoint = true; settings.eventTlsCallbacks = true; settings.eventEntryBreakpoint = true; settings.eventAttachBreakpoint = true; settings.engineCalcType = calc_unsigned; settings.engineBreakpointType = break_int3short; settings.engineUndecorateSymbolNames = true; settings.engineEnableSourceDebugging = true; settings.exceptionRanges = &realExceptionRanges; settings.disasmArgumentSpaces = false; settings.disasmMemorySpaces = false; settings.disasmUppercase = false; settings.disasmOnlyCipAutoComments = false; settings.disasmTabBetweenMnemonicAndArguments = false; //Events tab GetSettingBool("Events", "SystemBreakpoint", &settings.eventSystemBreakpoint); GetSettingBool("Events", "TlsCallbacks", &settings.eventTlsCallbacks); GetSettingBool("Events", "EntryBreakpoint", &settings.eventEntryBreakpoint); GetSettingBool("Events", "DllEntry", &settings.eventDllEntry); GetSettingBool("Events", "ThreadEntry", &settings.eventThreadEntry); GetSettingBool("Events", "AttachBreakpoint", &settings.eventAttachBreakpoint); GetSettingBool("Events", "DllLoad", &settings.eventDllLoad); GetSettingBool("Events", "DllUnload", &settings.eventDllUnload); GetSettingBool("Events", "ThreadStart", &settings.eventThreadStart); GetSettingBool("Events", "ThreadEnd", &settings.eventThreadEnd); GetSettingBool("Events", "DebugStrings", &settings.eventDebugStrings); ui->chkSystemBreakpoint->setCheckState(bool2check(settings.eventSystemBreakpoint)); ui->chkTlsCallbacks->setCheckState(bool2check(settings.eventTlsCallbacks)); ui->chkEntryBreakpoint->setCheckState(bool2check(settings.eventEntryBreakpoint)); ui->chkDllEntry->setCheckState(bool2check(settings.eventDllEntry)); ui->chkThreadEntry->setCheckState(bool2check(settings.eventThreadEntry)); ui->chkAttachBreakpoint->setCheckState(bool2check(settings.eventAttachBreakpoint)); ui->chkDllLoad->setCheckState(bool2check(settings.eventDllLoad)); ui->chkDllUnload->setCheckState(bool2check(settings.eventDllUnload)); ui->chkThreadStart->setCheckState(bool2check(settings.eventThreadStart)); ui->chkThreadEnd->setCheckState(bool2check(settings.eventThreadEnd)); ui->chkDebugStrings->setCheckState(bool2check(settings.eventDebugStrings)); //Engine tab duint cur; if(BridgeSettingGetUint("Engine", "CalculationType", &cur)) { switch(cur) { case calc_signed: case calc_unsigned: settings.engineCalcType = (CalcType)cur; break; } } if(BridgeSettingGetUint("Engine", "BreakpointType", &cur)) { switch(cur) { case break_int3short: case break_int3long: case break_ud2: settings.engineBreakpointType = (BreakpointType)cur; break; } } GetSettingBool("Engine", "UndecorateSymbolNames", &settings.engineUndecorateSymbolNames); GetSettingBool("Engine", "EnableDebugPrivilege", &settings.engineEnableDebugPrivilege); GetSettingBool("Engine", "EnableSourceDebugging", &settings.engineEnableSourceDebugging); GetSettingBool("Engine", "SaveDatabaseInProgramDirectory", &settings.engineSaveDatabaseInProgramDirectory); GetSettingBool("Engine", "DisableDatabaseCompression", &settings.engineDisableDatabaseCompression); switch(settings.engineCalcType) { case calc_signed: ui->radioSigned->setChecked(true); break; case calc_unsigned: ui->radioUnsigned->setChecked(true); break; } switch(settings.engineBreakpointType) { case break_int3short: ui->radioInt3Short->setChecked(true); break; case break_int3long: ui->radioInt3Long->setChecked(true); break; case break_ud2: ui->radioUd2->setChecked(true); break; } ui->chkUndecorateSymbolNames->setChecked(settings.engineUndecorateSymbolNames); ui->chkEnableDebugPrivilege->setChecked(settings.engineEnableDebugPrivilege); ui->chkEnableSourceDebugging->setChecked(settings.engineEnableSourceDebugging); ui->chkSaveDatabaseInProgramDirectory->setChecked(settings.engineSaveDatabaseInProgramDirectory); ui->chkDisableDatabaseCompression->setChecked(settings.engineDisableDatabaseCompression); //Exceptions tab char exceptionRange[MAX_SETTING_SIZE] = ""; if(BridgeSettingGet("Exceptions", "IgnoreRange", exceptionRange)) { QStringList ranges = QString(exceptionRange).split(QString(","), QString::SkipEmptyParts); for(int i = 0; i < ranges.size(); i++) { unsigned long start; unsigned long end; if(sscanf_s(ranges.at(i).toUtf8().constData(), "%08X-%08X", &start, &end) == 2 && start <= end) { RangeStruct newRange; newRange.start = start; newRange.end = end; AddRangeToList(newRange); } } } //Disasm tab GetSettingBool("Disassembler", "ArgumentSpaces", &settings.disasmArgumentSpaces); GetSettingBool("Disassembler", "MemorySpaces", &settings.disasmMemorySpaces); GetSettingBool("Disassembler", "Uppercase", &settings.disasmUppercase); GetSettingBool("Disassembler", "OnlyCipAutoComments", &settings.disasmOnlyCipAutoComments); GetSettingBool("Disassembler", "TabbedMnemonic", &settings.disasmTabBetweenMnemonicAndArguments); ui->chkArgumentSpaces->setChecked(settings.disasmArgumentSpaces); ui->chkMemorySpaces->setChecked(settings.disasmMemorySpaces); ui->chkUppercase->setChecked(settings.disasmUppercase); ui->chkOnlyCipAutoComments->setChecked(settings.disasmOnlyCipAutoComments); ui->chkTabBetweenMnemonicAndArguments->setChecked(settings.disasmTabBetweenMnemonicAndArguments); //Misc tab if(DbgFunctions()->GetJit) { char jit_entry[MAX_SETTING_SIZE] = ""; char jit_def_entry[MAX_SETTING_SIZE] = ""; bool isx64 = true; #ifndef _WIN64 isx64 = false; #endif bool jit_auto_on; bool get_jit_works; get_jit_works = DbgFunctions()->GetJit(jit_entry, isx64); DbgFunctions()->GetDefJit(jit_def_entry); if(get_jit_works) { if(_strcmpi(jit_entry, jit_def_entry) == 0) settings.miscSetJIT = true; } else settings.miscSetJIT = false; ui->editJIT->setText(jit_entry); ui->editJIT->setCursorPosition(0); ui->chkSetJIT->setCheckState(bool2check(settings.miscSetJIT)); bool get_jit_auto_works = DbgFunctions()->GetJitAuto(&jit_auto_on); if(!get_jit_auto_works || !jit_auto_on) settings.miscSetJITAuto = true; else settings.miscSetJITAuto = false; ui->chkConfirmBeforeAtt->setCheckState(bool2check(settings.miscSetJITAuto)); if(!DbgFunctions()->IsProcessElevated()) { ui->chkSetJIT->setDisabled(true); ui->chkConfirmBeforeAtt->setDisabled(true); ui->lblAdminWarning->setText(QString("<font color=\"red\"><b>Warning</b></font>: Run the debugger as Admin to enable JIT.")); } else ui->lblAdminWarning->setText(""); } char setting[MAX_SETTING_SIZE] = ""; if(BridgeSettingGet("Symbols", "DefaultStore", setting)) ui->editSymbolStore->setText(QString(setting)); else { QString defaultStore = "http://msdl.microsoft.com/download/symbols"; ui->editSymbolStore->setText(defaultStore); BridgeSettingSet("Symbols", "DefaultStore", defaultStore.toUtf8().constData()); } if(BridgeSettingGet("Symbols", "CachePath", setting)) ui->editSymbolCache->setText(QString(setting)); bJitOld = settings.miscSetJIT; bJitAutoOld = settings.miscSetJITAuto; }
extern "C" DLL_EXPORT uint _dbg_sendmessage(DBGMSG type, void* param1, void* param2) { if(dbgisstopped()) { switch(type) //ignore win events { //these functions are safe to call when we did not initialize yet case DBG_DEINITIALIZE_LOCKS: case DBG_INITIALIZE_LOCKS: case DBG_GET_FUNCTIONS: case DBG_SETTINGS_UPDATED: case DBG_GET_THREAD_LIST: case DBG_WIN_EVENT: case DBG_WIN_EVENT_GLOBAL: break; //the rest is unsafe -> throw an exception when people try to call them default: __debugbreak(); //we cannot process messages when the debugger is stopped, this must be a bug } } switch(type) { case DBG_SCRIPT_LOAD: { scriptload((const char*)param1); } break; case DBG_SCRIPT_UNLOAD: { scriptunload(); } break; case DBG_SCRIPT_RUN: { scriptrun((int)(duint)param1); } break; case DBG_SCRIPT_STEP: { scriptstep(); } break; case DBG_SCRIPT_BPTOGGLE: { return scriptbptoggle((int)(duint)param1); } break; case DBG_SCRIPT_BPGET: { return scriptbpget((int)(duint)param1); } break; case DBG_SCRIPT_CMDEXEC: { return scriptcmdexec((const char*)param1); } break; case DBG_SCRIPT_ABORT: { scriptabort(); } break; case DBG_SCRIPT_GETLINETYPE: { return (duint)scriptgetlinetype((int)(duint)param1); } break; case DBG_SCRIPT_SETIP: { scriptsetip((int)(duint)param1); } break; case DBG_SCRIPT_GETBRANCHINFO: { return (duint)scriptgetbranchinfo((int)(duint)param1, (SCRIPTBRANCH*)param2); } break; case DBG_SYMBOL_ENUM: { SYMBOLCBINFO* cbInfo = (SYMBOLCBINFO*)param1; SymEnum(cbInfo->base, cbInfo->cbSymbolEnum, cbInfo->user); } break; case DBG_ASSEMBLE_AT: { return assembleat((duint)param1, (const char*)param2, 0, 0, false); } break; case DBG_MODBASE_FROM_NAME: { return ModBaseFromName((const char*)param1); } break; case DBG_DISASM_AT: { disasmget((uint)param1, (DISASM_INSTR*)param2); } break; case DBG_STACK_COMMENT_GET: { return stackcommentget((uint)param1, (STACK_COMMENT*)param2); } break; case DBG_GET_THREAD_LIST: { ThreadGetList((THREADLIST*)param1); } break; case DBG_SETTINGS_UPDATED: { valuesetsignedcalc(!settingboolget("Engine", "CalculationType")); //0:signed, 1:unsigned SetEngineVariable(UE_ENGINE_SET_DEBUG_PRIVILEGE, settingboolget("Engine", "EnableDebugPrivilege")); bOnlyCipAutoComments = settingboolget("Disassembler", "OnlyCipAutoComments"); bListAllPages = settingboolget("Engine", "ListAllPages"); bUndecorateSymbolNames = settingboolget("Engine", "UndecorateSymbolNames"); bEnableSourceDebugging = settingboolget("Engine", "EnableSourceDebugging"); uint setting; if(BridgeSettingGetUint("Engine", "BreakpointType", &setting)) { switch(setting) { case 0: //break_int3short SetBPXOptions(UE_BREAKPOINT_INT3); break; case 1: //break_int3long SetBPXOptions(UE_BREAKPOINT_LONG_INT3); break; case 2: //break_ud2 SetBPXOptions(UE_BREAKPOINT_UD2); break; } } char exceptionRange[MAX_SETTING_SIZE] = ""; dbgclearignoredexceptions(); if(BridgeSettingGet("Exceptions", "IgnoreRange", exceptionRange)) { char* entry = strtok(exceptionRange, ","); while(entry) { unsigned long start; unsigned long end; if(sscanf(entry, "%08X-%08X", &start, &end) == 2 && start <= end) { ExceptionRange range; range.start = start; range.end = end; dbgaddignoredexception(range); } entry = strtok(0, ","); } } char cachePath[MAX_SETTING_SIZE]; if(BridgeSettingGet("Symbols", "CachePath", cachePath)) { // Trim the buffer to fit inside MAX_PATH strncpy_s(szSymbolCachePath, cachePath, _TRUNCATE); } } break; case DBG_DISASM_FAST_AT: { if(!param1 || !param2) return 0; BASIC_INSTRUCTION_INFO* basicinfo = (BASIC_INSTRUCTION_INFO*)param2; if(!disasmfast((uint)param1, basicinfo)) basicinfo->size = 1; return 0; } break; case DBG_MENU_ENTRY_CLICKED: { int hEntry = (int)(uint)param1; pluginmenucall(hEntry); } break; case DBG_FUNCTION_GET: { FUNCTION_LOOP_INFO* info = (FUNCTION_LOOP_INFO*)param1; return (uint)FunctionGet(info->addr, &info->start, &info->end); } break; case DBG_FUNCTION_OVERLAPS: { FUNCTION_LOOP_INFO* info = (FUNCTION_LOOP_INFO*)param1; return (uint)FunctionOverlaps(info->start, info->end); } break; case DBG_FUNCTION_ADD: { FUNCTION_LOOP_INFO* info = (FUNCTION_LOOP_INFO*)param1; return (uint)FunctionAdd(info->start, info->end, info->manual); } break; case DBG_FUNCTION_DEL: { FUNCTION_LOOP_INFO* info = (FUNCTION_LOOP_INFO*)param1; return (uint)FunctionDelete(info->addr); } break; case DBG_LOOP_GET: { FUNCTION_LOOP_INFO* info = (FUNCTION_LOOP_INFO*)param1; return (uint)LoopGet(info->depth, info->addr, &info->start, &info->end); } break; case DBG_LOOP_OVERLAPS: { FUNCTION_LOOP_INFO* info = (FUNCTION_LOOP_INFO*)param1; return (uint)LoopOverlaps(info->depth, info->start, info->end, 0); } break; case DBG_LOOP_ADD: { FUNCTION_LOOP_INFO* info = (FUNCTION_LOOP_INFO*)param1; return (uint)LoopAdd(info->start, info->end, info->manual); } break; case DBG_LOOP_DEL: { FUNCTION_LOOP_INFO* info = (FUNCTION_LOOP_INFO*)param1; return (uint)LoopDelete(info->depth, info->addr); } break; case DBG_IS_RUN_LOCKED: { return (uint)waitislocked(WAITID_RUN); } break; case DBG_IS_BP_DISABLED: { BREAKPOINT bp; if(BpGet((uint)param1, BPNORMAL, 0, &bp)) return !(uint)bp.enabled; return (uint)false; } break; case DBG_SET_AUTO_COMMENT_AT: { return (uint)CommentSet((uint)param1, (const char*)param2, false); } break; case DBG_DELETE_AUTO_COMMENT_RANGE: { CommentDelRange((uint)param1, (uint)param2); } break; case DBG_SET_AUTO_LABEL_AT: { return (uint)LabelSet((uint)param1, (const char*)param2, false); } break; case DBG_DELETE_AUTO_LABEL_RANGE: { LabelDelRange((uint)param1, (uint)param2); } break; case DBG_SET_AUTO_BOOKMARK_AT: { return (uint)BookmarkSet((uint)param1, false); } break; case DBG_DELETE_AUTO_BOOKMARK_RANGE: { BookmarkDelRange((uint)param1, (uint)param2); } break; case DBG_SET_AUTO_FUNCTION_AT: { return (uint)FunctionAdd((uint)param1, (uint)param2, false); } break; case DBG_DELETE_AUTO_FUNCTION_RANGE: { FunctionDelRange((uint)param1, (uint)param2); } break; case DBG_GET_STRING_AT: { STRING_TYPE strtype; char string[MAX_STRING_SIZE]; if(disasmgetstringat((uint)param1, &strtype, string, string, MAX_STRING_SIZE-3)) { if(strtype == str_ascii) sprintf((char*)param2, "\"%s\"", string); else //unicode sprintf((char*)param2, "L\"%s\"", string); return true; } return false; } break; case DBG_GET_FUNCTIONS: { return (uint)dbgfunctionsget(); } break; case DBG_WIN_EVENT: { return (uint)pluginwinevent((MSG*)param1, (long*)param2); } break; case DBG_WIN_EVENT_GLOBAL: { return (uint)pluginwineventglobal((MSG*)param1); } break; case DBG_INITIALIZE_LOCKS: { SectionLockerGlobal::Initialize(); } break; case DBG_DEINITIALIZE_LOCKS: { SectionLockerGlobal::Deinitialize(); } break; case DBG_GET_TIME_WASTED_COUNTER: return dbggettimewastedcounter(); } return 0; }