Перейти к содержанию

Почему так криво читается память?


Рекомендуемые сообщения

Код C#


private void ReadMem()
{
byte[] buf = new byte[4];
int bytesReaded;
uint baseAddr = 0xFFF6525C; // В дизассемблере показывает что этот адресс содержит другой адресс 0x546CC80A
IntPtr hProcess = OpenProcess(ProcessAccessFlagsAll, false, this.pId); // Тут все нормально получаю хендл

ReadProcessMemory(hProcess, (IntPtr)baseAddr, buf, 4, out bytesReaded); // Читаю в buf
CloseHandle(hProcess);

MessageBox.Show(BitConverter.ToInt32(buf, 0).ToString()); // И вот тут криво(опишу ниже)

}

Во общем проблема в том, что "BitConverter.ToInt32(buf, 0).ToString()" конвертирует мой массив с конца до начала а не с начала до конца, то есть получается во обще не то...

Попробовал "BitConverter.ToString(buf)" Выдало нужный мне адресс(546CC80A), но наобороот все 80 CC 46 5 , и плюс такой конверт выдает только 7символов вместо 8ми... Короче почему так все криво то... Код вроде правильно написал.... Гуглю уже час, у всех как у меня и норм все работает...

Ссылка на комментарий
Поделиться на другие сайты

Ну сейчас попробую, но проблема думаю не в этом, взял другой адрес, прочитал тем же кодом, все прочитало отлично и даже со смещениями прочитало все полностью...

Ну вот адрес который я пытаюсь прочесть: 0x1000A2BC. Может быть что-то именно с адресом не так? Но вроде все нормально... в CE этот адрес указывает на другой адрес нормально...

Ссылка на комментарий
Поделиться на другие сайты

Ну сейчас попробую, но проблема думаю не в этом, взял другой адрес, прочитал тем же кодом, все прочитало отлично и даже со смещениями прочитало все полностью...

Ну вот адрес который я пытаюсь прочесть: 0x1000A2BC. Может быть что-то именно с адресом не так? Но вроде все нормально... в CE этот адрес указывает на другой адрес нормально...

Не хочу тебя разочаровать, но ты не можешь иметь доступ к адресу 0xFFF6525C.

Начиная с адреса 0x7xxxxxxx начинается адресное пространство библиотек windows.

Начиная с адреса 0x8xxxxxxx начинается адресное пространство, которое резервирует ядро Windows, и доступа к нему ты не имеешь.

И CE никак не может отобразить содержимое этого адреса 0xFFF6525C.

Ссылка на комментарий
Поделиться на другие сайты

Да я для примера чисто взял, а вот реальный адрес читай ниже описал всю полностью ситуацию..

Твой способ не работает во обще, по MSDN'ну знаю что пишет что так тоже можно, но не работает во обще...

Вообщем тут че-то очень косо...

Короче по CE: В адресе 0x1000A2BC лежит 0xFFF4BFE8.

BitConverter.ToString(buf) // Выводит "E8-BF-F4-FF"

BitConverter.ToInt32(buf, 0).ToString() // Выводит "-737304"

Что это за пиз..ц?

И это именно с этим адресом такая жопа, ибо взял три других адреса - читаются как надо...

Ссылка на комментарий
Поделиться на другие сайты

Да я для примера чисто взял, а вот реальный адрес читай ниже описал всю полностью ситуацию..

Твой способ не работает во обще, по MSDN'ну знаю что пишет что так тоже можно, но не работает во обще...

Вообщем тут че-то очень косо...

Короче по CE: В адресе 0x1000A2BC лежит 0xFFF4BFE8.

BitConverter.ToString(buf) // Выводит "E8-BF-F4-FF"

BitConverter.ToInt32(buf, 0).ToString() // Выводит "-737304"

Что это за пиз..ц?

Адреса в x86 архитектуре хранятся в ячейках памяти типа - unsigned int.

Следовательно тебе нужно использовать метод - BitConverter.ToUInt32

Ссылка на комментарий
Поделиться на другие сайты

Да, верняк, туплю че-то жесть уже с этим всем, -737304 это переполнение переменной, но могло бы и ошибку кинуть шоль, я ж не ставил unchecked()...

Короче да, адрес прочел, но адрес тот еще вышел, в dec не влазит даже в калькуляторе что б перевести в hex...

Проблема решена, спасибо.

Ссылка на комментарий
Поделиться на другие сайты

Да, верняк, туплю че-то жесть уже с этим всем, -737304 это переполнение переменной, но могло бы и ошибку кинуть шоль, я ж не ставил unchecked()...

Короче да, адрес прочел, но адрес тот еще вышел, в dec не влазит даже в калькуляторе что б перевести в hex...

Проблема решена, спасибо.

Это не переполнение переменной. Это отображение адреса в signed виде. Адреса хранятся в ячейках типа unsigned, потому что процессор не умеет работать с отрицательными числами.

А второе твоё предложение я понять не смог.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

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