?? memscan.c.svn-base
字號:
};
memoryregion[memoryregionentries].BaseAddress=baseaddress;
memoryregion[memoryregionentries].Size=memorysize;
memoryregionentries++;
}
(ULONG)mempointer+=memorysize;
}
if (memoryregionentries>0)
{
DbgPrint("Adjusting regions\n");
DbgPrint("before:TotalSize=%x\nmemoryregion[0].BaseAddress=%x\n",TotalSize,memoryregion[0].BaseAddress);
//adjust start and stop
if (memoryregion[0].BaseAddress<CurrentScan.Start)
{
memoryregion[0].Size-=CurrentScan.Start-memoryregion[0].BaseAddress;
TotalSize-=CurrentScan.Start-memoryregion[0].BaseAddress;
memoryregion[0].BaseAddress=CurrentScan.Start;
}
if (memoryregion[memoryregionentries-1].BaseAddress+memoryregion[memoryregionentries-1].Size>CurrentScan.Stop)
{
TotalSize-=(memoryregion[memoryregionentries-1].BaseAddress+memoryregion[memoryregionentries-1].Size)-CurrentScan.Stop;
memoryregion[memoryregionentries-1].Size-=(memoryregion[memoryregionentries-1].BaseAddress+memoryregion[memoryregionentries-1].Size)-CurrentScan.Stop;
}
DbgPrint("After:TotalSize=%x\nMemoryregion[0].BaseAddress=%x\n",TotalSize,memoryregion[0].BaseAddress);
}
/*
//this works:
mempointer=(PVOID)CurrentScan.Start;
if (((PBYTE)mempointer)[0]==12)
return;
*/
DbgPrint("Checking the TotalSize:%x\n",TotalSize);
if ((TotalSize==0) || (TotalSize>0xf0000000))
{
//I don't accept 0 memory
//and also not if there is more than 0xf0000000 bytes readable memory (more likely a signed underflow or other bug)
DbgPrint("Error with memory regions\n");
ScanResultCount(SE_NoMemoryFound);
return;
}
//now start the scan
DbgPrint("Initializing the progressbar. Totalsize=%d (%x)\n",TotalSize,TotalSize);
UpdateProgressBar(TotalSize,0); //max size of progressbar and the current pos (0) (both devided by 2)
BytesRead=0;
if (CurrentScan.Scantype==ST_Exact_value)
DbgPrint("Scantype=Exact value\n");
for (i=0; (i<memoryregionentries) && (CurrentScan.scanning);i++)
{
ULONG StopAddress;
DbgPrint("Region %d\n",i);
mempointer=(PVOID)(memoryregion[i].BaseAddress);
StopAddress=memoryregion[i].BaseAddress+memoryregion[i].Size;
//adjust the stopaddress so you dont scan unreadable memory
StopAddress-=CurrentScan.scanvaluelength-1;
UpdateProgressBar(TotalSize,BytesRead);
#define MemCheckAndHandle(nr,type,varsize,value) if ( /*it's faster to do this in a seperate code segment for each type, but lets try this first (less code)*/ \
((CurrentScan.Scantype==ST_Exact_value) && (*(##type)mempointer==value)) ||\
((CurrentScan.Scantype==ST_SmallerThan) && (*(##type)mempointer<value)) ||\
((CurrentScan.Scantype==ST_BiggerThan) && (*(##type)mempointer>value))\
)\
{\
/*found one*/ \
DbgPrint("Found one!!!\n");\
AddressList[found]=(ULONG)mempointer;\
ValueList##nr[found]=*(##type)mempointer;\
found++;\
if (found==AddressListSize)\
{\
DbgPrint("Writing tempfile\n");\
\
/*write the addresses and values to disk*/ \
CETC_Write(addressfile,AddressList,found*4,&iosb);\
CETC_Write(valuefile,ValueList##nr,found*varsize,&iosb);\
\
foundsaved+=found;\
found=0;\
}\
}
while ((ULONG)mempointer<StopAddress)
{
__try
{
switch (CurrentScan.Vartype)
{
case 0:
{
MemCheckAndHandle(0,PBYTE,1,bytevalue);
((ULONG)mempointer)++;
break;
}
case 1: //2 byte
{
MemCheckAndHandle(1,PWORD,2,wordvalue);
if (FastScan)
((ULONG)mempointer)+=2;
else
((ULONG)mempointer)++;
break;
}
case 2: //4 byte
{
MemCheckAndHandle(2,PDWORD,4,dwordvalue);
if (FastScan)
((ULONG)mempointer)+=4;
else
((ULONG)mempointer)++;
break;
}
case 3: //float
{
MemCheckAndHandle(3,float*,4,floatvalue)
if (FastScan)
((ULONG)mempointer)+=4;
else
((ULONG)mempointer)++;
break;
}
case 4: //double
{
MemCheckAndHandle(4,double*,8,doublevalue)
if (FastScan)
((ULONG)mempointer)+=8;
else
((ULONG)mempointer)++;
break;
}
case 6: //int64
{
MemCheckAndHandle(6,PINT64,8,int64value)
if (FastScan)
((ULONG)mempointer)+=8;
else
((ULONG)mempointer)++;
break;
}
case 7:
{
if (RtlCompareMemory(mempointer,stringvalue,CurrentScan.scanvaluelength)==CurrentScan.scanvaluelength)
{
found++;
if (found==AddressListSize)
{
DbgPrint("Writing tempfile\n");
/*write the addresses to disk*/
CETC_Write(addressfile,AddressList,found*4,&iosb);
foundsaved+=found;
found=0;
}
}
break;
}
default:
((ULONG)mempointer)++;
}
}
__except(1)
{
//unreadable
DbgPrint("unreadable %p\n",mempointer);
((ULONG)mempointer)+=PAGE_SIZE; //try the next page
//align on the base
(ULONG)mempointer=(ULONG)mempointer/0x1000*0x1000; //shouldn't be neccesary, but lets do it anyhow
}
} //while
BytesRead+=memoryregion[i].Size;
}
//now save the results
if (found>0)
{
DbgPrint("Writing tempfile\n");
ntStatus=CETC_Write(addressfile,AddressList,found*4,&iosb);
switch (CurrentScan.Vartype)
{
case 0:
{
//write the addresses and values to disk
ntStatus=CETC_Write(valuefile,ValueList0,found,&iosb);
break;
}
case 1:
{
//write the addresses and values to disk
ntStatus=CETC_Write(valuefile,ValueList1,found*2,&iosb);
break;
}
case 2:
{
//write the addresses and values to disk
ntStatus=CETC_Write(valuefile,ValueList2,found*4,&iosb);
break;
}
case 3:
{
//write the addresses and values to disk
ntStatus=CETC_Write(valuefile,ValueList3,found*4,&iosb);
break;
}
case 4:
{
//write the addresses and values to disk
ntStatus=CETC_Write(valuefile,ValueList4,found*8,&iosb);
break;
}
case 6:
{
//write the addresses and values to disk
ntStatus=CETC_Write(valuefile,ValueList6,found*8,&iosb);
break;
}
}
foundsaved+=found;
found=0;
}
//and tell the client the results
DbgPrint("found=%d and foundsaved=%d\n",found,foundsaved);
if ((found+foundsaved)<=MemscanOptions.max)
{
//read the addresses and values and tell them to the client
//first reposition the file pointer to the start
IO_STATUS_BLOCK isb;
FILE_POSITION_INFORMATION fpi;
int j,k;
fpi.CurrentByteOffset.QuadPart=0;
DbgPrint("Resetting the file position to 0\n");
ntStatus=ZwSetInformationFile(addressfile,&isb,&fpi,sizeof(FILE_POSITION_INFORMATION),FilePositionInformation);
DbgPrint("ntStatus=%d",ntStatus);
//read the AddressFile
i=0;
while ((i<MemscanOptions.max) && (i<foundsaved))
{
DbgPrint("Reading addressfile\n");
DbgPrint("(foundsaved<AddressListSize)? (foundsaved*4):(AddressListSize*4)=%d\n",(foundsaved<AddressListSize)? (foundsaved*4):(AddressListSize*4));
ntStatus=ZwReadFile(addressfile,NULL,NULL,NULL,&isb,AddressList,(foundsaved<AddressListSize)? (foundsaved*4):(AddressListSize*4),NULL,NULL);
DbgPrint("ntStatus=%x\n",ntStatus);
DbgPrint("isb.Information=%d\n",isb.Information);
if (isb.Information>4)
{
j=(int)isb.Information/4;
for (k=0; k<j; k++)
{
switch (CurrentScan.Vartype)
{
case 0://byte
ScanResult(AddressList[k],1);
break;
case 1:
ScanResult(AddressList[k],2);
break;
case 2:
case 3:
ScanResult(AddressList[k],4);
break;
case 4:
case 6:
ScanResult(AddressList[k],8);
break;
case 7:
ScanResult(AddressList[k],CurrentScan.scanvaluelength);
break;
}
//AddressList[k]
}
i+=j;
}
else
{
DbgPrint("Failed to read AddressList\n");
break;
}
}
FlushScanresultBuffer();
}
ScanResultCount(foundsaved);
}
__finally
{
}
}
__finally
{
DbgPrint("Detaching\n");
KeDetachProcess();
}
DbgPrint("returning\n");
}
__finally
{
//End of the thread.
//Free all the used memory and close the files
DbgPrint("Terminating\n");
DbgPrint("Free memory\n");
if (memoryregion!=NULL) ExFreePool(memoryregion);
if (AddressList!=NULL) ExFreePool(AddressList);
if (ValueList0!=NULL) ExFreePool(ValueList0);
if (ValueList1!=NULL) ExFreePool(ValueList1);
if (ValueList2!=NULL) ExFreePool(ValueList2);
if (ValueList3!=NULL) ExFreePool(ValueList3);
if (ValueList4!=NULL) ExFreePool(ValueList4);
if (ValueList6!=NULL) ExFreePool(ValueList6);
DbgPrint("Close files\n");
if (addressfile!=0) ZwClose(addressfile);
if (valuefile!=0) ZwClose(valuefile);
CurrentScan.scanning=FALSE;
CurrentScan.ThreadActive=FALSE;
PsTerminateSystemThread(STATUS_SUCCESS);
}
return;
}
BOOLEAN FirstScan(PEPROCESS ActivePEPROCESS, DWORD start,DWORD stop,BYTE vartype,BYTE scantype,BYTE scanvaluesize,char *scanvalue,BYTE ScanOptions)
{
BOOLEAN status=FALSE;
CurrentScan.process=ActivePEPROCESS;
CurrentScan.Start=start;
CurrentScan.Stop=stop;
CurrentScan.Vartype=vartype;
CurrentScan.Scantype=scantype;
CurrentScan.ScanOptions=ScanOptions;
if (CurrentScan.scanvalue!=NULL)
{
//a leftover from last scan (e.g thread crashed...)
ExFreePool(CurrentScan.scanvalue);
CurrentScan.scanvalue=NULL;
}
CurrentScan.scanvalue=ExAllocatePoolWithTag(PagedPool,scanvaluesize,0);
if (CurrentScan.scanvalue==NULL)
return FALSE; //error
RtlCopyMemory(CurrentScan.scanvalue,scanvalue,scanvaluesize);
CurrentScan.scanvaluelength=scanvaluesize;
__try
{
OBJECT_ATTRIBUTES oaCreateThread;
HANDLE th;
CurrentScan.scanning=TRUE;
//start the scan
if (scantype==ST_Advanced_Scan)
{
//unknown initial value scan
InitializeObjectAttributes(&oaCreateThread, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
DbgPrint("Creating scanthread\n");
if (NT_SUCCESS(PsCreateSystemThread(&th,0L,&oaCreateThread,NULL,NULL,UnknownInitialValueScan,NULL)))
{
DbgPrint("Created thread\n");
ZwClose(th); //I dont want this handle (useless anyhow except for setting priority)
}
else
DbgPrint("Failed to create thread\n");
}
else
{
//first scan for value
InitializeObjectAttributes(&oaCreateThread, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);
DbgPrint("Creating scanthread\n");
if (NT_SUCCESS(PsCreateSystemThread(&th,0L,&oaCreateThread,NULL,NULL,FirstScanThread,NULL)))
{
DbgPrint("Created thread\n");
ZwClose(th); //I dont want this handle (useless anyhow except for setting priority)
}
else
DbgPrint("Failed to create thread\n");
}
//and resume the command listener
}
__except(1)
{
DbgPrint("Error\n");
}
return status;
}
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -