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

Возврат значения в виде адресов \ с++ VS 2012


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

вот тебе вопрос:

Например ,если я сканирую массив байт в пределе игрового модуля , допустим модуль "crysis.exe" начало 0х100000 конец 0х200000 (размер 100000 получается), то я нахожу нужный мне адрес по массиву байт ,все отлично работает. НО !!! если мне нужно просканировать к примеру район от 0х3000000 до 0х4000000(так как в этом районе памяти находится динамический адрес , который мне нужен,при каждом перезаходе в игру адрес меняется ,но остаётся в этом участке памяти) и этот район памяти не является не одим модулем игры (выделенный участок динамической памяти). Проблема вот в чем - в данном участке памяти от 0х3000000 до 0х4000000 нужный мне адрес может находиться как по адресу ,к примеру, 0х3155FF00 ,а после перезахода в игру, по адресу 0х4000000 - думаю это понятно что ДМА. Но каждый раз в этом диапазоне памяти при перезаходе в игру есть места памяти которые недоступны для чтения\записи , мало того этот участок памяти может быть к примеру от 0х3000000 до 0х3200000 , а адрес который мне нужен 0х3500000 , при перезаходе в игру участок не читаемой\записываемой памяти будет от 0х3400000 до 0х3600000 а адрес нужный мне 0х3100000. Поэтому когда FindPattern сканирует заданный диапазон памяти (от 0х3000000 до 0х4000000 к примеру) и натыкается на участок не читаемой\записываемой памяти - происходит краш игры,как это избежать. Объяснить очень тяжело было , но я попытался. Смысл в том , что когда Find Pattern натыкается на недоступную для чтения\записи память - краш.

(все в dll, не винапи)

DWORD pattern_address2 = FindPattern (0x16000000,0x18000000 ,
(PBYTE)"\x72\x65\x63\x6F\x69\x5F" , "xxxxxx");

Начнём с того, у dll есть доступ к любой памяти, принадлежащей приложению.

А закончим тем, что второй параметр FindPattern это length (длина), и у тебя она не 0x18000000, а (0x18000000 - 0x16000000).

А крашится потому что ты уходишь за пределы памяти выделенной под приложение. Access Violation: 0xC0000005.

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

Начнём с того, у dll есть доступ к любой памяти, принадлежащей приложению.

А закончим тем, что второй параметр FindPattern это length (длина), и у тебя она не 0x18000000, а (0x18000000 - 0x16000000).

А крашится потому что ты уходишь за пределы памяти выделенной под приложение. Access Violation: 0xC0000005.

это я знаю что длина - это просто пример я показал. Все правильно ухожу за пределы , но если я в функции указываю

DWORD pattern_address2 = FindPattern (модуль,его длину ,
(PBYTE)"\x72\x65\x63\x6F\x69\x5F" , "xxxxxx");

то адрес не находится , потому что я сканирую длину модуля (к примеру от 0х1000 до 0х2000) , а адрес находится, к примеру,от 0х3000 до 0х3100

и не принадлежит не к какому модулю, как быть? Если я укажу в FindPattern (0х3000,0х100 ,)(к примеру) то FindPattern начнет сканировать этот участок

памяти и где-нибудь в диапазоне от 0х3050 до0х3080 будет "память за пределами" , а адрес который мне нужен будет 0х3090 и когда сканер дойдет до

0х3050 будет краш , как правильно сделать?

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

Если тебе нужно сканировать область выделенной памяти, а не принадлежащей модулю, надо расширять сканер, используя VirtualQuery (если из dll) или VirtualQueryEx (если из внешнего приложения).

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

Если тебе нужно сканировать область выделенной памяти, а не принадлежащей модулю, надо расширять сканер, используя VirtualQuery (если из dll) или VirtualQueryEx (если из внешнего приложения).

Получается что для игры каждый раз выделяется некоторая область памяти (по разному при каждом перезаходе), значит мне нужно сканировать область выделенной памяти - я правильно мыслю?

мне нужна вот эта штука(для dll)?

HRESULT VirtualQuery (
[in] void* lpAddress,
[out] void* lpBuffer,
[in] SIZE_T dwLength,
[out] SIZE_T* pResult
);

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

Да. Видишь, когда тебе не подносишь на блюдечке код, а лишь подсказываешь, в каком направлении примерно нужно двигаться, у тебя начинает получаться, потому что ты читаешь, и начинаешь осознавать, что именно ты делаешь.

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

Да. Видишь, когда тебе не подносишь на блюдечке код, а лишь подсказываешь, в каком направлении примерно нужно двигаться, у тебя начинает получаться, потому что ты читаешь, и начинаешь осознавать, что именно ты делаешь.

нужно сделать саму функцию сначала , а затем с помощью неё искать , я правильно рассуждаю , она будет аналогична FindPattern , да что там идентична?

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

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

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

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