Определить выравнивание памяти процесса с помощью C # - PullRequest
2 голосов
/ 18 апреля 2011

Я пишу приложение ac #, которое берет строку с любым понятным именем процесса (скажем, «блокнот») и читает память процесса.Это хорошо для чтения байтов, но я понятия не имею, если это int32s, chars, bools или другие типы данных.Одним из первых шагов к решению этой проблемы является знание того, как дополняются данные.Как я могу определить выравнивание данных в памяти?

Я понял, что это не так просто, как знать ОС или процессор.Якобы возможны различные упаковки даже тогда: http://www.developerfusion.com/article/84519/mastering-structs-in-c/

Итак, есть ли какой-нибудь пинвоук, который я мог бы использовать на дескрипторе процесса, чтобы прочитать какое-то значение, или, может быть, алгоритм, который считывает некоторые байты и проверяет, что он находит?

Мотивация (в случае, если у кого-то есть лучшее решение для моей конечной цели): я не хочу искать потенциальные значения int32 (или любой другой тип), просматривая относительный адрес 0,1,2,3и затем смотрю на 1,2,3,4 и так далее, если я могу помочь.Если память выровнена на 4 байта, я бы потратил много сил впустую, если бы я мог просто проверить 0,1,2,3 и перейти к 4,5,6,7.

1 Ответ

0 голосов
/ 18 апреля 2011

Я не совсем уверен, что вы пытаетесь сделать, но лучше всего, если вы надеетесь покопаться в этом процессе, чтобы найти ошибку или понять, к чему они стремятся?

лучший способ выяснить расположение памяти будет по символам (.pdb).Это приложение, которое вы написали?

Если нет, вы можете подумать о внедрении потока и последующем вызове MiniDumpWriteDump ().Этот API может выгружать память на диск, где вы можете просматривать ее с помощью windbg.

Идея заключается в том, чтобы использовать общедоступные символы Microsoft (! Symfix), а затем перемещаться по памяти в поисках того, где вы находитесь.нуждаясь.Наличие символов для бит Microsoft поможет вам - с их помощью вы сможете выяснить, где находятся потоки / кучи / дескрипторы / и т.д.

...