Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

C++ Как прочитать память из dll

-

Общение разработчиков

- Программирование для Perfect World, общение и обсуждене разработок

Ответ
 
Опции темы
Старый 29.02.2012, 00:59   #1
 Старший сержант
Аватар для sumikot
 
sumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауру
Регистрация: 21.09.2009
Сообщений: 189
Популярность: 578
Сказал(а) спасибо: 27
Поблагодарили 144 раз(а) в 36 сообщениях
 
По умолчанию C++ Как прочитать память из dll

Давно еще попытался написать сканер памяти на Autoit для нахождения оффсетов и забросил это дело, так как прийдется ждать месяц ))) или два, пока с его скоростью он переберет все нужные адреса...
Сейчас пытаюсь все прочитать из внедренной dl, но столкнулся с одной неприятной ситуацией - если читать из некоторых областей (не выяснил точно, каких, Mapped или Private), elementclient вылетает с сообщением "Обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства." Как определить тип памяти до его чтения из своего процесса? Из чужого нашел, не то.
Может быть, сам метод чтения есть другой? Читаю так:
Point = *(DWORD*)(Address);

ps Хорошо раскрученный ресурс)) утром опять гуглил на эту тему - мой вопрос в гугле уже есть на первой странице.
Жаль, что ответа нет...

Последний раз редактировалось sumikot; 29.02.2012 в 13:42.
  Ответить с цитированием
Старый 29.02.2012, 14:54   #2
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

sumikot, вроде бы ты правильно написал.
DWORD dwPtr = *(DWORD*)(Address);

Ошибка может возникать в случае, если Adress равен NULL.
Мне никогда не встречались случаи защиты от чтения памяти, но вроде возможно защитить память от простого чтения. Если память защищена, то так же следует применить к нужному адресу (из которого хочешь читать) функцию VirtualProtect.

Есть ещё способ прочитать данные из памяти (он неплохо помогает читать целые структуры, строки и прочие типы данных, размер которых отличается от 1, 2 и 4 байтов) - функция memcpy. В ней нужно указать адрес приемника, источника и количество байтов для копирования. Опять же, может потребоваться применить VirtualProtect.

Есть третий способ (скорее всего он вообще эквивалентен первому) - вставка ассемблерного кода.
Примерно так:
Код:
DWORD dwResult;
__asm  {
   mov eax, dword ptr [Address]
   mov dwResult, eax
}
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Пользователь сказал cпасибо:
sumikot (29.02.2012)
Старый 29.02.2012, 18:51   #3
 Старший сержант
Аватар для sumikot
 
sumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауру
Регистрация: 21.09.2009
Сообщений: 189
Популярность: 578
Сказал(а) спасибо: 27
Поблагодарили 144 раз(а) в 36 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

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

Хорошо бы еще узнать, как определить тип памяти - с защитой чтения, с защитой записи.
Кстати, никто не менял область памяти исполняемого файла из своего процесса? Не поделитесь куском кода?

Ага, нашел.
В принципе, void *memcpy(void *dst, const void *src, size_t n);
равна
for( i = 0; i < n; i++ )
((unsigned char*)dst)[i] = ((unsigned char*)src)[i];
return dst;
так что ошибка все равно будет...

Последний раз редактировалось sumikot; 29.02.2012 в 19:04.
  Ответить с цитированием
Старый 29.02.2012, 21:13   #4
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

Цитата:
Сообщение от sumikotПосмотреть сообщение
никто не менял область памяти исполняемого файла из своего процесса?

Из своего процесса работать с адресным пространством другого процесса?
Если ты внедряешь DLL, то она имеет полный доступ к памяти интересующего процесса (а точнее DLL выполняет свой код в его памяти).
Если нет, то тут нужны функции OpenProcess (для открытия хендла процесса для работы с его памятью), VirtualProtectEx (для патчинга кода), WriteProcessMemory (для записи в память), ReadProcessMemory (для чтения из памяти).
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Старый 29.02.2012, 21:54   #5
 Старший сержант
Аватар для sumikot
 
sumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауру
Регистрация: 21.09.2009
Сообщений: 189
Популярность: 578
Сказал(а) спасибо: 27
Поблагодарили 144 раз(а) в 36 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

BritishColonist, если бы мне нужен был чужой процесс - было бы намного проще - но и все намного медленнее. Поэтому внедряю длл. Из длл читаю память СВОЕГО процесса. Не ко всем областям имею доступ.

Вопрос: Как узнать (из СВОЕГО процесса для памяти СВОЕГО процесса) имеет ли ячейка памяти запрет на чтение/запись.

