Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92

Цель прочитать память и вывести на экран

26.07.2009, 01:43. Показов 3706. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ имеется такой код. Цель прочитать память и вывести на экран(в учебных целях).
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
32
33
34
35
36
37
38
#include "windows.h"
#include <iostream>
 
using namespace std;
 
int main()
{
    int i;
    BOOL tr;
    const int Addr_Str1=0xB8004002;
    DWORD pId;
    HANDLE ProcHandle;
    char *str=(char*)0xB8004002;
    char st[12];
    str="Hello World";
    cout<<"Enter PID process"<<endl;
    cin>>i;
    if(i!=0)
    {
    pId=i;
    ProcHandle=OpenProcess(PROCESS_ALL_ACCESS, false, pId);
    tr=ReadProcessMemory(ProcHandle, (LPCVOID)(Addr_Str1), &st, 12, NULL);
        if(tr==0)
        {
           cout<<"\aFunction fail"<<endl;
           return -1;
        }
        else
        {
        cout<<st<<endl;
        }
    }
    else
    {
        return -1;
    }
    return 0;
}
Скажите почему не работает?
Результат работы: Function fail
PID процесса(этой же самой проги) беру с помощью утилиты Process Explorer(надеюсь PID выдает правильно?)
Может невозможно прочитать эту область памяти?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.07.2009, 01:43
Ответы с готовыми решениями:

Прочитать и вывести на экран файл
Здравствуйте, задали сделать такое: &quot;Есть текстовый файл больше 2х строк (у меня 8 строк), надо прочесть и вывести на экран&quot;. Самое...

Прочитать массив из файла и вывести на экран
Дело в том что, существует массив, который мы записали в файл, есть необходимость из файла прочитать и выдать на экран. НО мой метод,...

Открыть txt-файл, прочитать, вывести на экран
Помогите , не получается открыть .txt, прочитать, вывести на экран #include &lt;sysdefs.h&gt;//подключаю класс String библиотеки VCL ...

23
 Аватар для inter-admin
9715 / 6470 / 52
Регистрация: 06.03.2009
Сообщений: 28,500
26.07.2009, 01:49
Line 20: error: windows.h: No such file or directory
In function 'int main()':
Line 9: error: 'BOOL' was not declared in this scope
compilation terminated due to -Wfatal-errors.
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
26.07.2009, 03:03  [ТС]
Цитата Сообщение от inter Посмотреть сообщение
Line 20: error: windows.h: No such file or directory
In function 'int main()':
Line 9: error: 'BOOL' was not declared in this scope
compilation terminated due to -Wfatal-errors.
У меня не CLR проект, а Win32 Console Appllication, так что проблема с "windows.h" отсутствует и проект нормально компилится. А тип BOOL определен в "windows.h".
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
26.07.2009, 10:03
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
32
33
34
35
36
37
#include <windows.h>
#include <iostream>
 
using namespace std;
 
int main()
{
    DWORD   Addr_Str1=0xB8004002;
    DWORD   pId;
    HANDLE  ProcHandle;
    char    st[512];
    
    // забиваем 0 выходной буфер
    memset(st, '\0', sizeof(st));
    
    // вводим идентификатор процесса
    cout<<"Enter PID process"<<endl;
    cin>>pId;
    
    if(pId!=0)
    {
        // открываем
        if ((ProcHandle=OpenProcess(PROCESS_VM_READ, FALSE, pId)))
        {
            // читаем
            if(ReadProcessMemory(ProcHandle, (LPCVOID)(Addr_Str1), &st, sizeof(st), NULL))
            {
                // выводим
                cout<<st<<endl;
                return 0;
            }
        }
    }
    
    cout<<"\aFunction fail\n"<<endl;
    return -1;
}
0
7 / 7 / 1
Регистрация: 22.07.2009
Сообщений: 104
26.07.2009, 14:06
Чуваки, если st это массив а в данном случае это так, то так &st передавать нельзя. Надо писать

C++
1
ReadProcessMemory(ProcHandle, (LPCVOID)(Addr_Str1), (LPVOID)st, sizeof(st), NULL))

Ну или в крайнем случае &st[0], но это уже маразм.
Кроме того, вы читаете sizeof(st) байт в массив размеров sizeof(st). Ну оставьте же место для завершающего нуля.

Самое интересное что это тут не главное. Прежде чем делать такие штуки - писать читать память процессов, MSDN сильно рекомендует получить привелегию SeDebugPrivilege. Может в этом всё дело

