Поиск в памяти чужой программы
От: XeKeN Россия  
Дата: 23.07.04 09:16
Оценка:
Добрый день. Появилась нужда поиска разной информации в памяти некой запущенной программе. Зарание место поиска не извесно. Как правильно произвести поиск и быстро? Вот код, до которого я пока дошел и вот что мне помогло когда я искал в интернете как это сделать (http://subscribe.ru/archive/comp.inroad/199912/12031837.html).
/////////////////////////////////////////
HWND hwndUO;
DWORD d;
int nBUFFER=255;
DWORD dwRead = 0;
DWORD *offset = 0;
char* lpBuffer = new char [nBUFFER];
ZeroMemory (lpBuffer, nBUFFER);
CString sBuffer, sFind = "то что я ищу";

hwndUO=FindWindowEx(NULL,NULL,"некая программа",NULL);
GetWindowThreadProcessId(hwndUO,&d);
HANDLE h=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ,0,d);
for(;;)
{
if(ReadProcessMemory(h, offset, lpBuffer,nBUFFER,&dwRead))
{
sBuffer = lpBuffer;
if(sBuffer.Find(sFind)!=-1)
{
//если нашел, то что-то делаю
}
}
else break;
offset++;
}
CloseHandle(h);
delete [] lpBuffer;
/////////////////////////////////////////
Вопросы:
1) Как ускорить поиск? Пробывал методы: увеличения буфера или вместо offset++; заменял на offset=offset+nBUFFER; (это мне кажется самым лучшем, но сомнения... сомнения ).
2) Какие недостатки в коде который я написал? (если они есть)
3) Переменная offset увеличивается всегда на 4. Это нормально?
4) Может вообще это я ерундой занился и есть лучше принцип поиска в памяти?

Зарание благодарю всех, кто откликнится на мои вопросы.

23.07.04 19:45: Перенесено модератором из 'C/C++' — Павел Кузнецов
Хочешь поиграть в Бога?
Займись программированием!
Re: Поиск в памяти чужой программы
От: BK  
Дата: 23.07.04 10:21
Оценка:
Что сильно медленно работает?

Я делал так
MEMORY_BASIC_INFORMATION MBI;
    DWORD dwNumByte;

    SYSTEM_INFO sInfo;
    GetSystemInfo(&sInfo);
    PVOID pvAddress =sInfo.lpMinimumApplicationAddress; 

    while( pvAddress < sInfo.lpMaximumApplicationAddress)
    {
        dwNumByte = VirtualQueryEx(hProcess,pvAddress,&MBI,sizeof(MBI) ); 

     if(dwNumByte != sizeof(MBI) )
     {
        //Error
     }
     
     pvAddress = (PVOID) ( (DWORD)MBI.BaseAddress + MBI.RegionSize);

     if( MEM_COMMIT != MBI.State ) continue;

       DWORD dwNumberOfBytesRead;
       void* pdwBuf = 0;
       pdwBuf= new BYTE[MBI.RegionSize];
       if(!pdwBuf) 
       {
            // error at alloc memory
       }

           BOOL b=FALSE;        
        b= ReadProcessMemory(
                  hProcess,       // handle to the process whose memory is read
                  MBI.BaseAddress,       // address to start reading
                  pdwBuf,// address of buffer to place read data
                  MBI.RegionSize,//iCount,                 // number of bytes to read
                  &dwNumberOfBytesRead  // address of number of bytes read
              );
Re: Поиск в памяти чужой программы
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 23.07.04 15:50
Оценка:
sBuffer.Find(sFind) — Найдет не все — будет искать до первого '\0'
Любая задача имеет решение, даже когда решения не существует
Re[2]: Поиск в памяти чужой программы
От: INsideR Латвия  
Дата: 12.12.04 03:01
Оценка:
Здравствуйте, BK, Вы писали:

BK>Что сильно медленно работает?


BK>
BK>Я делал так
BK>MEMORY_BASIC_INFORMATION MBI;
BK>    DWORD dwNumByte;

BK>    SYSTEM_INFO sInfo;
BK>    GetSystemInfo(&sInfo);
BK>    PVOID pvAddress =sInfo.lpMinimumApplicationAddress; 

BK>    while( pvAddress < sInfo.lpMaximumApplicationAddress)
BK>    {
BK>        dwNumByte = VirtualQueryEx(hProcess,pvAddress,&MBI,sizeof(MBI) ); 

BK>     if(dwNumByte != sizeof(MBI) )
BK>     {
BK>        //Error
BK>     }
     
BK>     pvAddress = (PVOID) ( (DWORD)MBI.BaseAddress + MBI.RegionSize);

BK>     if( MEM_COMMIT != MBI.State ) continue;

BK>       DWORD dwNumberOfBytesRead;
BK>       void* pdwBuf = 0;
BK>       pdwBuf= new BYTE[MBI.RegionSize];
BK>       if(!pdwBuf) 
BK>       {
BK>            // error at alloc memory
BK>       }

BK>           BOOL b=FALSE;        
BK>        b= ReadProcessMemory(
BK>                  hProcess,       // handle to the process whose memory is read
BK>                  MBI.BaseAddress,       // address to start reading
BK>                  pdwBuf,// address of buffer to place read data
BK>                  MBI.RegionSize,//iCount,                 // number of bytes to read
BK>                  &dwNumberOfBytesRead  // address of number of bytes read
BK>              );
    
BK>


Если нашёл необходимую строку, то как взять адрес? MBI.BaseAddress+i(где i смещение начала искомой строки) даёт не тот адрес который в действительности.
Мудр тот, кто знает не многое, а нужное
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.