· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› ReadProcessMemory

Посл.отвђт Сообщенiе


Дата: Июл 29, 2003 14:02:03

Я вызываю ReadProcessMemory на свой процесс. Все проходит нормально. Но, когда я сделал библиотеку, которая выполняет те же действия, что выполнялись в моем процессе(я делаю перехватчик вызовов функций из библиотек) и глобализировал ее на все доступные мне по OpenProcess процессы я заметил, что у половины из них rpm возвращает 0. Меня это сильно удивило и я проверил GetLastError. Оказалось, что у большей части приложений это 12b(Запрос ReadProcessMemory или WriteProcessMemory был выполнен только частично). Я подумал, что может я попадаю на область памяти, где у региона нету PAGE_READ(абсурд, конечно, но кто знает, может там PAGE_NOACCESS) и вызвал VirtualProtect. С ним, вообще, непонятная фишка получилась: он ИНОГДА тоже возвращает 0, дальнейшее GetLastError возвращает кучу разных ошибок(по-моему вида 4), однажды даже вернула ошибку сетевой платы 8). Благодарю тех, кто до сюда дочитал. Я покажу только часть кода, если понадобится больше напишите, я остальную покажу.
; Находим адрес IMAGE_IMPORT_BY_NAME
mov ebx, itd.u1.AddressOfData
add ebx, modbase
; Так как размер IMAGE_IMPORT_BY_NAME не определен, читать будем, исходя из длины параметра
invoke lstrlen, funcname
mov edi, eax
add edi, 3
; Читаем...
invoke VirtualProtect, ebx, edi, PAGE_READWRITE, ADDR op
.if eax==0
invoke GetLastError
int 03h
ret
.endif
invoke ReadProcessMemory, hProc, ebx, ADDR iibn, edi, ADDR br
.if eax==0
invoke GetLastError
int 03h
invoke MessageBox,0,SADD("7"),ADDR me.szModule,MB_OK
mov eax, 7
ret
.endif
В чем может быть ошибка? Я понимаю я не дал полной картины, но чисто с теоретической точки зрения, что это может быть?


Дата: Июл 29, 2003 14:55:15

Да, я сейчас выяснил, что IsBadReadPtr возвращает 0, то есть VirtualProtect не нужен, вообще. Хм... тогда более, чем странно =)...
Да и еще я пробую энто под ХР без sp.


Дата: Авг 4, 2003 14:24:51

Составь карту памяти при помощи VirtualQueryEx. Может ReadProcessMemory прекращает чтение при достижении границы региона. То есть, если мы начали чтение в странице с атрибутами R/W, а следущая страница имеет только атрибут R, то она не будет прочитана так как относится к другому региону?!


Дата: Авг 4, 2003 15:11:59

Ок, а если даже так, то придется делать 2 раза ReadProcessMemory, чтобы пофиксить? А если там более, чем 2 региона? Есть ли алгоритмы, которые осуществляют 100% чтение из области памяти?


Дата: Авг 5, 2003 08:52:02 · Поправил: Black_mirror

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


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.047