Добавлено через 1 час 6 минут 3 секунды
Да собственно выводить байты считанные из памяти процесса на экран - не лучшая идея. Кто знает сколько там нулей
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
26.07.2009, 20:00  [ТС]
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
32
33
34
35
36
37
38
#include "windows.h"
#include <iostream>
 
using namespace std;
 
int main()
{
    int i;
    BOOL tr;
    const int Addr_Str1=0xB8004002;
    DWORD pId, lpBuf;
    HANDLE ProcHandle;
    char *str=(char*)0xB8004002;
    //char st[12];
    str="Hello World";
    cout<<"Enter PID process"<<endl;
    cin>>i;
    char sts[12];
    // забиваем 0 выходной буфер
    sts[12]='\0';
    char *st=sts;
 
    if(i>0)
    {
    pId=i;
    //ProcHandle=OpenProcess(PROCESS_ALL_ACCESS, false, pId);
    ProcHandle=OpenProcess(PROCESS_VM_READ, false, pId);
        if(ProcHandle==NULL)
        {
            cout<<"\aProcess cannot be read"<<endl;
            return -10;
        }
    tr=ReadProcessMemory(ProcHandle, (LPCVOID)(Addr_Str1), (LPVOID)st, 12, NULL);
    }
    //sprintf(st, "%d", lpBuf);
    cout<<st<<endl;
    return 0;
}
Выводит на экран что-то вроде "||||||||||" вместо ожидаемоего "HelloWorld".
Может PID процесса утилита ProcessExplorer не то выдает?
0
Любитель давать советы
 Аватар для Alexiski
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
26.07.2009, 20:54
Вот эта комбинация
C++
1
2
        char *str=(char*)0xB8004002;
        str="Hello World";
вовсе не загоняет строку "Hello World" по адресу B8004002.
Она всего лишь загоняет в str адрес этой строки, затирая результат инициализации.

Зачем вообще возиться с абсолютными адресами? Напишите, например
C++
1
const char * Addr_Str1 = "Hello World";
Добавлено через 4 минуты 58 секунд
Цитата Сообщение от resource Посмотреть сообщение
Кроме того, вы читаете sizeof(st) байт в массив размеров sizeof(st). Ну оставьте же место для завершающего нуля.
Вот это лишнее. Функции, работающие с памятью, не добавляют никакого завершающего нуля. Это ведь не работа со строками.
1
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
26.07.2009, 21:28
кста, вы знаете чему равно sizeof(st), если объявить char st[12];

логика подсказывает мне, что 4 или 8!
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
26.07.2009, 21:42  [ТС]
Цитата Сообщение от Lolcht0 Посмотреть сообщение
кста, вы знаете чему равно sizeof(st), если объявить char st[12];

логика подсказывает мне, что 4 или 8!
Под один символ char выделяется 1 байт=>под 12 символов 12 байтов

