1
0
Fork 0

DBG: implement memcpy command

This commit is contained in:
Duncan Ogilvie 2019-11-13 01:13:06 +01:00
parent b23c0dfe37
commit 824100eea8
No known key found for this signature in database
GPG Key ID: FC89E0AAA0C1AAD8
4 changed files with 41 additions and 6 deletions

View File

@ -96,6 +96,33 @@ bool cbDebugMemset(int argc, char* argv[])
return true;
}
bool cbDebugMemcpy(int argc, char* argv[])
{
if(IsArgumentsLessThan(argc, 4))
return false;
duint dst = 0, src = 0, size = 0;
if(!valfromstring(argv[1], &dst, false) || !valfromstring(argv[2], &src, false) || !valfromstring(argv[3], &size, false))
return false;
duint totalNumberOfBytesWritten = 0;
std::vector<uint8_t> buffer;
buffer.resize(PAGE_SIZE); //copy a page at a time
for(size_t i = 0; i < size; i += buffer.size())
{
duint NumberOfBytesRead = 0;
auto readOk = MemRead(src + i, buffer.data(), min(buffer.size(), size - i), &NumberOfBytesRead);
duint NumberOfBytesWritten = 0;
auto writeOk = MemWrite(dst + i, buffer.data(), NumberOfBytesRead, &NumberOfBytesWritten);
totalNumberOfBytesWritten += NumberOfBytesWritten;
if(!readOk || !writeOk)
break;
}
GuiUpdateAllViews();
varset("$result", totalNumberOfBytesWritten, false);
return true;
}
bool cbDebugGetPageRights(int argc, char* argv[])
{
duint addr = 0;

View File

@ -5,6 +5,7 @@
bool cbDebugAlloc(int argc, char* argv[]);
bool cbDebugFree(int argc, char* argv[]);
bool cbDebugMemset(int argc, char* argv[]);
bool cbDebugMemcpy(int argc, char* argv[]);
bool cbDebugGetPageRights(int argc, char* argv[]);
bool cbDebugSetPageRights(int argc, char* argv[]);
bool cbInstrSavedata(int argc, char* argv[]);

View File

@ -413,7 +413,7 @@ bool cbInstrMeminfo(int argc, char* argv[])
{
if(argc < 3)
{
dputs_untranslated("Usage: meminfo a/r, addr");
dputs_untranslated("Usage: meminfo a/r, addr[, size]");
return false;
}
duint addr;
@ -424,11 +424,17 @@ bool cbInstrMeminfo(int argc, char* argv[])
}
if(argv[1][0] == 'a')
{
unsigned char buf = 0;
if(!ReadProcessMemory(fdProcessInfo->hProcess, (void*)addr, &buf, sizeof(buf), nullptr))
dputs_untranslated("ReadProcessMemory failed!");
else
dprintf_untranslated("Data: %02X\n", buf);
duint size = 1;
if(argc > 3 && !valfromstring(argv[3], &size))
{
dputs_untranslated("Invalid argument");
return false;
}
std::vector<uint8_t> buf;
buf.resize(size);
SIZE_T NumberOfBytesRead = 0;
ReadProcessMemory(fdProcessInfo->hProcess, (const void*)addr, buf.data(), buf.size(), &NumberOfBytesRead);
dprintf_untranslated("Data: %s\n", StringUtils::ToHex(buf.data(), NumberOfBytesRead).c_str());
}
else if(argv[1][0] == 'r')
{

View File

@ -239,6 +239,7 @@ static void registercommands()
dbgcmdnew("alloc", cbDebugAlloc, true); //allocate memory
dbgcmdnew("free", cbDebugFree, true); //free memory
dbgcmdnew("Fill,memset", cbDebugMemset, true); //memset
dbgcmdnew("memcpy", cbDebugMemcpy, true); //memcpy
dbgcmdnew("getpagerights,getrightspage", cbDebugGetPageRights, true);
dbgcmdnew("setpagerights,setrightspage", cbDebugSetPageRights, true);
dbgcmdnew("savedata", cbInstrSavedata, true); //save data to disk