Перейти к содержанию

с++ VS 2012 dll функция VirtualQuery


Рекомендуемые сообщения

как правильно использовать эту функцию и для чего она вообще(msdn читал-не понял до конца)?

 MEMORY_BASIC_INFORMATION mbi;
VirtualQuery( ( void* )pvAddress, &mbi, sizeof( mbi ) );

я пытаюсь применить эту функцию к(совместно) AOB scan :

DWORD FindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{
for(DWORD i=0; i<dwLen; i++)
if (bCompare((BYTE*)(dwAddress+i),bMask,szMask))
return (DWORD)(dwAddress+i);
return 0;
}

потому что когда я начинаю сканировать массив в промежутке памяти допустим

FindPattern(0х15000000 , 0х3000000 , блаблабла.......)

Кроме краша нечего не происходит.

А когда я указываю определенный модуль и его длину , то все нормально находит. Хотя если сканер не найдет указанный массив в пределах модуля и выйдет за приделы модуля - тоже краш.

Такой сканер отлично подходит для поиска статических адресов и поиска внутри модуля , а вот как быть с динамикой? она может быть где угодно при перезапуске игры - за пределами модуля , посредине модуля , в начале,в конце и т.д. Как найти решение , может я не правильно применяю функцию FindPattern???Если правильно , то как на счет "VirtualQuery" , как правильно её применить?

Ссылка на комментарий
Поделиться на другие сайты

В твоем посте я не вижу примера твоего совместного применения VirtualQuery с функцией FindPattern. Вот когда приведешь своего применения - тогда я постараюсь помочь, и указать на возможные ошибки. А пока я лишь вижу, что ты процитировал вызов функции VirtualQuery из мсдн, и функцию FindPattern из урока Кодера.

Ссылка на комментарий
Поделиться на другие сайты

В твоем посте я не вижу примера твоего совместного применения VirtualQuery с функцией FindPattern. Вот когда приведешь своего применения - тогда я постараюсь помочь, и указать на возможные ошибки. А пока я лишь вижу, что ты процитировал вызов функции VirtualQuery из мсдн, и функцию FindPattern из урока Кодера.

я не знаю как её применить с FindPattern совместно - если ты на счет исходного кода , да я прошу помочь с исходным кодом , я не пойму как его сделать , на практике лучше всего обучаться.

На счет

VirtualQuery( ( void* )pvAddress, &mbi, sizeof( mbi ) );

я тут понимаю только переменную pvAddress, для чего mbi я не помойму.

Если объяснить на примере кода - это выше твоих принципов - я не знаю тогда, объясни в л\с или скайп.

Ссылка на комментарий
Поделиться на другие сайты

я не знаю как её применить с FindPattern совместно - если ты на счет исходного кода , да я прошу помочь с исходным кодом , я не пойму как его сделать , на практике лучше всего обучаться.

На счет

VirtualQuery( ( void* )pvAddress, &mbi, sizeof( mbi ) );

я тут понимаю только переменную pvAddress, для чего mbi я не помойму.

Если объяснить на примере кода - это выше твоих принципов - я не знаю тогда, объясни в л\с или скайп.

нашел вот это:

MEMORY_BASIC_INFORMATION mbi = {0};
unsigned char *pAddress = NULL,
*pEndRegion = NULL;

DWORD dwFindData = 0xBAADF00D,
dwProtectionMask = PAGE_READONLY | PAGE_EXECUTE_WRITECOPY
| PAGE_READWRITE | PAGE_WRITECOMBINE;

while( sizeof(mbi) == VirtualQuery(pEndRegion, &mbi, sizeof(mbi)) ){
pAddress = pEndRegion;
pEndRegion += mbi.RegionSize;
if ((mbi.AllocationProtect & dwProtectionMask) && (mbi.State & MEM_COMMIT)){
for (pAddress; pAddress < pEndRegion ; pAddress++){
if (*pAddress == dwFindData){

}
}
}
}

Ссылка на комментарий
Поделиться на другие сайты

Дело не в моих принципах. Просто, если я приведу тебе готовый код, ты его скопипастишь, и будешь использовать до тех пор, пока не возникнет какая-либо нестандартная ситуация, в которой у тебя снова возникнут проблемы. В этом случае ты снова будешь обращаться за помощью. А если же ты разберешься, какой функционал выполняет эта функция (тавтология, знаю), то уже в любой ситуации ты сможешь изменить свой код так, чтобы все работало. Даю наводку - VirtualQuery опрашивает регионы памяти, начиная с указанного ей адреса. В приведенном тобой коде, который ты где-то нашел, как раз в цикле перебираются все регионы памяти, пока не будет найден нужный. Тебе же этот код нужно изменить так, чтобы в каждой итерации цикла вызывалась функция FindPattern, в которую будут передаваться данные, полученные вызовом VirtualQuery. Если присмотришься к структуре MEMORY_BASIC_INFORMATION (а, точнее, почитаешь о ней на MSDN), увидишь, что в нее сохраняются некоторые данные. Что это за данные - легко понять по названиям членов структуры. Так вот, для FindPattern в каждой итерации вышеприведенного цикла тебе всего лишь нужно передавать определенные данные из указанной структуры. Ну и, разумеется, предусмотреть выход из цикла, если сигнатура найдена.

