Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сканирование памяти, Дальше VirtualQueryEx не заходит 
:(
    Опции темы
Canore
  Дата 18.7.2015, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.7.2015

Репутация: нет
Всего: нет



Есть рабочий код, но он напрочь отказывается работать в игре ArcheAge хотя скажем в CS:Source работает.
Код

struct MemoryBlock
{
    // По какому адресу находился блок в оригинале
    LPBYTE startAddressOld;
    // Указатель на скопированную память
    void *p;
    // Размер блока
    SIZE_T size;
};

void CopyVA(vector<MemoryBlock> &valList, bool first = true)
{
    LPBYTE buffer = NULL;
    vector<MemoryBlock> a;
    DWORD address = NULL;
    int flagg = 0;
 
    int counter = 0;
 
    #define NEEDED (memInf.State==MEM_COMMIT) && (memInf.Protect==PAGE_READWRITE)
 
    for (LPBYTE startAppAddress = (LPBYTE)sysInf.lpMinimumApplicationAddress; startAppAddress <= (LPBYTE)sysInf.lpMaximumApplicationAddress; startAppAddress += memInf.RegionSize)
    {
        if (VirtualQueryEx(hProc, startAppAddress, &memInf, sizeof(memInf))) // Дальше этого отказывается проходить в ArcheAge
        {
            if (NEEDED)
            {
                buffer = new BYTE[memInf.RegionSize];
                
                if (ReadProcessMemory(hProc, startAppAddress, buffer, memInf.RegionSize, NULL))
                {
                    MemoryBlock temp;
                    temp.startAddressOld = startAppAddress;
                    temp.p = VirtualAlloc ( NULL, memInf.RegionSize, MEM_COMMIT, PAGE_READWRITE );
                    temp.size = memInf.RegionSize;
                    
                    if (WriteProcessMemory(hProcHormiX1, temp.p, buffer, temp.size, NULL))
                    {
                        if (!first && flagg == 0)
                        {
                            FreeVA(valList);
                            valList.clear();
                            flagg = 1;
                        }
                        valList.push_back(temp);
                        //cout << temp.p << " " << temp.size << endl;
                    }
                    else
                    {
                        VirtualFree(temp.p, NULL, MEM_RELEASE);
                    }
                }
            }
        }
    }
}


Как решить данную проблему? Я пытался уже запускать свою программу от имени админа.
PM MAIL   Вверх
Canore
Дата 18.7.2015, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.7.2015

Репутация: нет
Всего: нет



Никто не знает ?!
PM MAIL   Вверх
feodorv
Дата 18.7.2015, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Код, использующий WriteProcessMemory() лично у меня вызывает большие подозрения. 

Я понимаю, что код урезан для публикации в этом форуме, но этот никак не способствует его пониманию. Почему VirtualAlloc делается в своём процессе, а по выделенному адресу происходит запись уже в какой-то иной процесс? Почему не высвобождается buffer? 

Я так понимаю, что VirtualQueryEx вернул ноль? В описании функции на сайте Microsoft сказано, что в этом случае можно вызвать GetLastError(), Вы вызывали?

В моём древнем описании этой функции упоминания о GetLastError() нет, но сказано так:
Цитата
Passing a kernel-mode pointer to this function can result in no information being returned, due to security issues. In this case, the return value is zero. 



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Canore
  Дата 18.7.2015, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.7.2015

Репутация: нет
Всего: нет



feodorv, hProcHormiX1 - это handle моего окна, hProc - handle ArcheAge, ну и собственно здесь происходит по блочное чтение из ArcheAge в мой процесс предварительно выделяя память. Но до VirtualAlloc даже не доходит.

Добавлено через 9 минут и 58 секунд
При каждом проходе цикла:

VirtualQueryEx(...) = 0
GetLastError() = 5 (Ошибка доступа)

Как решить ? Собственно в моём коде нет ничего особенного, но раз ошибка доступа то думаю вам пригодится функция с помощью которой я получаю handle.
Код

// Поиск нужного нам процесса
// flag true - поиск по титулу
// flag false - имя исполняемого файла (name.exe)
// HWND hWndHormiX1 - если я ищу свой handle ( просто лень было это убирать )
HANDLE Attach(char* lpWindowName, bool flag = true, HWND hWndHormiX1 = NULL)
{
 
    if (flag)
    {
        HWND hWnd;
        if (hWndHormiX1 != NULL)
            hWnd = hWndHormiX1;
        else
            hWnd= FindWindow(NULL, lpWindowName);
    if (hWnd != 0)
    {
        DWORD pId;
        GetWindowThreadProcessId(hWnd, &pId);
        if (pId != NULL)
        {
            HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);
            if (hProc)
            {
                return hProc;
            }
        }
    }
    } else
    {
        PROCESSENTRY32 entry;
        entry.dwSize = sizeof(PROCESSENTRY32);
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
        if (Process32First(snapshot, &entry) == TRUE)
        {
            while (Process32Next(snapshot, &entry) == TRUE)
            {
                if (stricmp(entry.szExeFile, lpWindowName) == 0)
                {  
                    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
                    
                    CloseHandle(snapshot);
 
                    if (hProcess)
                        return hProcess;
                }
            }
        }
    }
 
    return NULL;
}


