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

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

26.07.2009, 01:43. Показов 3626. Ответов 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,893
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru