/** \brief Register a plugin command. \param pluginHandle Handle of the plugin to register a command for. \param command The command text to register. This text cannot contain the '\1' character. This text is not case sensitive. \param cbCommand The command callback. \param debugonly true if the command can only be called during debugging. \return true if it the registration succeeded, false otherwise. */ bool plugincmdregister(int pluginHandle, const char* command, CBPLUGINCOMMAND cbCommand, bool debugonly) { if(!command or strlen(command) >= deflen or strstr(command, "\1")) return false; PLUG_COMMAND plugCmd; plugCmd.pluginHandle = pluginHandle; strcpy_s(plugCmd.command, command); if(!dbgcmdnew(command, (CBCOMMAND)cbCommand, debugonly)) return false; pluginCommandList.push_back(plugCmd); dprintf("[PLUGIN] command \"%s\" registered!\n", command); return true; }
static void registercommands() { COMMAND* cmd = command_list = cmdinit(); //debug control dbgcmdnew("InitDebug\1init\1initdbg", cbDebugInit, false); //init debugger arg1:exefile,[arg2:commandline] dbgcmdnew("StopDebug\1stop\1dbgstop", cbDebugStop, true); //stop debugger dbgcmdnew("AttachDebugger\1attach", cbDebugAttach, false); //attach dbgcmdnew("DetachDebugger\1detach", cbDebugDetach, true); //detach dbgcmdnew("run\1go\1r\1g", cbDebugRun, true); //unlock WAITID_RUN dbgcmdnew("erun\1egun\1er\1eg", cbDebugErun, true); //run + skip first chance exceptions dbgcmdnew("pause", cbDebugPause, true); //pause debugger dbgcmdnew("StepInto\1sti", cbDebugStepInto, true); //StepInto dbgcmdnew("eStepInto\1esti", cbDebugeStepInto, true); //StepInto + skip first chance exceptions dbgcmdnew("StepOver\1step\1sto\1st", cbDebugStepOver, true); //StepOver dbgcmdnew("eStepOver\1estep\1esto\1est", cbDebugeStepOver, true); //StepOver + skip first chance exceptions dbgcmdnew("SingleStep\1sstep\1sst", cbDebugSingleStep, true); //SingleStep arg1:count dbgcmdnew("eSingleStep\1esstep\1esst", cbDebugeSingleStep, true); //SingleStep arg1:count + skip first chance exceptions dbgcmdnew("StepOut\1rtr", cbDebugRtr, true); //rtr dbgcmdnew("eStepOut\1ertr", cbDebugeRtr, true); //rtr + skip first chance exceptions dbgcmdnew("DebugContinue\1con", cbDebugContinue, true); //set continue status dbgcmdnew("LibrarianSetBreakPoint\1bpdll", cbDebugBpDll, true); //set dll breakpoint dbgcmdnew("LibrarianRemoveBreakPoint\1bcdll", cbDebugBcDll, true); //remove dll breakpoint dbgcmdnew("switchthread\1threadswitch", cbDebugSwitchthread, true); //switch thread dbgcmdnew("suspendthread\1threadsuspend", cbDebugSuspendthread, true); //suspend thread dbgcmdnew("resumethread\1threadresume", cbDebugResumethread, true); //resume thread dbgcmdnew("killthread\1threadkill", cbDebugKillthread, true); //kill thread dbgcmdnew("suspendallthreads\1threadsuspendall", cbDebugSuspendAllThreads, true); //suspend all threads dbgcmdnew("resumeallthreads\1threadresumeall", cbDebugResumeAllThreads, true); //resume all threads dbgcmdnew("setthreadpriority\1setprioritythread\1threadsetpriority", cbDebugSetPriority, true); //set thread priority dbgcmdnew("symdownload\1downloadsym", cbDebugDownloadSymbol, true); //download symbols dbgcmdnew("setjit\1jitset", cbDebugSetJIT, false); //set JIT dbgcmdnew("getjit\1jitget", cbDebugGetJIT, false); //get JIT dbgcmdnew("getjitauto\1jitgetauto", cbDebugGetJITAuto, false); //get JIT Auto dbgcmdnew("setjitauto\1jitsetauto", cbDebugSetJITAuto, false); //set JIT Auto dbgcmdnew("getcmdline\1getcommandline", cbDebugGetCmdline, true); //Get CmdLine dbgcmdnew("setcmdline\1setcommandline", cbDebugSetCmdline, true); //Set CmdLine dbgcmdnew("loadlib", cbDebugLoadLib, true); //Load DLL dbgcmdnew("skip", cbDebugSkip, true); //skip one instruction //breakpoints dbgcmdnew("bplist", cbDebugBplist, true); //breakpoint list dbgcmdnew("SetBPXOptions\1bptype", cbDebugSetBPXOptions, false); //breakpoint type dbgcmdnew("SetBPX\1bp\1bpx", cbDebugSetBPX, true); //breakpoint dbgcmdnew("DeleteBPX\1bpc\1bc", cbDebugDeleteBPX, true); //breakpoint delete dbgcmdnew("EnableBPX\1bpe\1be", cbDebugEnableBPX, true); //breakpoint enable dbgcmdnew("DisableBPX\1bpd\1bd", cbDebugDisableBPX, true); //breakpoint disable dbgcmdnew("SetHardwareBreakpoint\1bph\1bphws", cbDebugSetHardwareBreakpoint, true); //hardware breakpoint dbgcmdnew("DeleteHardwareBreakpoint\1bphc\1bphwc", cbDebugDeleteHardwareBreakpoint, true); //delete hardware breakpoint dbgcmdnew("EnableHardwareBreakpoint\1bphe\1bphwe", cbDebugEnableHardwareBreakpoint, true); //enable hardware breakpoint dbgcmdnew("DisableHardwareBreakpoint\1bphd\1bphwd", cbDebugDisableHardwareBreakpoint, true); //disable hardware breakpoint dbgcmdnew("SetMemoryBPX\1membp\1bpm", cbDebugSetMemoryBpx, true); //SetMemoryBPX dbgcmdnew("DeleteMemoryBPX\1membpc\1bpmc", cbDebugDeleteMemoryBreakpoint, true); //delete memory breakpoint dbgcmdnew("EnableMemoryBreakpoint\1membpe\1bpme", cbDebugEnableMemoryBreakpoint, true); //enable memory breakpoint dbgcmdnew("DisableMemoryBreakpoint\1membpd\1bpmd", cbDebugDisableMemoryBreakpoint, true); //enable memory breakpoint //variables dbgcmdnew("varnew\1var", cbInstrVar, false); //make a variable arg1:name,[arg2:value] dbgcmdnew("vardel", cbInstrVarDel, false); //delete a variable, arg1:variable name dbgcmdnew("varlist", cbInstrVarList, false); //list variables[arg1:type filter] dbgcmdnew("mov\1set", cbInstrMov, false); //mov a variable, arg1:dest,arg2:src //misc dbgcmdnew("strlen\1charcount\1ccount", cbStrLen, false); //get strlen, arg1:string dbgcmdnew("cls\1lc\1lclr", cbCls, false); //clear the log dbgcmdnew("chd", cbInstrChd, false); //Change directory dbgcmdnew("disasm\1dis\1d", cbDebugDisasm, true); //doDisasm dbgcmdnew("HideDebugger\1dbh\1hide", cbDebugHide, true); //HideDebugger dbgcmdnew("dump", cbDebugDump, true); //dump at address dbgcmdnew("sdump", cbDebugStackDump, true); //dump at stack address dbgcmdnew("refinit", cbInstrRefinit, false); dbgcmdnew("refadd", cbInstrRefadd, false); dbgcmdnew("asm", cbInstrAssemble, true); //assemble instruction dbgcmdnew("sleep", cbInstrSleep, false); //Sleep //user database dbgcmdnew("cmt\1cmtset\1commentset", cbInstrCmt, true); //set/edit comment dbgcmdnew("cmtc\1cmtdel\1commentdel", cbInstrCmtdel, true); //delete comment dbgcmdnew("lbl\1lblset\1labelset", cbInstrLbl, true); //set/edit label dbgcmdnew("lblc\1lbldel\1labeldel", cbInstrLbldel, true); //delete label dbgcmdnew("bookmark\1bookmarkset", cbInstrBookmarkSet, true); //set bookmark dbgcmdnew("bookmarkc\1bookmarkdel", cbInstrBookmarkDel, true); //delete bookmark dbgcmdnew("savedb\1dbsave", cbInstrSavedb, true); //save program database dbgcmdnew("loaddb\1dbload", cbInstrLoaddb, true); //load program database dbgcmdnew("functionadd\1func", cbInstrFunctionAdd, true); //function dbgcmdnew("functiondel\1funcc", cbInstrFunctionDel, true); //function dbgcmdnew("commentlist", cbInstrCommentList, true); //list comments dbgcmdnew("labellist", cbInstrLabelList, true); //list labels dbgcmdnew("bookmarklist", cbInstrBookmarkList, true); //list bookmarks dbgcmdnew("functionlist", cbInstrFunctionList, true); //list functions //memory operations dbgcmdnew("alloc", cbDebugAlloc, true); //allocate memory dbgcmdnew("free", cbDebugFree, true); //free memory dbgcmdnew("Fill\1memset", cbDebugMemset, true); //memset dbgcmdnew("getpagerights\1getrightspage", cbDebugGetPageRights, true); dbgcmdnew("setpagerights\1setrightspage", cbDebugSetPageRights, true); //plugins dbgcmdnew("StartScylla\1scylla\1imprec", cbDebugStartScylla, false); //start scylla //general purpose dbgcmdnew("cmp", cbInstrCmp, false); //compare dbgcmdnew("gpa", cbInstrGpa, true); dbgcmdnew("add", cbInstrAdd, false); dbgcmdnew("and", cbInstrAnd, false); dbgcmdnew("dec", cbInstrDec, false); dbgcmdnew("div", cbInstrDiv, false); dbgcmdnew("inc", cbInstrInc, false); dbgcmdnew("mul", cbInstrMul, false); dbgcmdnew("neg", cbInstrNeg, false); dbgcmdnew("not", cbInstrNot, false); dbgcmdnew("or", cbInstrOr, false); dbgcmdnew("rol", cbInstrRol, false); dbgcmdnew("ror", cbInstrRor, false); dbgcmdnew("shl", cbInstrShl, false); dbgcmdnew("shr", cbInstrShr, false); dbgcmdnew("sub", cbInstrSub, false); dbgcmdnew("test", cbInstrTest, false); dbgcmdnew("xor", cbInstrXor, false); //script dbgcmdnew("scriptload", cbScriptLoad, false); dbgcmdnew("msg", cbScriptMsg, false); dbgcmdnew("msgyn", cbScriptMsgyn, false); dbgcmdnew("log", cbInstrLog, false); //log command with superawesome hax //data dbgcmdnew("reffind\1findref\1ref", cbInstrRefFind, true); //find references to a value dbgcmdnew("refstr\1strref", cbInstrRefStr, true); //find string references dbgcmdnew("find", cbInstrFind, true); //find a pattern dbgcmdnew("findall", cbInstrFindAll, true); //find all patterns dbgcmdnew("modcallfind", cbInstrModCallFind, true); //find intermodular calls dbgcmdnew("findasm\1asmfind", cbInstrFindAsm, true); //find instruction dbgcmdnew("reffindrange\1findrefrange\1refrange", cbInstrRefFindRange, true); dbgcmdnew("yara", cbInstrYara, true); //yara test command dbgcmdnew("yaramod", cbInstrYaramod, true); //yara rule on module dbgcmdnew("analyse\1analyze\1anal", cbInstrAnalyse, true); //secret analysis command //undocumented dbgcmdnew("bench", cbDebugBenchmark, true); //benchmark test (readmem etc) dbgcmdnew("dprintf", cbPrintf, false); //printf dbgcmdnew("setstr\1strset", cbInstrSetstr, false); //set a string variable dbgcmdnew("getstr\1strget", cbInstrGetstr, false); //get a string variable dbgcmdnew("copystr\1strcpy", cbInstrCopystr, true); //write a string variable to memory dbgcmdnew("looplist", cbInstrLoopList, true); //list loops dbgcmdnew("capstone", cbInstrCapstone, true); //disassemble using capstone dbgcmdnew("visualize", cbInstrVisualize, true); //visualize analysis dbgcmdnew("meminfo", cbInstrMeminfo, true); //command to debug memory map bugs dbgcmdnew("cfanal\1cfanalyse\1cfanalyze", cbInstrCfanalyse, true); //control flow analysis dbgcmdnew("analyse_nukem\1analyze_nukem\1anal_nukem", cbInstrAnalyseNukem, true); //secret analysis command #2 dbgcmdnew("exanal\1exanalyse\1exanalyze", cbInstrExanalyse, true); //exception directory analysis dbgcmdnew("virtualmod", cbInstrVirtualmod, true); //virtual module }