Добавлено через 4 минуты 24 секунды
const char * Addr_Str1 = "Hello World";
Ну, а если я не знаю что содержится по данному адресу, а знаю только адрес начала строки и хочу получить его значение.
В этом примере уже известно значение, что неприемлемо.
0
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
26.07.2009, 21:43
ну и что? st - указатель на массив. размер указателя - 4 в х86 и 8 в х64
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
26.07.2009, 21:48  [ТС]
Никто не ответит(
0
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
26.07.2009, 21:52
по этому адресу не записывается вообще ничего! это в str записывается новый адрес
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
26.07.2009, 21:58  [ТС]
Цитата Сообщение от Alexiski Посмотреть сообщение
Вот эта комбинация
C++
1
2
        char *str=(char*)0xB8004002;
        str="Hello World";
вовсе не загоняет строку "Hello World" по адресу B8004002.
Она всего лишь загоняет в str адрес этой строки, затирая результат инициализации.
Ничего не затирает результат инициализации также выводит "Hello World".

Добавлено через 4 минуты 33 секунды
Цитата Сообщение от Lolcht0 Посмотреть сообщение
ну и что? st - указатель на массив. размер указателя - 4 в х86 и 8 в х64
кста, вы знаете чему равно sizeof(st), если объявить char st[12];
логика подсказывает мне, что 4 или 8!
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
using namespace std;
 
int main()
{
    char st[12];
    cout<<sizeof(st)<<endl;
}
Выводит 12 что и доказывает ранее сказанное
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
 
using namespace std;
 
int main()
{
    char st[12];
    cout<<sizeof(&st)<<endl;
}
Вот тогда вывело бы 4, поскольку это уже ссылка
Сообщение от Alexiski
Вот эта комбинация
C++
1
2
        char *str=(char*)0xB8004002;
        str="Hello World";
вовсе не загоняет строку "Hello World" по адресу B8004002.
Она всего лишь загоняет в str адрес этой строки, затирая результат инициализации.
Да не загоняет по этому адресу, но и результат не затирает
1
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
26.07.2009, 22:08
C++
1
char * st = new st[12]
тоже вернул бы 4, почти наверняка
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
26.07.2009, 22:15  [ТС]
Цитата Сообщение от Lolcht0 Посмотреть сообщение
C++
1
char * st = new st[12]
тоже вернул бы 4, почти наверняка
Такая строка даже не скомипилилась бы, правильней
C++
1
char *st = new char[12];
В случае cout<<&st<<endl; //выводит адрес в формате 0x????????
В случае cout<<st<<endl; //выводит замангленную строку, поскольку неинициализированная строка
В случае cout<<sizeof(&st)<<" "<<sizeof(st)<<endl; //выводит действительно 4 и 4
0
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
26.07.2009, 22:24
В случае cout<<&st<<endl; //выводит адрес в формате 0x????????
В случае cout<<st<<endl; //выводит замангленную строку, поскольку неинициализированная строка
иии, что?
0
Любитель давать советы
 Аватар для Alexiski
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
27.07.2009, 00:42
Цитата Сообщение от Skirmisher Посмотреть сообщение
Да не загоняет по этому адресу, но и результат не затирает
Затирает результат инициализации - то есть значение str уже не будет равно 0xB8004002
0
45 / 45 / 1
Регистрация: 23.05.2009
Сообщений: 92
27.07.2009, 02:33  [ТС]
Цитата Сообщение от Alexiski Посмотреть сообщение
Затирает результат инициализации - то есть значение str уже не будет равно 0xB8004002
В книге Павловской "C/C++ Программирование на языке высокого уровня" сказано
что такой код
C++
1
char *vp=(char*)0xb80000ff;
является еще одним способом инициализации указателя, т.е. в этой области памяти должна находиться строка, а не 0xb80000ff, т.е. если потом указать
C++
1
2
3
char *vp=(char*)0xb80000ff;
vp="Hello World";
cout<<vp<<endl;
Будет выведено Hello World(сам проверял)
И значение нисколько не затирается.
0
Любитель давать советы
 Аватар для Alexiski
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
27.07.2009, 02:51
Цитата Сообщение от Skirmisher Посмотреть сообщение
Будет выведено Hello World(сам проверял)
И значение нисколько не затирается.
Значение чего не затирается? Строки - в этом я не сомневаюсь. А как насчет самой переменной vp?
Остановите этот кусок в отладчике и пройдите по шагам.
Вы увидите, что от значения 0xb80000ff, которое присвоилось при инициализации, в переменной vp ничего не остается.

С тем же успехом инициализацию можно вообще убрать.
C++
1
2
3
char *vp;
vp="Hello World";
cout<<vp<<endl;
Будет выведено Hello World, но это не имеет никакого отношения к тому, что я написал о Вашем коде. Вы используете именно этот непонятный физический адрес 0xB8004002, именно его передаете функции ReadProcessMemory и упорно не хотите услышать, что строки Hello World по этому адресу у Вас не окажется.
1
7 / 7 / 1
Регистрация: 22.07.2009
Сообщений: 104
27.07.2009, 06:05
вообще я не встречал ни одного компилятора который не способен был бы нормально обработать
Code
1
2
char str[12];
sizeof(str);
все выдают правильный размер массива а никакие там ни 4 и не 8.
Хотя сам я такой практикой не пользуюсь. Предпочитаю сделать так
C++
1
2
3
#define STR1_SZ 12
 
char str1[STR1_SZ];
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.07.2009, 06:05
Помогаю со студенческими работами здесь

Прочитать файл и вывести его содержимое на экран
Программа выводит нужный текст из программы. Ну при этом еще выдает ошибку, как ее убрать? .model small org 100h ...

Прочитать с экрана 3 числа и вывести их на экран в порядке возрастания
БРАТИЯ, ПОМОГИТЕ!!! Прочитать с экрана 3 числа и вывести их на экран в порядке возрастания!! ЭТО НАДО СДЕЛАТЬ С if else!! C++ ONLY!

Засунуть несколько картинок в файл, прочитать их и вывести на экран
Всем привет. На днях решил создать такую штучку для своей игры: Мне надоело, что пользователь может заменить картинки персоонажей, так как...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru