PDA

Просмотр полной версии : Чтение из памяти


Morfik
22.03.2011, 12:31
Итак существует ситуация: в своем потоке получаем указатели на некоторые данные, после выдираем инфу по этим указателем, НО в этот момент другой, скажем так главный поток может сделать ФРИМЕМ на этот блок памяти (тормозить его и вообще делать что либо с ним не вариант, да и поток это не мой), а так как мы читаем указатели можем вылететь с критом типа "can not read adress что то там".

Можно ли с этим что поделать, была идея юзать ReadProcessMemory, но по мне весь этот процесс чтения будет кушать больше и длится дольше, да и решит ли это проблему ошибки "can not read..." или может можно сделать что еще?


зы: наверна скопирую через ReadProcessMemory нужный блок и буду читать из него, его хотябы никто не фримемнет кроме меня

xkor
22.03.2011, 14:35
Morfik, а что мешает процессу фримемнуть память непосредственно перед или даже во время того как ты делаешь ReadProcessMemory? итог будет тот же что и при доступе к этой памяти из того же процесса)

Morfik
22.03.2011, 16:30
Morfik, а что мешает процессу фримемнуть память непосредственно перед или даже во время того как ты делаешь ReadProcessMemory? итог будет тот же что и при доступе к этой памяти из того же процесса)

разница в том что это
a:=DWORD(Pointer($fffffff)^);
крашит приложение
а это
ReadProcessMemory(getcurrentProcess,Pointer($fffff ff),@a,4,b);
просто вернет фалсе

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

guplen
22.03.2011, 16:38
В try ... except засунь чтение.

Morfik
22.03.2011, 16:44
В try ... except засунь чтение.
try
cba:=DWORD(Pointer($fffffff)^);
except
on E:Exception do
MessageBox(0,pchar(E.Message),'чтение',0);
end;
помогло, хотя давненько вроде пробовал все равно летало, не думал что поможет. Что ж щас хотя бы точное место ошибок легче искать будет.

mira
23.03.2011, 09:02
а что мешает вызвать стоптред для того потока (потоков) проверить isbadreadptr (забыл точное название) и считать. Но если память динамичная может быть другая трабла. После фримем там может оказатса другая читаемая память, но... Нето)

Morfik
26.03.2011, 01:38
а что мешает вызвать стоптред для того потока (потоков) проверить isbadreadptr (забыл точное название) и считать. Но если память динамичная может быть другая трабла. После фримем там может оказатса другая читаемая память, но... Нето)

не та инфа что нужно не столь критично, а вот тормозить тот поток ваще не вариант - пишу для ло2 и каждые несколько секунд тормозить главный поток игры чтобы вытащить свою инфу вообще не вариант)

mira
30.03.2011, 11:17
а ты попробуй. Если у тя клиент запущен на калькуляторе то да, возможно скажетса на работе.
Хотя я не очень понимаю к чему этот артмани стайл

Morfik
02.04.2011, 20:50
Для максимальной безопасности, не хочу менять ни единого байта оригинальных функций и таблиц. Функционал минимален да и методы УГ но что поделать.