Добавлено через 12 минут и 55 секунд
Цитата

Почему не высвобождается buffer? 

Потому что я слоупок ^_^
PM MAIL   Вверх
feodorv
Дата 18.7.2015, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(Canore @  18.7.2015,  21:03 Найти цитируемый пост)
Как решить ?

Не знаю. Причина возникновения ERROR_ACCESS_DENIED может быть затейливой. Например, исследуемый процесс является 64-битным (вроде, это не Ваш случай). Или исследуемый процесс может выполняться с более высоким уровнем привилегий.


Более того, запрос VirtualQueryEx() может выдавать ERROR_ACCESS_DENIED не на все страницы исследуемого процесса. А у вас в коде есть неоднозначность:
Цитата(Canore @  18.7.2015,  13:47 Найти цитируемый пост)
    for (LPBYTE startAppAddress = (LPBYTE)sysInf.lpMinimumApplicationAddress; startAppAddress <= (LPBYTE)sysInf.lpMaximumApplicationAddress; startAppAddress += memInf.RegionSize)
    {
        if (VirtualQueryEx(hProc, startAppAddress, &memInf, sizeof(memInf))) // Дальше этого отказывается проходить в ArcheAge

Если VirtualQueryEx вернёт 0, то какое значение будет у memInf.RegionSize, на величину которого должна увеличиваться переменная цикла? Неизвестно. Делайте хотя бы
Код

if( VirtualQueryEx() )
   ...
else
   memInf.RegionSize = sysInf.dwPageSize;



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Canore
  Дата 19.7.2015, 04:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.7.2015

Репутация: нет
Всего: нет



feodorv, хорошо сейчас попытаюсь. Я вроде проверял процесс не использует не каких драйверов и других скрытых процессов и ещё одно очень странное наблюдение процесс подключает один модуль и после него уже становится не возможным воздействие на процесс, то есть до определённого момента при загрузке я могу делать с процессом что угодно. После загрузки(тогда когда подргузился уже этот модуль) я пытался что-то сделать с процессом с помощью программы AnVir Task Manager, но мне пишет что в доступе отказано. Как выдать себе максимальные привилегии драйвер писать? Или можно более простыми путями обойтись?
PM MAIL   Вверх
Canore
Дата 19.7.2015, 04:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.7.2015

Репутация: нет
Всего: нет



Процесс вроде x32 user posted image

Добавлено через 11 минут и 58 секунд
При добавлении счётчиков и исправленном коде результат таков:
user posted image
Попытка считалась успешной если зашло дальше VirtualQueryEx(), как видите похоже тут все регионы имеют максимальные привилегии.
PM MAIL   Вверх
Canore
Дата 19.7.2015, 07:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.7.2015

Репутация: нет
Всего: нет



Цитата

 Я вроде проверял процесс не использует не каких драйверов

Проверял программой AnVir Task Manager и не могу ручаться что она находит все загруженные драйвера, а не только те что прописаны в рестре или где там ещё.
PM MAIL   Вверх
Canore
Дата 19.7.2015, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.7.2015

Репутация: нет
Всего: нет



Где-то на просторах интернета наткнулся:
Цитата

Причины ERROR_ACCESS_DENIED:
    STATUS_THREAD_IS_TERMINATING
    STATUS_PROCESS_IS_TERMINATING
    STATUS_INVALID_LOCK_SEQUENCE
    STATUS_INVALID_VIEW_SIZE
    STATUS_ALREADY_COMMITTED
    STATUS_ACCESS_DENIED
    STATUS_FILE_IS_A_DIRECTORY
    STATUS_CANNOT_DELETE
    STATUS_INVALID_COMPUTER_NAME
    STATUS_FILE_DELETED
    STATUS_FILE_RENAMED
    STATUS_DELETE_PENDING
    STATUS_PORT_CONNECTION_REFUSED
    STATUS_ENCRYPTION_FAILED
    STATUS_ENCRYPTION_FAILED
    STATUS_DECRYPTION_FAILED
    STATUS_NO_RECOVERY_POLICY
    STATUS_NO_EFS
    STATUS_WRONG_EFS
    STATUS_NO_USER_KEYS

Можно ли как-то отследить какая именно из этого списка ? Хотя вангану это STATUS_ACCESS_DENIED процентов так на 99.9%

Это сообщение отредактировал(а) Canore - 19.7.2015, 18:40
PM MAIL   Вверх
feodorv
Дата 19.7.2015, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Попробуйте Process Explorer. Дважды щёлкните мышкой на исследуемом процессе, в открывшемся окне перейдите на вкладку "Security", посмотрите привилегии процесса. Наверняка SeDebugPrivilege поднята.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Canore
Дата 20.7.2015, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.7.2015

Репутация: нет
Всего: нет



user posted image

Собственно показал всё что на той страницу. И да пытался заморозить процесс этой программой ошибка доступа снова smile 

Мне уже начинает казаться что они наняли шаманов с бубнами и наложили чары на этот процесс.

Добавлено через 9 минут и 44 секунды
Провёл сравнение с той же CS:Source различия в двух привилегиях: SeRestorePrivilege, SeManageVolumePrivilege.
PM MAIL   Вверх
DarthTon
Дата 20.7.2015, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: 5
Всего: 6



У ArcheAge есть античит EasyAntiCheat, драйвер которого при помощи ObCallback убирает у всех открываемых хендлов на процесс права доступа к памяти.
PM MAIL   Вверх
Canore
Дата 20.7.2015, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.7.2015

Репутация: нет
Всего: нет



DarthTon, можно обойти ? Хочу написать такую читалку памяти которую нельзя залочить.
PM MAIL   Вверх
DarthTon
Дата 20.7.2015, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: 5
Всего: 6



Более-менее нормальный вариант: 
- Написать свой драйвер который будет вручную обходить VAD-дерево и возвращать инфу юзермодному клиенту. Только придется залочить память процесса на время работы.

Нестабильные решения:
- Изменить права доступа у хендла, добавив нужные
- Найти место где хранится хендл ObCallback в драйвере и снять его
PM MAIL   Вверх
Canore
Дата 20.7.2015, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 18.7.2015

Репутация: нет
Всего: нет



DarthTon, 
Цитата

Изменить права доступа у хендла, добавив нужные

Меня устраивает вполне этот вариант так как не придётся лочить память. Как осуществить? Ссылки на msdn если можно или код пожалуйста.

Это сообщение отредактировал(а) Canore - 20.7.2015, 14:26
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.