Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Поиск в памяти процесса |
Автор: Townsmen 8.6.2012, 09:51 | ||
Доброго времени суток! Есть такое консольное приложение, оно ищет в процессе int и в результате выдает адреса найденных совпадений:
Но при тестировании приложения, оно выдает немного разное количество найденных чисел чем ArtMoney. Например: я ищу в программе "Калькулятор плюс" число 45, в результате ArtMoney нашло 7 адресов с числом 45, а єта программа 12 с числом 45. Почему такие результаты? мне кажется программа проверяет больше диапазонов адресов чем ArtMoney, или у меня неправильный алгоритм прохождения по диапазонам или неправильно использую VirtualQueryEx |
Автор: Townsmen 8.6.2012, 22:38 | ||
я проверял адреса, приложение нашло все те самые что артмани и еще 5 адресов. Все зависит от числа которое ищем, в одних случаях все адреса одинаковые. В конце поиска программы выводятся все адреса найденные в консоль. |
Автор: feodorv 8.6.2012, 22:52 | ||
Я не просто так спрашиваю. Я хочу убедиться, что адреса выровнены или не выровнены по 4-х байтной границе. Повторяю просьбу:
|
Автор: Townsmen 8.6.2012, 23:01 | ||
как это выровнены? незнаю... |
Автор: feodorv 9.6.2012, 00:07 |
Просто показать списки можно? А то у меня начинает складываться такое чувство, что я Вас прошу выдать военную тайну.... ![]() |
Автор: Townsmen 9.6.2012, 00:12 |
можно, просто я неправильно понял что с меня требуется... Сейчас скриншоты сделаю или текстом написать? Добавлено через 6 минут и 59 секунд ![]() |
Автор: feodorv 9.6.2012, 02:54 | ||
Спасибо, так пойдёт! Увы, на вид всё выравнено (addr % 4 даёт 0). То есть, действительно, находит больше. Было бы неплохо, если бы Вы вывели на печать значение mbi.Type для каждого найденного адреса, возможно, определилась бы какая-нибудь закономерность....
Мне кажется, это имеет смысл проверять, если mbi.State есть MEM_COMMIT. |
Автор: GremlinProg 9.6.2012, 06:55 | ||||
![]() а как так получилось, что одно из попаданий лежит в обеих программах в соседних 4-байтовых ячейках:
версии программы совпадают?
если проверять все адреса процесса, тогда надо сделать исключение по крайней мере для служебных диапазонов: секции и заголовки PE, в них-то искать ничего не надо я так думаю ) Добавлено через 1 минуту и 34 секунды вернее, конечно не сами секции, а заголовки этих секций |
Автор: Townsmen 9.6.2012, 09:55 | ||||||
я даже сам незнаю почему так получилось
Если допустить что произошла ошибка в нумерации адресов, то дальше все адреса должны не совпадать, а они совпадают. Получается только 1 адрес не на своем месте чего то.
Надо будет сегодня проверить, жаль что сейчас не могу... вечером напишу результаты. |
Автор: Townsmen 10.6.2012, 00:52 |
Сделал еще вывод mbi.State и mbi.Type но никакой закономерности не вижу, только что mbi.State для всех адресов неизменная. Последний адрес в артмани вообще не совпал ![]() ![]() |
Автор: volatile 10.6.2012, 01:39 | ||
Ха, ха, может быть конечно... Но прежде чем искать соломинку в "чужом глазу", неплохо бы убрать "брёвна" из "своего глаза"
Простой пример, допустим RegionSize = 256, цикл запишется так: for(t=0; t <= (256/128); ...) т.е for(t=0; t <= 2); ...) т.е цикл будет отработан 3 раза 3*128=384 (напомню, это при размере 256). Выход за пределы, как минимум. Это только самое первое "бревно", валяющеея на поверхности. ![]() |
Автор: Townsmen 10.6.2012, 07:55 | ||
Уже исправил, что еще не так? Саме больше на мой взгляд ошибок в этом участке кода:
|
Автор: volatile 10.6.2012, 08:57 | ||
Новички почему-то любят писать сложные конструкции, наверно думают что так поступают крутые программеры. Так вот, крутые программеры, такие невменяемые конструкции не пишут. Я например, в силу своей природной тупости, не могу охватить весь этот участок мысленным взором.
Зачем переменная цикла прибавляется два раза, в разных местах? Вы как автор программы, можете объясить? |
Автор: Townsmen 10.6.2012, 13:11 |
Эту часть кода я взял с http://habrahabr.ru/post/93437/. Но он там был нерабочий и мне пришлось немного его самому переделывать (получается цикл в цикле). Если честно я немного удивлен как этот код работает, он наверное пропускает некоторые участки памяти, но то что нужно найти он находит ![]() |
Автор: volatile 10.6.2012, 17:56 | ||||
К слову, еще баг, если например будем искать строку, и граница 128 байтного блока (кстати, почему именно 128?) придется на эту строку, то он ее не найдет. Ну а в чем тогда проблема-то, если все так замечателно? ![]()
Кстати попробуйте убрать эту часть, PAGE_WRITECOPY - это не право записи. Имхо, это копирование блока, и запись в этот откопированный блок, то есть запись в копию, которая не при делах. Во внутреннем цикле введите еще одну переменную LPBYTE temp_adr = lpAddress, (или какое вам нравиться, имя) перед этой строкой:
И ниже все lpAddress, замените на эту переменную. Потому-что нельзя менять переменную цикла, в двух местах. |
Автор: Dem_max 11.6.2012, 04:48 |
посмотри еще тут http://forum.tuts4you.com/topic/16209-how-to-search-bytes-in-process/#entry81108 |
Автор: xvr 11.6.2012, 10:34 |
Еще замечание - все адреса, где ваша программа расходится во мнениях с артмани принадлежат области данных исследуемой программы (скорее всего стеку и/или куче). А содержимое таких областей имеет тенденцию меняться со временем. Попробуйте запустить артмани и вашу программу 2 раза (по очереди) |
Автор: Townsmen 11.6.2012, 10:56 | ||||||
для строки 128 байт массив 100% не годится, там лутше сразу регионом считывать.
Вы читаете мои мысли, после того как Вы написали что lpAddress прибавляю в 2 раза в цикле, то я потом немного помозговал и переделал:
и еще уберу (mbi.Protect & PAGE_WRITECOPY) Dem_max, спасибо за ссылку нужно будет разобраться в немного в коде |
Автор: Townsmen 11.6.2012, 11:47 | ||||
Сделал изменения и программа уже более точно начала искать, уже ближе к адресам артмани. Наверное нужно переделать что бы она считывала весь регион сразу и проверяла. Смотрел http://forum.tuts4you.com/topic/16209-how-to-search-bytes-in-process/#entry81108 Вижу здесь записывают сразу регион:
А это для поиска строки может пойдет, но для поиска чисел некоректно:
|
Автор: 500mhz 11.6.2012, 12:40 | ||
Что то вы в дебри полезли, напомню (из умной книжки)
|