SiriusED Опубликовано 6 августа, 2014 Поделиться Опубликовано 6 августа, 2014 Код 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ми... Короче почему так все криво то... Код вроде правильно написал.... Гуглю уже час, у всех как у меня и норм все работает... Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 6 августа, 2014 Поделиться Опубликовано 6 августа, 2014 А почему бы не объявить IntPtr buf = IntPtr.Zero; ?Тогда данные сразу прочитаются в Int32 формат. Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 6 августа, 2014 Автор Поделиться Опубликовано 6 августа, 2014 Ну сейчас попробую, но проблема думаю не в этом, взял другой адрес, прочитал тем же кодом, все прочитало отлично и даже со смещениями прочитало все полностью...Ну вот адрес который я пытаюсь прочесть: 0x1000A2BC. Может быть что-то именно с адресом не так? Но вроде все нормально... в CE этот адрес указывает на другой адрес нормально... Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 6 августа, 2014 Поделиться Опубликовано 6 августа, 2014 Ну сейчас попробую, но проблема думаю не в этом, взял другой адрес, прочитал тем же кодом, все прочитало отлично и даже со смещениями прочитало все полностью...Ну вот адрес который я пытаюсь прочесть: 0x1000A2BC. Может быть что-то именно с адресом не так? Но вроде все нормально... в CE этот адрес указывает на другой адрес нормально...Не хочу тебя разочаровать, но ты не можешь иметь доступ к адресу 0xFFF6525C.Начиная с адреса 0x7xxxxxxx начинается адресное пространство библиотек windows.Начиная с адреса 0x8xxxxxxx начинается адресное пространство, которое резервирует ядро Windows, и доступа к нему ты не имеешь.И CE никак не может отобразить содержимое этого адреса 0xFFF6525C. Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 6 августа, 2014 Автор Поделиться Опубликовано 6 августа, 2014 Да я для примера чисто взял, а вот реальный адрес читай ниже описал всю полностью ситуацию..Твой способ не работает во обще, по MSDN'ну знаю что пишет что так тоже можно, но не работает во обще...Вообщем тут че-то очень косо...Короче по CE: В адресе 0x1000A2BC лежит 0xFFF4BFE8.BitConverter.ToString(buf) // Выводит "E8-BF-F4-FF"BitConverter.ToInt32(buf, 0).ToString() // Выводит "-737304"Что это за пиз..ц?И это именно с этим адресом такая жопа, ибо взял три других адреса - читаются как надо... Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 6 августа, 2014 Поделиться Опубликовано 6 августа, 2014 Да я для примера чисто взял, а вот реальный адрес читай ниже описал всю полностью ситуацию..Твой способ не работает во обще, по MSDN'ну знаю что пишет что так тоже можно, но не работает во обще...Вообщем тут че-то очень косо...Короче по CE: В адресе 0x1000A2BC лежит 0xFFF4BFE8.BitConverter.ToString(buf) // Выводит "E8-BF-F4-FF"BitConverter.ToInt32(buf, 0).ToString() // Выводит "-737304"Что это за пиз..ц?Адреса в x86 архитектуре хранятся в ячейках памяти типа - unsigned int.Следовательно тебе нужно использовать метод - BitConverter.ToUInt32 Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 6 августа, 2014 Автор Поделиться Опубликовано 6 августа, 2014 Да, верняк, туплю че-то жесть уже с этим всем, -737304 это переполнение переменной, но могло бы и ошибку кинуть шоль, я ж не ставил unchecked()...Короче да, адрес прочел, но адрес тот еще вышел, в dec не влазит даже в калькуляторе что б перевести в hex...Проблема решена, спасибо. Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 7 августа, 2014 Поделиться Опубликовано 7 августа, 2014 Да, верняк, туплю че-то жесть уже с этим всем, -737304 это переполнение переменной, но могло бы и ошибку кинуть шоль, я ж не ставил unchecked()...Короче да, адрес прочел, но адрес тот еще вышел, в dec не влазит даже в калькуляторе что б перевести в hex...Проблема решена, спасибо.Это не переполнение переменной. Это отображение адреса в signed виде. Адреса хранятся в ячейках типа unsigned, потому что процессор не умеет работать с отрицательными числами.А второе твоё предложение я понять не смог. Ссылка на комментарий Поделиться на другие сайты Поделиться
SiriusED Опубликовано 7 августа, 2014 Автор Поделиться Опубликовано 7 августа, 2014 хмм, даже так... Очень познавательно, почитаю обязательно об этом тоже.Второе предложение - забей. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения