diff --git a/x64_dbg_dbg/_dbgfunctions.cpp b/x64_dbg_dbg/_dbgfunctions.cpp index 64d9a7bd..dc63a77f 100644 --- a/x64_dbg_dbg/_dbgfunctions.cpp +++ b/x64_dbg_dbg/_dbgfunctions.cpp @@ -42,6 +42,11 @@ static bool sectionfromaddr(duint addr, char* section) void dbgfunctionsinit() { - _dbgfunctions.DbgAssembleAtEx=assembleat; - _dbgfunctions.DbgSectionFromAddr=sectionfromaddr; + _dbgfunctions.AssembleAtEx=assembleat; + _dbgfunctions.SectionFromAddr=sectionfromaddr; + _dbgfunctions.ModNameFromAddr=modnamefromaddr; + _dbgfunctions.ModBaseFromAddr=modbasefromaddr; + _dbgfunctions.ModBaseFromName=modbasefromname; + _dbgfunctions.ModSizeFromAddr=modsizefromaddr; + _dbgfunctions.Assemble=assemble; } \ No newline at end of file diff --git a/x64_dbg_dbg/_dbgfunctions.h b/x64_dbg_dbg/_dbgfunctions.h index 0ca9da0d..af9dfe6b 100644 --- a/x64_dbg_dbg/_dbgfunctions.h +++ b/x64_dbg_dbg/_dbgfunctions.h @@ -1,13 +1,23 @@ #ifndef _DBGFUNCTIONS_H #define _DBGFUNCTIONS_H -typedef bool (*DBGASSEMBLEATEX)(duint addr, const char* instruction, char* error, bool fillnop); -typedef bool (*DBGSECTIONFROMADDR)(duint addr, char* section); +typedef bool (*ASSEMBLEATEX)(duint addr, const char* instruction, char* error, bool fillnop); +typedef bool (*SECTIONFROMADDR)(duint addr, char* section); +typedef bool (*MODNAMEFROMADDR)(uint addr, char* modname, bool extension); +typedef duint (*MODBASEFROMADDR)(uint addr); +typedef duint (*MODBASEFROMNAME)(const char* modname); +typedef duint (*MODSIZEFROMADDR)(uint addr); +typedef bool (*ASSEMBLE)(uint addr, unsigned char* dest, int* size, const char* instruction, char* error); struct DBGFUNCTIONS { - DBGASSEMBLEATEX DbgAssembleAtEx; - DBGSECTIONFROMADDR DbgSectionFromAddr; + ASSEMBLEATEX AssembleAtEx; + SECTIONFROMADDR SectionFromAddr; + MODNAMEFROMADDR ModNameFromAddr; + MODBASEFROMADDR ModBaseFromAddr; + MODBASEFROMNAME ModBaseFromName; + MODSIZEFROMADDR ModSizeFromAddr; + ASSEMBLE Assemble; }; #ifdef BUILD_DBG diff --git a/x64_dbg_dbg/addrinfo.cpp b/x64_dbg_dbg/addrinfo.cpp index 77e7bcf6..f152e92a 100644 --- a/x64_dbg_dbg/addrinfo.cpp +++ b/x64_dbg_dbg/addrinfo.cpp @@ -181,6 +181,14 @@ uint modbasefromname(const char* modname) return 0; } +uint modsizefromaddr(uint addr) +{ + const ModulesInfo::iterator found=modinfo.find(Range(addr, addr)); + if(found==modinfo.end()) //not found + return 0; + return found->second.size; +} + ///api functions bool apienumexports(uint base, EXPORTENUMCALLBACK cbEnum) { diff --git a/x64_dbg_dbg/addrinfo.h b/x64_dbg_dbg/addrinfo.h index f38f2f8e..b54f7391 100644 --- a/x64_dbg_dbg/addrinfo.h +++ b/x64_dbg_dbg/addrinfo.h @@ -124,6 +124,7 @@ uint modbasefromaddr(uint addr); uint modhashfromva(uint va); uint modhashfromname(const char* mod); uint modbasefromname(const char* modname); +uint modsizefromaddr(uint addr); bool apienumexports(uint base, EXPORTENUMCALLBACK cbEnum); diff --git a/x64_dbg_dbg/assemble.cpp b/x64_dbg_dbg/assemble.cpp index 8d2050c9..ee4175de 100644 --- a/x64_dbg_dbg/assemble.cpp +++ b/x64_dbg_dbg/assemble.cpp @@ -17,7 +17,7 @@ static bool cbUnknown(const char* text, ULONGLONG* value) return true; } -bool assembleat(uint addr, const char* instruction, char* error, bool fillnop) +bool assemble(uint addr, unsigned char* dest, int* size, const char* instruction, char* error) { if(strlen(instruction)>=XEDPARSE_MAXBUFSIZE) return false; @@ -38,8 +38,21 @@ bool assembleat(uint addr, const char* instruction, char* error, bool fillnop) return false; } + if(dest) + memcpy(dest, parse.dest, parse.dest_size); + if(size) + *size=parse.dest_size; + + return true; +} + +bool assembleat(uint addr, const char* instruction, char* error, bool fillnop) +{ + int destSize; + unsigned char dest[16]; + if(!assemble(addr, dest, &destSize, instruction, error)) + return false; //calculate the number of NOPs to insert - int destSize=parse.dest_size; int origLen=disasmgetsize(addr); while(origLenhProcess, (void*)addr, parse.dest, destSize, 0); + bool ret=memwrite(fdProcessInfo->hProcess, (void*)addr, dest, destSize, 0); if(ret && fillnop && nopsize) if(!memwrite(fdProcessInfo->hProcess, (void*)(addr+destSize), nops, nopsize, 0)) ret=false; diff --git a/x64_dbg_dbg/assemble.h b/x64_dbg_dbg/assemble.h index ac95b0f8..488d6fbf 100644 --- a/x64_dbg_dbg/assemble.h +++ b/x64_dbg_dbg/assemble.h @@ -3,6 +3,7 @@ #include "_global.h" +bool assemble(uint addr, unsigned char* dest, int* size, const char* instruction, char* error); bool assembleat(uint addr, const char* instruction, char* error, bool fillnop); #endif // _ASSEMBLE_H