DBG: added various useful functions

This commit is contained in:
Mr. eXoDia 2014-07-01 17:01:30 +02:00
parent 0bd3792da3
commit 12979f33ca
6 changed files with 47 additions and 9 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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)
{

View File

@ -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);

View File

@ -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(origLen<destSize)
origLen+=disasmgetsize(addr+origLen);
@ -47,7 +60,7 @@ bool assembleat(uint addr, const char* instruction, char* error, bool fillnop)
unsigned char nops[16];
memset(nops, 0x90, sizeof(nops));
bool ret=memwrite(fdProcessInfo->hProcess, (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;

View File

@ -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