Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.58
VlTag
7 / 7 / 1
Регистрация: 30.04.2012
Сообщений: 87
#1

Вывод дампа памяти с нужного адреса - C++

11.01.2014, 01:59. Просмотров 1684. Ответов 9
Метки нет (Все метки)

Имеется работающий код из книги. У меня среда Visual C++ 2008.
Проблема в том, что этот код выводит дамп начиная с адреса переменной "k".
Мне надо выводить дамп с нужного заданного адреса. Как изменить код, чтобы не было привязки к переменной "k"?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//Вывод дампа памяти начиная с ячейки переменной "k"
 
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <windows.h>
 
int k=0x07;                
BYTE *b=(BYTE*)&k;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int j=0;
    printf("\n%p   ",b);
    
    for (int i=0; i<432; i++)
    {
      printf("%02x  ",*(b++));
      if (++j==16&&i<430)
      {
          printf("\n");
          j=0;
          printf("%p   ",b);
      };
    };
    printf("\n");
    _getch();       
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.01.2014, 01:59     Вывод дампа памяти с нужного адреса
Посмотрите здесь:
C++ Выделить в памяти 1024 ячейки по 8 байт и вывести их адреса(МИНИ менеджер памяти))
Узнать адреса памяти C++
Проверка доступности адреса памяти C++
Адреса в памяти, количество бит C++
C++ Поиск адреса длл в памяти приложения
C++ Вывести значения элементов массива и их адреса в памяти
Адреса памяти, в которых происходит выделение, и нет освобождения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
andryshka
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 81
11.01.2014, 02:01     Вывод дампа памяти с нужного адреса #2
Цитата Сообщение от VlTag Посмотреть сообщение
BYTE *b=(BYTE*)&k;
Ни в этой ли строке собака зарыта?
VlTag
7 / 7 / 1
Регистрация: 30.04.2012
Сообщений: 87
11.01.2014, 02:12  [ТС]     Вывод дампа памяти с нужного адреса #3
Вы правы! Эта строка даёт (начинает) информацию об адресах. Но как её изменить, чтобы не было привязки к переменной "k"?
Мне нужно создать утилиту где я мог бы сам задать первый адрес. Любой, который мне нужен. Это позволит просматривать тот или иной нужный участок памяти.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.01.2014, 09:50     Вывод дампа памяти с нужного адреса #4
Как инициализировать указатель произвольным адресом?
VlTag
7 / 7 / 1
Регистрация: 30.04.2012
Сообщений: 87
13.01.2014, 23:11  [ТС]     Вывод дампа памяти с нужного адреса #5
Уважаемый
alsav22 !
Большое спасибо!
Вот работающий код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//Вывод дампа памяти с заданного адреса
//
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <windows.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    BYTE *b=(BYTE*)0x00416000; //Любой адрес
 
    int j=0;
    printf("\n%p   ",b);
    for (int i=0; i<400; i++)    
    {
      printf("%02x  ",*(b++));
      if (++j==16&&i<398) {      
          printf("\n");
          j=0;
          printf("%p   ",b);    
        };
    };
    _getch();       
    return 0;
}
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.01.2014, 23:30     Вывод дампа памяти с нужного адреса #6
Цитата Сообщение от VlTag Посмотреть сообщение
Вот работающий код:
???
Миниатюры
Вывод дампа памяти с нужного адреса  
VlTag
7 / 7 / 1
Регистрация: 30.04.2012
Сообщений: 87
14.01.2014, 00:55  [ТС]     Вывод дампа памяти с нужного адреса #7
alsav22
Но у меня этот код прекрасно работает! Более того, ниже привожу вариант где ввожу переменную "k" для эксперимента, чтобы её увидеть по одному адресу и в дампе и вне дампа. Всё отлично! Память можно просматривать.
Как объяснить Ваш результат?
Изначальный вариант кода программы я взял из книги авторитетного автора В.Ю. Пирогова
“Ассемблер и дизассемблирование”. Ругать его программу не будем. Видимо, у Вас не с любого адреса можно вывести дамп.
Привожу обещанный выше интересный вариант кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//Два раза видим в памяти переменную "k"
//по одному адресу
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <windows.h>
 
int k=0x07;
int *ptrk=&k;
 
int _tmain(int argc, _TCHAR* argv[])
{     
    BYTE *b=(BYTE*)0x00417000;
    int j=0;
    printf("\n%p   ",b);
    for (int i=0; i<400; i++)    
    {
      printf("%02x  ",*(b++));
      if (++j==16&&i<398) {      
          printf("\n");
          j=0;
          printf("%p   ",b);    
        };
    };
    printf("\n");
    printf("\n");
    printf("\n");
    printf("Addres k:  %x",ptrk); //Адрес переменной k вне дампа
    _getch();       
    return 0;
}
На моём ПК компиляция проходит без ошибок и предупреждений.
Итак, очень Вам благодарен!
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.01.2014, 01:36     Вывод дампа памяти с нужного адреса #8
Цитата Сообщение от VlTag Посмотреть сообщение
Но у меня этот код прекрасно работает!
Из среды запускаете?

Добавлено через 5 минут
Цитата Сообщение от VlTag Посмотреть сообщение
Видимо, у Вас не с любого адреса можно вывести дамп.
У вас с любого? Например, с этого: 0x00416 ?
VlTag
7 / 7 / 1
Регистрация: 30.04.2012
Сообщений: 87
14.01.2014, 13:48  [ТС]     Вывод дампа памяти с нужного адреса #9
alsav22

1. Запускаю не из среды. Окно программы-среды сворачиваю и захожу в папку Projects, там нахожу нужную папку Solutionxxx со своим конкретным проектом и т.д. до папки Debug где находится файл *.exe. Его запускаю на исполнение.
2. С адреса 0x00416 дамп не распечатывается. Видимо, есть какие-то особенности, т.е. ограничения. Надо разобраться. Ниже привожу код с таким адресом, с которого у меня дамп выводится.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{     
    BYTE *b=(BYTE*)0x00416000;
    int j=0;
    printf("\n%p   ",b);
    for (int i=0; i<400; i++)    
    {
      printf("%02x  ",*(b++));
      if (++j==16&&i<398) {      
          printf("\n");
          j=0;
          printf("%p   ",b);    
        };
    };
 
    _getch();       
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2014, 14:05     Вывод дампа памяти с нужного адреса
Еще ссылки по теме:
C++ В оперативной памяти вектор int X[10] расположен, начиная с адреса B7F0
Вывод адреса символа в cout C++
реализация поиска нужного имени в файле и вывод данных, относящихся к этому имени C++
C++ Вывод адреса переменной типа char
C++ Вывод адреса по указателю на char в std::cout

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.01.2014, 14:05     Вывод дампа памяти с нужного адреса #10
Цитата Сообщение от VlTag Посмотреть сообщение
Видимо, есть какие-то особенности, т.е. ограничения. Надо разобраться.
Вот и я об этом же. Поэтому лучше, в коментариях к коду, не писать, что там может быть любой адрес.
Цитата Сообщение от VlTag Посмотреть сообщение
1. Запускаю не из среды.
А если из среды запустить?
Yandex
Объявления
14.01.2014, 14:05     Вывод дампа памяти с нужного адреса
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru