DBG: updated 'findall' (maximum dumped occurrences = 5000) + dump data when the 3rd parameter equals '&data&'
This commit is contained in:
parent
64c2acd392
commit
f62c38fb97
|
@ -1060,20 +1060,26 @@ CMDRESULT cbInstrFindAll(int argc, char* argv[])
|
|||
dprintf("invalid memory address "fhex"!\n", addr);
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
unsigned char* data=(unsigned char*)emalloc(size, "cbInstrFind:data");
|
||||
unsigned char* data=(unsigned char*)emalloc(size, "cbInstrFindAll:data");
|
||||
if(!memread(fdProcessInfo->hProcess, (const void*)base, data, size, 0))
|
||||
{
|
||||
efree(data, "cbInstrFind:data");
|
||||
efree(data, "cbInstrFindAll:data");
|
||||
dputs("failed to read memory!");
|
||||
return STATUS_ERROR;
|
||||
}
|
||||
uint start=addr-base;
|
||||
uint find_size=0;
|
||||
bool findData=false;
|
||||
if(argc>=4)
|
||||
{
|
||||
if(!valfromstring(argv[3], &find_size))
|
||||
if(!_stricmp(argv[3], "&data&"))
|
||||
{
|
||||
find_size=size-start;
|
||||
if(find_size>(size-start))
|
||||
findData=true;
|
||||
}
|
||||
else if(!valfromstring(argv[3], &find_size))
|
||||
find_size=size-start;
|
||||
else if(find_size>(size-start))
|
||||
find_size=size-start;
|
||||
}
|
||||
else
|
||||
|
@ -1081,15 +1087,19 @@ CMDRESULT cbInstrFindAll(int argc, char* argv[])
|
|||
//setup reference view
|
||||
GuiReferenceDeleteAllColumns();
|
||||
GuiReferenceAddColumn(2*sizeof(uint), "Address");
|
||||
GuiReferenceAddColumn(0, "Disassembly");
|
||||
if(findData)
|
||||
GuiReferenceAddColumn(0, "&Data&");
|
||||
else
|
||||
GuiReferenceAddColumn(0, "Disassembly");
|
||||
GuiReferenceReloadData();
|
||||
DWORD ticks=GetTickCount();
|
||||
int refCount=0;
|
||||
uint i=0;
|
||||
uint result=0;
|
||||
while(true)
|
||||
while(refCount < 5000)
|
||||
{
|
||||
uint foundoffset=memfindpattern(data+start+i, find_size-i, pattern);
|
||||
int patternsize=0;
|
||||
uint foundoffset=memfindpattern(data+start+i, find_size-i, pattern, &patternsize);
|
||||
if(foundoffset==-1)
|
||||
break;
|
||||
i+=foundoffset+1;
|
||||
|
@ -1098,14 +1108,27 @@ CMDRESULT cbInstrFindAll(int argc, char* argv[])
|
|||
sprintf(msg, fhex, result);
|
||||
GuiReferenceSetRowCount(refCount+1);
|
||||
GuiReferenceSetCellContent(refCount, 0, msg);
|
||||
GuiGetDisassembly(result, msg);
|
||||
if(findData)
|
||||
{
|
||||
unsigned char* printData=(unsigned char*)emalloc(patternsize, "cbInstrFindAll:printData");
|
||||
memread(fdProcessInfo->hProcess, (const void*)result, printData, patternsize, 0);
|
||||
for(int j=0,k=0; j<patternsize; j++)
|
||||
{
|
||||
if(j)
|
||||
k+=sprintf(msg+k, " ");
|
||||
k+=sprintf(msg+k, "%.2X", printData[j]);
|
||||
}
|
||||
efree(printData, "cbInstrFindAll:printData");
|
||||
}
|
||||
else
|
||||
GuiGetDisassembly(result, msg);
|
||||
GuiReferenceSetCellContent(refCount, 1, msg);
|
||||
result++;
|
||||
refCount++;
|
||||
}
|
||||
GuiReferenceReloadData();
|
||||
dprintf("%d occurrences found in %ums\n", refCount, GetTickCount()-ticks);
|
||||
efree(data, "cbInstrFind:data");
|
||||
efree(data, "cbInstrFindAll:data");
|
||||
varset("$result", refCount, false);
|
||||
return STATUS_CONTINUE;
|
||||
}
|
||||
|
|
|
@ -176,12 +176,14 @@ static bool patternmatchbyte(unsigned char byte, PATTERNBYTE* pbyte)
|
|||
return (matched==2);
|
||||
}
|
||||
|
||||
uint memfindpattern(unsigned char* data, uint size, const char* pattern)
|
||||
uint memfindpattern(unsigned char* data, uint size, const char* pattern, int* patternsize)
|
||||
{
|
||||
std::vector<PATTERNBYTE> searchpattern;
|
||||
if(!patterntransform(pattern, &searchpattern))
|
||||
return -1;
|
||||
int searchpatternsize=searchpattern.size();
|
||||
if(patternsize)
|
||||
*patternsize=searchpatternsize;
|
||||
for(uint i=0,pos=0; i<size; i++) //search for the pattern
|
||||
{
|
||||
if(patternmatchbyte(data[i], &searchpattern.at(pos))) //check if our pattern matches the current byte
|
||||
|
|
|
@ -22,6 +22,6 @@ bool memwrite(HANDLE hProcess, void* lpBaseAddress, const void* lpBuffer, SIZE_T
|
|||
bool memisvalidreadptr(HANDLE hProcess, uint addr);
|
||||
void* memalloc(HANDLE hProcess, uint addr, DWORD size, DWORD fdProtect);
|
||||
void memfree(HANDLE hProcess, uint addr);
|
||||
uint memfindpattern(unsigned char* data, uint size, const char* pattern);
|
||||
uint memfindpattern(unsigned char* data, uint size, const char* pattern, int* patternsize = 0);
|
||||
|
||||
#endif // _MEMORY_H
|
||||
|
|
Loading…
Reference in New Issue