Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2011, 21:34   #1
neeble
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 12
По умолчанию сканирование памяти

как просканировать память программы в поисках определеного значения
(типо как артмани)
известин хэндл окна
по нему узнаю pid процесса
потомм юзаю OpenProcess
а вот что дальше делать незнаю
наверное надо использовать readprocessmemory

но как использавать незнаю
интерисует все что надо делать после OpenProcess

зарание спс
neeble вне форума Ответить с цитированием
Старый 30.10.2011, 22:41   #2
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Код:
function GetAdrValue(h: hwnd; Addres: cardinal; ByteType: integer;
  var GetValue: integer): Boolean;
var
  PID, PH: cardinal;
  rw: cardinal;
  exec: Boolean;
begin
  exec := true;
  if h = 0 then
    exec := false;
  getwindowthreadprocessid(h, PID);
  PH := openprocess(process_all_access, false, PID);
  if PH = 0 then
    exec := false;
  if readprocessmemory(PH, ptr(Addres), @GetValue, ByteType, rw) = false then
    exec := false;
  closehandle(PH);
  result := exec;
end;
Доступно написан код?
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Старый 30.10.2011, 22:49   #3
neeble
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 12
По умолчанию

да только я незнаю что такое exec но думаю гугл поможет
хотелось бы еще узнать подробне об том что в скобках (PH, ptr(Addres), @GetValue, ByteType, rw) но это тоже гугл должен помоч

rw - это то что я ищу в памяти?
ptr(Addres) это значит что я по всей памяти процесса ищу?

не наверное я непонял

а можно как небуть узнать деопазон адресов использумех ячеек памяти програмой
(первый и последние адреса ячеек которые используються програмой тогда бы я вставил бы вцикл
и увеличивал адрес на 1 и читал бы значение с этого адреса сравнивал бы с тем что ишу и если это совподает то записывал/выводил адрес этой ячейки и так пока недойду до последней ячейки памяти которую использует программа)

Зачем вы отвечаете с цитированием предыдущего поста ?
Вы не видите кнопку справа от кнопки "Цитата" ?
Или вам почему-то не видно пустое окно редактора под последним сообщением ?
За оверквотинг у нас штрафуют, имейте это ввиду.
Дабы не нарушать правила раздела, внимательно их почитайте:
http://programmersforum.ru/announcement.php?f=2
После 10 ваших сообщений начнете получать штрафы за нарушение правил...

Последний раз редактировалось mihali4; 31.10.2011 в 02:56.
neeble вне форума Ответить с цитированием
Старый 30.10.2011, 23:30   #4
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

exec - результат функции, будет иметь значение True, если все прошло нормально.
PH - станет понятно, если посмотреть на пару строчек выше. То с чем будем работать, цель.
ptr(Addres) - Адрес, где будем читать значение в памяти целевого процесса.
@GetValue - Считанное значение по заданному адресу.
ByteType - тип байта, 1,2,4,8.
rw - сами посмотрите. Для этого есть MSDN.
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Старый 30.10.2011, 23:38   #5
neeble
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 12
По умолчанию

мне несовсем это было нужно

ptr(Addres) - Адрес, где будем читать значение в памяти целевого
это то что мне надо найти т.е мне надо найти все адресса ячеек
которые содержат определеное значение

объясню на примере
есть праграмма блокнот
и я хочу найти адреса ячеек в каторых содержиться число 1234

вот думаю я понятно объяснил

Последний раз редактировалось mihali4; 31.10.2011 в 02:57.
neeble вне форума Ответить с цитированием
Старый 31.10.2011, 02:06   #6
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

А гуглом пользоваться умеете? Давайте я поищу в гугле за вас? - http://tinyurl.com/3upthtq

PS. Знаки препинания по возможности ставьте, тяжко читать.
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Старый 31.10.2011, 14:38   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Мат-часть сначала подтяните.

Чтобы не было "а что эти закорючки тут значат?"

http://www.transl-gunsmoker.ru/2009/09/blog-post.html
http://www.gunsmoker.ru/2011/04/windows.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 31.10.2011, 19:36   #8
neeble
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 12
По умолчанию

получаеться мне можно сделать простым перебором всех ячеек
памяти наченая с 00010000 (0000FFFF+1).
тока вот докакой ячейки переберать ведь наврятле приложение использует все 4 гига,
и зарезервированую память (насколько я понял зарезервированая память заполняеться нулями, можно поставить учловие после 1000 нулей прекращать поиск)

я думаю что можно получить инфармацию о процессе и там
будет указоно сколько мегабайт использует процесс,
перевести это количество в байты и сложить с 0000FFFF
так я получу последний адрес ячейки


я правельно понял?
если что то нетак укажите на мои ошибки

и еще один маленький вопросик
Код:
readprocessmemory(PH, ptr(Addres), @GetValue, ByteType, rw)
можно ли ptr(Addres) задавать в обычных числах (десятеричной системе)?

думаю эти вопросы касаються этой темы
и тут нет нарушений правил форума
neeble вне форума Ответить с цитированием
Старый 31.10.2011, 19:39   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Определить статус страницы памяти можно через VirtualQuery.

Список занятых страниц не обязан быть непрерывным.

Цитата:
можно ли ptr(Addres) задавать в обычных числах (десятеричной системе)?
Машина не видит разницы между указателями, числами, буквами и рисунками. Для неё все данные - числа. Смысл числу задаёте только вы и информация типа.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 31.10.2011, 20:34   #10
neeble
Пользователь
 
Регистрация: 30.10.2011
Сообщений: 12
По умолчанию

Код:
procedure TForm1.goClick(Sender: TObject);
var
 findadr,nawadr,yess: Integer;

begin

  findadr:=strtoint(Edit1.Text);
 while (yess<>findadr) do
  begin
    nawadr:=staradr+1;
    ReadProcessMemory(hproc,nawadr,@yess, 4, BytesRead);
  end;
  adr.Caption:=IntToStr(yess);

end;
показавает ошибку ([Error] Unit1.pas(85): Incompatible types: 'Integer' and 'Pointer'
[Error] Unit1.pas(85): Undeclared identifier: 'BytesRead'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
) и ставит курсор перед @yess

что нетак я сделал?
neeble вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа для тестирования памяти, тестирование ячеек памяти Hunter557 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 30.01.2011 19:20
Кольцевая очередь на массиве в статической памяти с элементами в динамической памяти ]tach[ Общие вопросы C/C++ 1 19.01.2011 13:16
Сканирование портов -Flasher- Работа с сетью в Delphi 5 03.08.2010 10:47
Сканирование директории D!zel Общие вопросы Delphi 8 22.12.2009 21:11
Сканирование директорий. Serious Общие вопросы Delphi 2 14.02.2009 15:17