Нужен пример: Как изменить ячейки запущенного исполняемого файла (elementclient.exe), как вариант - зумхак, джампхак и т п (из СВОЕГО процесса для памяти СВОЕГО процесса). Реальные адреса можно не прописывать. Пример нужен в основном из за синтаксиса. Так как нуп.

Добавлено через 3 минуты
Цитата:
Сообщение от BritishColonistПосмотреть сообщение
Если ты внедряешь DLL, то она имеет полный доступ к памяти интересующего процесса

Полного доступа не имеет. Не знаю, возможно ли это. Хотя, если взять в пример антивирусы, то возможно. Буду благодарен за любую подсказку. Гугл от меня уже устал...

ЗЫ Совсем никто не пишет на С?

Установить атрибуты на блок памяти:
VirtualProtect(dwPointer, sizeof(DWORD), PAGE_READONLY, &old)
А как эти атрибуты просто узнать, не изменяя?

Последний раз редактировалось sumikot; 29.02.2012 в 22:43. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 29.02.2012, 22:47   #6
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

Цитата:
Сообщение от sumikotПосмотреть сообщение
ЗЫ Совсем никто не пишет на С?

Я пишу. А кроме меня мало кто.

Цитата:
Сообщение от sumikotПосмотреть сообщение
узнать (из СВОЕГО процесса для памяти СВОЕГО процесса) имеет ли ячейка памяти запрет на чтение/запись

Тут всё просто. Если ты хочешь модифицировать код (Code Segment, CS), то этот "запрет" установлен. С константами вроде такая же ситуация. Если меняешь переменные (Data Segment, DS), то туда можно писать что угодно.

Цитата:
Сообщение от sumikotПосмотреть сообщение
Полного доступа не имеет

Этого не может быть. Внедрённая библиотека может работать наряду с самим приложением в качестве его составляющей, можно говорить об этаком равноправии между exe и dll.

Я рад, что не один я использую технику DLL. В моей подписи есть целых три полезных ссылки на статьи, преимущественно сопровождающихся кодом на C++.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Пользователь сказал cпасибо:
sumikot (29.02.2012)
Старый 29.02.2012, 23:37   #7
 Старший сержант
Аватар для sumikot
 
sumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауру
Регистрация: 21.09.2009
Сообщений: 189
Популярность: 578
Сказал(а) спасибо: 27
Поблагодарили 144 раз(а) в 36 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

BritishColonist, еще раз спасибо, вопрос о примере модификации кода отпадает.
Ты используешь GetAsyncKeyState для опроса клавиатуры. Тоже пытался ей воспользоваться - опрос получается асинхронный, то воспримет нажатия, то нет. То два раза сразу. Как с этим бороться?
Тоже рад, что не одинок в выборе языка и варианта конечного продукта ))
Статьи читаются легко, тем более что тема родная - PW, многое становится понятно.
Просто раньше писал на Autoit, статьи видел (сейчас вспомнил), но надобности в них не было...
ЗЫ Картинка из японского аниме: Сумикот в поклоне - ооо, учитель
  Ответить с цитированием
Старый 01.03.2012, 07:41   #8
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

sumikot, надо вызывать не просто GetAsyncKeyState, а ещё получать старший бит результата.

Код:
bool KeyPressed(BYTE key) // проверка на нажатость клавиши
{
	return ((GetAsyncKeyState(key)&(1<<16))!=0);
}
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Старый 01.03.2012, 10:13   #9
 Старший сержант
Аватар для sumikot
 
sumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауру
Регистрация: 21.09.2009
Сообщений: 189
Популярность: 578
Сказал(а) спасибо: 27
Поблагодарили 144 раз(а) в 36 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

Цитата:
Сообщение от BritishColonistПосмотреть сообщение
надо вызывать не просто GetAsyncKeyState, а ещё получать старший бит результата.

Старший бит установлен - клавиша нажата во время выполнения функции.
Поэтому использую проверку по младшему биту. Так как нажать клавишу можно и в другое время, когда будет исполняться другой кусок кода.
Код:
GetAsyncKeyState(key)&1
Или я неправильно понял ее функционал?
  Ответить с цитированием
Старый 01.03.2012, 13:55   #10
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

Насчёт этого не знаю, но для себя я уяснил, что в момент, пока клавиша зажата, старший бит результата функции будет равен 1.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Старый 02.03.2012, 01:39   #11
 Старший сержант
Аватар для sumikot
 
sumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауру
Регистрация: 21.09.2009
Сообщений: 189
Популярность: 578
Сказал(а) спасибо: 27
Поблагодарили 144 раз(а) в 36 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

BritishColonist, кстати, справился с определением
высоты по двум координатам? Когда то тоже была мысль "облетать" ландшафт, но, естественно, высоты поверхности я так и не нашел.
Высоту можно получить, инжектом устанавливая курсор на определенные координаты и считывая высоту курсора. Если не нужно при этом двигаться персом, его можно поставить на ручник в Action. Как в момент копки ресов - задаешь следующую точку, а перс пока не докопает, никуда не побежит.

