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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск в памяти процесса, нашeл больше чем артмани) 
:(
    Опции темы
volatile
Дата 10.6.2012, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



К слову, еще баг, если например будем искать строку, и граница 128 байтного блока (кстати, почему именно 128?) придется на эту строку, то он ее не найдет.
Цитата(Townsmen @  10.6.2012,  13:11 Найти цитируемый пост)
но то что нужно найти он находит 

Ну а в чем тогда проблема-то, если все так замечателно? smile 

Цитата(Townsmen @  10.6.2012,  13:11 Найти цитируемый пост)
 Я нигде не могу найти рабочий алгоритм прохождения по всем адресам (с правом записи

Цитата(Townsmen @  10.6.2012,  07:55 Найти цитируемый пост)
(mbi.Protect & PAGE_WRITECOPY)){

Кстати попробуйте убрать эту часть, PAGE_WRITECOPY - это не право записи. Имхо, это копирование блока, и запись в этот откопированный блок, то есть запись в копию, которая не при делах.

Во внутреннем цикле введите еще одну переменную
LPBYTE temp_adr = lpAddress, (или какое вам нравиться, имя)
перед этой строкой: 
Цитата(volatile @  10.6.2012,  08:57 Найти цитируемый пост)
for(unsigned int t=1; t <= (mbi.RegionSize/rSize); t++){//делим регион на части по 128

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

Это сообщение отредактировал(а) volatile - 10.6.2012, 18:01
PM MAIL   Вверх
Dem_max
Дата 11.6.2012, 04:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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





--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
xvr
Дата 11.6.2012, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Еще замечание - все адреса, где ваша программа расходится во мнениях с артмани принадлежат области данных исследуемой программы (скорее всего стеку и/или куче). А содержимое таких областей имеет тенденцию меняться со временем. Попробуйте запустить артмани и вашу программу 2 раза (по очереди)

PM MAIL   Вверх
Townsmen
Дата 11.6.2012, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(volatile @  10.6.2012,  17:56 Найти цитируемый пост)
К слову, еще баг, если например будем искать строку, и граница 128 байтного блока (кстати, почему именно 128?) придется на эту строку, то он ее не найдет.

для строки 128 байт массив 100% не годится, там лутше сразу регионом считывать.
Цитата(volatile @  10.6.2012,  17:56 Найти цитируемый пост)
Во внутреннем цикле введите еще одну переменную
LPBYTE temp_adr = lpAddress, (или какое вам нравиться, имя)
перед этой строкой: 
Цитата(volatile @  10.6.2012,  08:57 Найти цитируемый пост)
for(unsigned int t=1; t <= (mbi.RegionSize/rSize); t++){//делим регион на части по 128

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

Вы читаете мои мысли, после того как Вы написали что lpAddress прибавляю в 2 раза в цикле, то я потом немного помозговал и переделал:
Код

LPBYTE subAddress;
for(LPBYTE lpAddress = (LPBYTE)msi.lpMinimumApplicationAddress;
        lpAddress <= (LPBYTE)msi.lpMaximumApplicationAddress;
        lpAddress += mbi.RegionSize){ //идем по регионам памяти
            if(VirtualQueryEx(hProcess, lpAddress, &mbi, sizeof(mbi))){//Узнаем о текущем регионе памяти.
                if((mbi.Protect & PAGE_READWRITE) || (mbi.Protect & PAGE_WRITECOPY)){// Если он доступен для записи, работаем с ним.
                    if(mbi.RegionSize>= rSize) {//проверяем что бы регион не был меньше 128
                        subAddress = lpAddress;
                        for(unsigned int t=1; t <= (mbi.RegionSize/rSize); t++){//делим регион на части по 128
                            if (ReadProcessMemory(hProcess, subAddress, &lpData, rSize, &lpRead)){ //считываем по 128
                                int pos = mem_sub(lpData, sizeof(lpData), &value, sizeof(value),subAddress);//исчем в считанои массиве
                                subAddress+=0x00000080; //переходим на 128 адресов
                            }}}}}}

и еще уберу (mbi.Protect & PAGE_WRITECOPY)


Dem_max, спасибо за ссылку нужно будет разобраться в немного в коде
PM MAIL   Вверх
Townsmen
Дата 11.6.2012, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сделал изменения и программа уже более точно начала искать, уже ближе к адресам артмани. Наверное нужно переделать что бы она считывала весь регион сразу и проверяла. Смотрел http://forum.tuts4you.com/topic/16209-how-...ess/#entry81108
Вижу здесь записывают сразу регион:
Код

 char* szMemDump = (char*)malloc(mbi.RegionSize+1);

А это для поиска строки может пойдет, но для поиска чисел некоректно:
Код

if( (mbi.Protect != PAGE_NOACCESS) && (mbi.State == MEM_COMMIT) )

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


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

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



Что то вы в дебри полезли, напомню (из умной книжки)

Цитата

В настоящее время системные DLL занимают адреса в памяти от 0x70000000 до 0x78000000




--------------------

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

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


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

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


 




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


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

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