Ссылка на комментарий
Поделиться на другие сайты

Дело не в моих принципах. Просто, если я приведу тебе готовый код, ты его скопипастишь, и будешь использовать до тех пор, пока не возникнет какая-либо нестандартная ситуация, в которой у тебя снова возникнут проблемы. В этом случае ты снова будешь обращаться за помощью. А если же ты разберешься, какой функционал выполняет эта функция (тавтология, знаю), то уже в любой ситуации ты сможешь изменить свой код так, чтобы все работало. Даю наводку - VirtualQuery опрашивает регионы памяти, начиная с указанного ей адреса. В приведенном тобой коде, который ты где-то нашел, как раз в цикле перебираются все регионы памяти, пока не будет найден нужный. Тебе же этот код нужно изменить так, чтобы в каждой итерации цикла вызывалась функция FindPattern, в которую будут передаваться данные, полученные вызовом VirtualQuery. Если присмотришься к структуре MEMORY_BASIC_INFORMATION (а, точнее, почитаешь о ней на MSDN), увидишь, что в нее сохраняются некоторые данные. Что это за данные - легко понять по названиям членов структуры. Так вот, для FindPattern в каждой итерации вышеприведенного цикла тебе всего лишь нужно передавать определенные данные из указанной структуры. Ну и, разумеется, предусмотреть выход из цикла, если сигнатура найдена.

я ж и говорю давай в л\с объяснишь или в скайп на готовом коде , копипаст мне не нужен , мне нужно понять как работает , с удовольствием выслушаю тебя , мне это будет интересно и ты как раз будешь знать , что я не просто скопипастил код а еще и понял как он работает

Ссылка на комментарий
Поделиться на другие сайты

я ж и говорю давай в л\с объяснишь или в скайп на готовом коде , копипаст мне не нужен , мне нужно понять как работает , с удовольствием выслушаю тебя , мне это будет интересно и ты как раз будешь знать , что я не просто скопипастил код а еще и понял как он работает

Ты уж извини но давать свой скайп, я думаю никто не будет.

Тебе Xipho уже всё объяснил. И на MSDN описание функций очень понятное, так что нет такого варианта что ты мог не понять для чего она.

Ссылка на комментарий
Поделиться на другие сайты

Ты уж извини но давать свой скайп, я думаю никто не будет.

Тебе Xipho уже всё объяснил. И на MSDN описание функций очень понятное, так что нет такого варианта что ты мог не понять для чего она.

я просто не понимаю , что такого в скайпе объяснить.....Я не такой как вы , с++ мне трудно даётся - я не понимаю многого в с++ , поэтому и прошу помощи у Вас, объяснить какую-то функцию не можете......- она запретная какая-то ....?

Ссылка на комментарий
Поделиться на другие сайты

я просто не понимаю , что такого в скайпе объяснить.....Я не такой как вы , с++ мне трудно даётся - я не понимаю многого в с++ , поэтому и прошу помощи у Вас, объяснить какую-то функцию не можете......- она запретная какая-то ....?

Понимаешь, это тоже самое, что ко мне подойдёт человек на улице и попросит оставить ему свой номер телефона.

Но в твоём случае вопрос касается WinAPI, а не самого C++.

На MSDN дано описание функции, там всё написано чётко, коротко и ясно.

И задам тебе встречный вопрос, если не знаешь что это такое, то зачем используешь? Для каких целей?

Ссылка на комментарий
Поделиться на другие сайты

Понимаешь, это тоже самое, что ко мне подойдёт человек на улице и попросит оставить ему свой номер телефона.

Но в твоём случае вопрос касается WinAPI, а не самого C++.

На MSDN дано описание функции, там всё написано чётко, коротко и ясно.

И задам тебе встречный вопрос, если не знаешь что это такое, то зачем используешь? Для каких целей?

моя цель - поиск байт и возврат динамического адреса, FindPattern не справляется с этой задачей(только для отдельных случаев) , если есть другой способ я только за , я о нем не знаю...На счет скайпа - это ты преувеличил......если ты чего-то боишься я могу для тебя создать скайп со своего ip и дать логин и пароль тебе.

Ссылка на комментарий
Поделиться на другие сайты

Парни, давайте без споров.

VDV, тебе я в предыдущем своем посте все максимально подробно разжевал. Тебе осталось только положить в рот и проглотить. То есть, на основе сказанного мной написать код. Тем более, что цикл у тебя уже есть. Тебе же нужно совсем чуть-чуть его подправить, и вставить в нужное место вызов FindPattern, а по результатам вызова этой функции либо продолжать перебор цикла дальше, либо выйти из него с сохранением результатов. Это простая задача, и код я приводить точно не буду, ибо не вижу смысла. Ни по ЛС, ни в скайпе у меня нет времени разжевывать еще более подробно (да и куда уж там подробнее, осталось только непосредственно за тебя код написать), соответственно, делать я этого не стану.

Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.