Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Использование ReadProcessMemory


Автор: SvetRus 15.11.2008, 22:52
Пытаюсь разобраться с использованием ReadProcessMemory().
Создал тестовое приложение, приложение должно запустить калькулятор и попытаться прочитать первый байт кода калькулятора. При запуске приложение не может выйти из while(), т.е. не происходит чтения. Что я делаю не так?
Код

int _tmain(int argc, _TCHAR* argv[])
{
    //тут информация о запуске процесса
    STARTUPINFO si;
    //очищаем
    ZeroMemory(&si,sizeof(STARTUPINFO));
    //тут храниться  информация о процессе
    PROCESS_INFORMATION pi;
    //грузим наш процесс
    CreateProcess(_T("C:\\WINDOWS\\system32\\calc.exe"),NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
    //буфер для хранения считаных байтов
    char* lpBuffer = new char [0xFF];
    //очищаем буфер 
    ZeroMemory(lpBuffer, 0xFF);
    //количество считанных байт
    DWORD dwRead = 0;
    //сдвиг чтения
    DWORD *offset = 0;
    //читаем
    while(!ReadProcessMemory(pi.hProcess, offset, lpBuffer, 1, &dwRead));
    //удаляем буфер
    delete [] lpBuffer; 
    return 0;
}


Автор: BorisVorontsov 16.11.2008, 16:06
Жестоко... Во-первых, статические стуктуры зануляются обычным struct_name var_name = {0}. Во-вторых, когда какая-то WinAPI функция не отрабатывает, как правило, смотрят GetLastError().

Автор: dumb 16.11.2008, 17:02
Цитата(SvetRus @  15.11.2008,  23:52 Найти цитируемый пост)
    //сдвиг чтения
    DWORD *offset = 0;
нет такого адреса.

Код

    DWORD offset = 0x1000000; // image base of calc.exe
    //читаем
    while(!ReadProcessMemory(pi.hProcess, reinterpret_cast<LPCVOID>(offset), lpBuffer, 1, &dwRead));


Автор: SvetRus 17.11.2008, 18:24
Спасибо, пойду изучать структуру экзешников  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)