Что то я тему вообще в сторону увел... Так, форум курил, пока моск (если он у меня есть, а то в наличии данной части организма я последнее время сомневаюсь) отдыхал.

Прекрасно описываешь вопросы. Многа букафф. Получил наслаждение при прочтении. А вот попадаются - Как ПК делать? - я долго думал, что ответить. Где то гайд был - Как ногибать, хотел даже ссылку кинуть. К сожалению, гайд удалили... А отвечать - бей(10 букав) - не в моем стиле.
  Ответить с цитированием
Старый 05.03.2012, 14:05   #12
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

sumikot, на самом деле для моей задачи было достаточно указать высоту, равную 0, чтобы персонаж с таким же успехом побежал по координатам. Это был простой инжект перемещения (но не автопуть). А точнее я хотел бы сделать бег инжектом, но вышло банальной записью значений в ActionStruct игрока.
Так что получать высоту даже не пришлось.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Старый 06.03.2012, 11:15   #13
 Старший сержант
Аватар для sumikot
 
sumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауру
Регистрация: 21.09.2009
Сообщений: 189
Популярность: 578
Сказал(а) спасибо: 27
Поблагодарили 144 раз(а) в 36 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

BritishColonist, все еще страшнее, чем кажется.
Как указывал в первом посте, пытался читать память:
Код:
Data = *(DWORD*)(Adr);
Нашел, как проверять тип доступа:
Код:
for (DWORD i = 0; i < 0x1FFFC000; ++i)
{
Ram = MemoryRead(0x410000,i);
}

DWORD MemoryRead(DWORD Adr, DWORD Ofs)
{
DWORD Data;
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery( *(LPVOID*)(Adr+(Ofs*4)), &mbi, sizeof( mbi ) );
if ((mbi.AllocationProtect & 0x000001EE) != 0) Data = *(DWORD*)(Adr+(Ofs*4));
return Data;
}
То есть, прежде, чем считать ячейку, проверяю разрешение на чтение. Флаги сейчас стоят, наверно, неправильно, не обращай внимания. Но есть одно "Но" - если состояние памяти MEM_FREE, вылетает на строке VirtualQuery. Как еще проверить, можно ли прочесть данные по адресу?

Как понимаю я, прийдется создавать массив и делать карту памяти процесса, причем с внешней программой. Потому как тогда ничего не вылетает. Потом как то передавать этот массив в длл и при чтении сверяться.

ЗЫ При перемещении по земле при помощи инжекта координату высоты перса можно не указывать. Даже когда указываешь, она не воспринимается. С помощью Action игрока тоже делал перемещение )) не понравилось. Самый простой вариант - ткнуть мышью рядом с игроком и заменить в Action координаты "тыка". Сейчас хожу с инжектом.
ЗЫЗЫ Кстати, в Legend of Martial Arts китайцы все таки реализовали автопуть по земле с обходом препятствий. Даже подобие бота в игре сделали. Покупаешь итем в шопе, и "духи" руководят персом при выполнении квеста. Пишу про LOMA, потому что она тоже на elementclient, даже структуры такие же как у PW. Только смысла в ней меньше...

Последний раз редактировалось sumikot; 06.03.2012 в 11:42.
  Ответить с цитированием
Старый 06.03.2012, 12:17   #14
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

sumikot, я до сих пор не понял, в чём проблема.
Ты ведь работаешь с Perfect World? Всё, что нужно знать: на патчинг кода требуется VirtualProtect, в остальных случаях можно обойтись без него.
Приведи проблемный код или хотя бы свой план действий.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Старый 06.03.2012, 13:36   #15
 Старший сержант
Аватар для sumikot
 
sumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауруsumikot излучает ауру
Регистрация: 21.09.2009
Сообщений: 189
Популярность: 578
Сказал(а) спасибо: 27
Поблагодарили 144 раз(а) в 36 сообщениях
 
По умолчанию Re: C++ Как прочитать память из dll

BritishColonist, мне просто нужно знать, смогу ли я прочитать данные из ячейки памяти по адресу N без вылета. Все. Упрощенный код выше.
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Руоф] Код для инжекта в память. Dinmaite Разработка ПО для Perfect World 323 25.02.2020 02:24
Дельфин и память Genzal Общение и обсуждение, архив Point Blank 3 30.12.2011 14:23
[Программа] Память о базе Chipito Базы серверов и брут 2 30.08.2010 17:23
Оперативная память для ПВ. NikelR Общение и обсуждение Perfect World 4 25.05.2010 22:30

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 19:08.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net