Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ReadProcessMemory, чтение целых регионов памяти процесса 
V
    Опции темы
Jr13san
Дата 9.9.2011, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

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



bems, ок, спасибо за подсказки, попробую разобраться.
PM MAIL WWW ICQ   Вверх
volatile
Дата 9.9.2011, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(Jr13san @  9.9.2011,  12:47 Найти цитируемый пост)
на этом хабре пример какой-то кривой, в нём много ошибок + не работает.

Поиск подстроки там вроде бы адекватный.
Ну, хорошо, вот встроил прямо в ваш код простенький поиск последовательности байт, думаю разберетесь.
Код

   const char * signature = "Microsoft";      // Последовательность которую будем искать
   size_t len_signature = strlen (signature); // Длина последовательности.
   ...
   if(!ReadProcessMemory(hProc, (void *)Start, &lpData, mbi.RegionSize, &lpRead))
   {
      cout << "Поиск в регионе размером " << mbi.RegionSize << " байт\n";//поиск строки в массиве

      BYTE * p = lpData;
      while((p = (BYTE*)memchr(p, signature [0], mbi.RegionSize - len_signature + 1 - (p - lpData))) != 0)
      {
         if ( 0 == memcmp(p+1, signature+1, len_signature-1))
         {
            // найдено!!! в (p) адрес нашего буфера, где обнаружена последовательность.
            // соответственно адрес в приложении равен: Start + (p - lpData);
         }
         ++ p;
      }

Сначала ищем первый символ, если нашли то сраниваем оставшиеся байты.

PM MAIL   Вверх
Jr13san
Дата 10.9.2011, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

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



volatile, странно, но код почему-то не работает. Хотя я тут написал свой, но он выглядит "древне" как-то, зато работает.
Попробую разобраться в чём тут неполадка, хотя я мало чего понимаю в этих преобразованиях и ссылках.
Я даже не понял что значит "++p;". Тут либо увеличение байта на 1, либо что-то другое.

Я вот тут подумал. Кажется не работает из за этой проверки:
Код

if(!ReadProcessMemory(hProc, (void *)Start, &lpData, mbi.RegionSize, &lpRead))

Лично эта проверка не давала работать программе и ничего не находилось.

Это сообщение отредактировал(а) Jr13san - 10.9.2011, 08:17
PM MAIL WWW ICQ   Вверх
volatile
Дата 10.9.2011, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(Jr13san @  10.9.2011,  08:07 Найти цитируемый пост)
if(!ReadProcessMemory(hProc, (void *)Start, &lpData, mbi.RegionSize, &lpRead))

конечно, там "!" надо убрать.
Цитата

ReadProcessMemory
If the function succeeds, the return value is nonzero.

я просто это у вас переписал, не глядя, надо так:

Цитата(Jr13san @  10.9.2011,  08:07 Найти цитируемый пост)
if(ReadProcessMemory(hProc, (void *)Start, &lpData, mbi.RegionSize, &lpRead))


PM MAIL   Вверх
Jr13san
Дата 10.9.2011, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

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



В общем попробовал сделать первый тест на обмен данных:
http://www.youtube.com/watch?v=55mzCb0q09Y

Там отлавливаются нажатия клавиш(на обычной клавиатуре цифры от 4 до 9).
Вот, и выводится информация уже через Готическую функцию Print("Текст");
Где "Текст" - это значение по адресу в памяти Готики 2.

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

Код

BYTE * p = lpData;//объявляем переменную p как массив байт lpData, с такой же размерностью?
//Или просто делаем ссылку на массив lpData через переменную p?
++ p;//тоже самое, что и p++? Т.е. увеличение p на 1?

В остальном сам разберусь, я надеюсь.
PM MAIL WWW ICQ   Вверх
volatile
Дата 10.9.2011, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(Jr13san @  10.9.2011,  12:08 Найти цитируемый пост)
BYTE * p = lpData;//объявляем переменную p как массив байт lpData, с такой же размерностью?

Просто вводим указатель, на тот же массив.
lpData - будет всегда указывать на начало массива, а p будет пробегать этот-же массив.
например часто используемое в функции выражение:
(p - lpData) -  это расстояние от начала массива, до текущей позиции
         
Цитата(Jr13san @  10.9.2011,  12:08 Найти цитируемый пост)

++ p;//тоже самое, что и p++? Т.е. увеличение p на 1?

да.


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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

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



Решил опять разбираться в математических действиях и никак не пойму что происходит в памяти...
То, что выделено жирным шрифтом я просто не понимаю как рассчитывается.

весь код выше, я возьму лишь самую главную строчку:
p = (BYTE*)memchr(p, signature [0], mbi.RegionSize - len_signature + 1 - (p - lpData)

Как это математически рассчитывается я так и не понял. Из адреса адрес вычитается или как?
Если кто разбирается в этом, помогите пожалуйста.
PM MAIL WWW ICQ   Вверх
bems
Дата 15.9.2011, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Да.

UPD. Ну это в случае с BYTE* адреса вычитаются, потому что BYTE занимает один байт. 
А если в общем, то там возвращается количество sizeof(T) между двумя указателями, где T это тип на который они указывают

Это сообщение отредактировал(а) bems - 15.9.2011, 21:20


--------------------
Обижено школьников: 8
PM MAIL   Вверх
volatile
Дата 15.9.2011, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(Jr13san @  15.9.2011,  20:31 Найти цитируемый пост)
Как это математически рассчитывается я так и не понял.

я же писал выше:
Цитата(volatile @  10.9.2011,  12:34 Найти цитируемый пост)
(p - lpData) -  это расстояние от начала массива, до текущей позиции

Так как это указатели на BYTE, то это расстояние в байтах.

p = (BYTE*)memchr(p, signature [0], mbi.RegionSize - len_signature + 1 - (p - lpData)
Искать во всем регионе (mbi.RegionSize - len_signature + 1), за вычетом участка который уже прошли (p - lpData).



PM MAIL   Вверх
Jr13san
Дата 16.9.2011, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

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



Это то понятно, но если превратить p и lpData в десятичные числа, то не понятно откуда эти цифры вырисовываются.
Я не понимаю на что указывает p и lpData. У меня просто в голове не укладывается опять.
Вот пример:
Код

byte lpData[17] = "this is a string";//строка, в которой будем искать символ 'r'
byte * ptr = lpData;
ptr = (byte *) memchr(ptr, 'r', 17);
             
if (ptr)
    printf("The character 'r' is at position: %d\n", ptr - lpData);
else
    printf("The character was not found\n");

cout << "ptr = " << ptr << " = ";
printf("%d\n", ptr);
cout << "lpData = " << lpData << " = ";
printf("%d\n",lpData);

В данном куске кода показано что из себя представляют переменные ptr и lpData. А вот от куда такие десятичные числа взялись я так и не понял.

И вот эта строчка:
Код

ptr = (byte *) memchr(ptr, 'r', 17);

По идее в ptr должен записать указатель на первый встречаемый символ 'r' от функции memchr, а на самом деле если вывести ptr на экран, то там не адрес, а целая строка, которая начинается с указателя на этот символ. Как понять такие действия?
Если кто знает, помогите понять пожалуйста.
PM MAIL WWW ICQ   Вверх
volatile
Дата 16.9.2011, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(Jr13san @  16.9.2011,  07:43 Найти цитируемый пост)
По идее в ptr должен записать указатель на первый встречаемый символ 'r' от функции memchr, а на самом деле если вывести ptr на экран, то там не адрес, а целая строка


Там именно адрес, просто дело в том что когда вы выводите указатель в cout, он выводит не сам указатель, а строку на который он указывает.

(и еще, никогда не нужно совмещать в одной функции вывод в cout и printf())


printf("%p\n", ptr); // вывести указатель (в шестнадц. виде)
printf("%s\n", ptr); // вывести строку на которую он указывает

последнее это и есть аналог cout << ptr


Это сообщение отредактировал(а) volatile - 16.9.2011, 09:03
PM MAIL   Вверх
Jr13san
Дата 16.9.2011, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

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



В итоге получается, что я из одного указателя вычитаю другой и получаю разность. Эта разность и есть расстояние между байтами указателей.
Уфф...
Но как связаны эти указатели в памяти?
Хотя в принципе  т.к. там массив один, значит и указатели работают в нём. А разность указателей даёт нам положение первого встречного символа. Но почему разность указателей возвращает число, а не указатель?
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 16.9.2011, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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




M
GremlinProg
Тема перемещена из раздела C/C++: Системное программирование и WinAPI



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
volatile
Дата 16.9.2011, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Jr13san, вы чего-то не понимаете, я не могу понять чего. Там на самом деле, все просто.
Код

char lpData[] = "this is a string";
После этого память будет содержать что-то типа такого:
Код

4300000: = 't'
4300001: = 'h'
4300002: = 'i'
4300003: = 's'
4300004: = ' '
4300005: = 'i'
4300006: = 's'
4300007: = ' '
4300008: = 'a'
4300009: = ' '
4300010: = 's'
4300011: = 't'
4300012: = 'r'
4300013: = 'i'
4300014: = 'n'
4300015: = 'g'
4300016: = '\0'
Естественно адрес 4300000, я взял только для примера. Реальный адрес в программе будет другой.

Код

 char * p = lpData;

После этого p будет содержать 4300000, так как lpData == 4300000

Код

 p = memchr(lpData, 'r', strlen(lpData));

После этого p будет содержать 4300012, так как символ 'r' содержится именно по адресу 4300012

Код

 int I = p - lpData;

После этого I будет содержать (4300012-4300000), то есть 12, то есть расстояние от начала массива, до текущего символа.

PM MAIL   Вверх
Jr13san
Дата 16.9.2011, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 29.7.2008
Где: г. Павлово

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



volatile, Спасибо, вот теперь понятно.
Правда я пробовал смотреть на десятичное представление адресов и там нумерация происходит не через 1,  а через 8, т.е. так:

4300000
4300008
4300016
4300024
...

Ещё наверное последний вопрос:
Зачем используют символ "*" в коде?
& - это ссылка на адрес.
* - это ссылка на объект?

И какая разница в том, чтобы поставить так:
Код

char * p = lpData;

или так:
Код

char p * = lpData;

Т.е. сколько ролей играет эта звёздочка?
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

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


 




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


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

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