С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Regxbrjd
1 / 1 / 0
Регистрация: 04.05.2013
Сообщений: 29

Как осуществить правильный ввод из консоли в виде шестнадцатеричных данных

08.03.2025, 22:53. Показов 2304. Ответов 7

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток, здесь присутствующим !

Есть необходимость читать значение из памяти внешних процессов

Нашел простенький код вроде бы, и как бы работает


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
#include <iostream>
#include <Windows.h>
 
using namespace std;
 
int main(){
 
    int readTest = 0; // We store the Value we read from the Process here
 
    HWND hwnd = FindWindowA(NULL, "Tutorial-x86_64"); // HWND (Windows window) by Window Name
 
    // Check if HWND found the Window
    if (hwnd == NULL) {
        cout << "Can't find Process." << endl;
        Sleep(2000); // Sleep 2 seconds
        exit(-1); // Exit the program if it did not find the Window
    } else {
        DWORD procID; // A 32-bit unsigned integer, DWORDS are mostly used to store Hexadecimal Addresses
        GetWindowThreadProcessId(hwnd, &procID); // Getting our Process ID, as an ex. like 000027AC
        HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID); // Opening the Process with All Access
 
        if (procID == NULL) {
            cout << "Can't find Process." << endl;
            Sleep(2000); // Sleep 2 seconds
            exit(-1); // Exit the program if it did not find the Window
        } else {
            // Read the Process Memory, 03007640 is the Address, we read the Value from and save it in readTest
            ReadProcessMemory(handle, (PBYTE*)0x03007640, &readTest, sizeof(readTest), 0);
            cout << readTest << endl;
            Sleep(5000); // Sleep 5 seconds
        }
    }
}
И вот какая суть, что указывать на адрес в памяти было бы приятнее из командной оболочки через cin

C++
1
cin >> byteAddressMemory;




Вот интересный участок где указан к примеру адрес 0x03007640, сделать так чтобы вносить свой адрес через cin в таком же формате в переменную, а далее использовать эту переменную в функции ReadProcessMemory( чтения памяти )

C++
1
ReadProcessMemory(handle, (PBYTE*)0x03007640, &readTest, sizeof(readTest), 0);


PSS:
Когда начал искать описание функции ReadProcessMemory принимает как я понял она в виде LPCVOID, что и как не понимаю
C++
1
2
3
4
5
6
7
BOOL ReadProcessMemory(
  [in]  HANDLE  hProcess,
  [in]  LPCVOID lpBaseAddress,
  [out] LPVOID  lpBuffer,
  [in]  SIZE_T  nSize,
  [out] SIZE_T  *lpNumberOfBytesRead
);
Я ещё учусь, мало толком знаю, если мне ещё пояснить как это работает, был бы преумножайше благодарен. Спасибо !

0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.03.2025, 22:53
Ответы с готовыми решениями:

Как правильно создать двумерный массив указателей с использованием calloc? и ввод данных в него
Как правильно создать двумерный массив указателей с использованием calloc и ввести в него данные?

Как прекратить ввод данных из консоли
Программа должна считывать пары точек (x, y), но заранее не известно количество пар. Как сделать так, чтобы ввод прекратился после ввода...

Как организовать ввод в консольную строку даты в виде: dd/mm/yyyy
Подскажите, кто знает как организовать ввод в консольную строку даты в виде: dd/mm/yyyy. Чтобы потом можно было считать переменные day,...

7
Заблокирован
08.03.2025, 23:47
C++
1
std::cin >> std::hex >> hexval;
Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <cstdint>
 
int main(){
   uintptr_t hex_address; // переменная со значением адреса
   std::cin >> std::hex >> hex_address;
   void* ptr = (void*)hex_address; // указатель
   std::cout << std::hex << ptr;
 
}
3
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
09.03.2025, 00:56
Лучший ответ Сообщение было отмечено Regxbrjd как решение

Решение

Цитата Сообщение от Regxbrjd Посмотреть сообщение
сделать так чтобы вносить свой адрес через cin в таком же формате в переменную
Смотря что именно вам нужно. Заставить пользователя использовать шестнадцатеричный формат или предоставить ему возможность использовать шестнадцатеричный формат?

Ввод через

C++
1
std::cin >> std::hex >> byteAddressMemory;
заставит пользователя всегда использовать именно шестнадцатеричный формат. То есть любой ввод будет трактоваться как шестнадцатеричный. При этом префикс 0x во вводе допускается, но не обязателен.

А вот ввод через

C++
1
2
std::cin.unsetf(std::ios::basefield);
std::cin >> byteAddressMemory;
даст пользователю возможность по его желанию вводить десятичную, восьмеричную или шестнадцатеричную запись. Интерпретация ввода будет завиcеть от префикса, то есть для шестнадцатеричного формата нужно будет писать префикс 0x.
2
Злостный нарушитель
 Аватар для Verevkin
10246 / 5673 / 1262
Регистрация: 12.03.2015
Сообщений: 26,285
09.03.2025, 08:20
Цитата Сообщение от Regxbrjd Посмотреть сообщение
Когда начал искать описание функции ReadProcessMemory принимает как я понял она в виде LPCVOID, что и как не понимаю
Это
C++
1
const void*
1
 Аватар для Regxbrjd
1 / 1 / 0
Регистрация: 04.05.2013
Сообщений: 29
09.03.2025, 11:44  [ТС]
Огромное вам всем спасибо, все заработало, вооружился сначала примером от гуру TheCalligrapher и сразу все заработало.

C++
1
std::cin >> std::hex >> byteAddressMemory;
Предварительно для функции в ReadProcessMemory параметр lpBaseAddress использовал переменную byteAddressMemory которую прежде объявил как тип long long далее использовал её совместно с (PBYTE*) уже в самой функции ReadProcessMemory как (PBYTE*)byteAdressMemory

C++
1
2
3
4
5
6
7
8
long long byteAdressMemory;
 
cout << "Adress memory: ";
cin >> hex >> byteAdressMemory;
 
ReadProcessMemory(handle, (PBYTE*)byteAdressMemory, &readTest, sizeof(readTest), 0);
 
cout << readTest << endl;

PSS: В дальнейшем изучу по необходимость остальные варианты ответов и как они работают
еще один момент был, я не знал какой тип мне было объявить в переменную byteAdressMemory сперва попробовал как DWORD потом long long в силу того что я плохо в этом направлении соображаю, все методом тыка и перебором испытываю


Может кому пригодиться эта портянка, по ID процесса и Адресу в памяти выводить значение на экран.
Собран из всяких кусков этот Франкенштейн поэтому как есть комментарии авторов остаются
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 <iostream>
#include <Windows.h>
 
using namespace std;
 
int main()
{
    int readTest = 0;  // Здесь будет сохранено значение, прочитанное из процесса
    
    cout << "ID Process: ";
    
    int idprocess = 0;
    
    cin >> idprocess;
    
    DWORD procID = (DWORD)idprocess;  //Перевести значение переменной idprocess типа INT в переменную procID типа DWORD 
    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);  // Открытие процесса со всеми правами
    
    if (procID == NULL)
    {
        cout << "Can't find Process." << endl;
        
        Sleep(2000);  // Спать 2 секунды
        exit(-1);  // Выйти из программы, если она не нашла процесс
    }
    else
    {
        long long byteAdressMemory;
 
        cout << "Adress memory: ";
        cin >> hex >> byteAdressMemory;
 
        ReadProcessMemory(handle, (PBYTE*)byteAdressMemory, &readTest, sizeof(readTest), 0);
 
        cout << readTest << endl;
        Sleep(5000); // Sleep 5 seconds
    }
}
~~~ В дальнейшем попытка передавать это значение по виртуальному serial порту во внешнее устройство к примеру как на контроллер-платформа Arduino, уверен что снова к вам вернусь
0
фрилансер
 Аватар для Алексей1153
6446 / 5641 / 1128
Регистрация: 11.10.2019
Сообщений: 15,007
09.03.2025, 11:52
Цитата Сообщение от Regxbrjd Посмотреть сообщение
я не знал какой тип мне было объявить в переменную byteAdressMemory
я бы выбрал size_t

Цитата Сообщение от Regxbrjd Посмотреть сообщение
ReadProcessMemory(handle, (PBYTE*)byteAdressMemory
а тут вот так
Цитата Сообщение от Regxbrjd Посмотреть сообщение
ReadProcessMemory(handle, (LPCVOID)byteAdressMemory
1
 Аватар для Regxbrjd
1 / 1 / 0
Регистрация: 04.05.2013
Сообщений: 29
09.03.2025, 12:20  [ТС]
Спасибо, вот этот момент меня тоже интересовал, представления хотя бы буду иметь как с этим работать, в дальнейшем также испытаю
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12930 / 6798 / 1820
Регистрация: 18.10.2014
Сообщений: 17,205
09.03.2025, 12:41
Цитата Сообщение от Regxbrjd Посмотреть сообщение
Предварительно для функции в ReadProcessMemory параметр lpBaseAddress использовал переменную byteAddressMemory которую прежде объявил как тип long long [...] я не знал какой тип мне было объявить в переменную byteAdressMemory
В ответе SmallEvil как раз использован правильный тип: std::uintptr_t.

В системе превдонимов типов WinAPI тип с аналогичной функцией: DWORD_PTR. Или UINT_PTR, ULONG_PTR и т.п.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.03.2025, 12:41
Помогаю со студенческими работами здесь

Как правильно заменить ввод данных простой на ввод с клавиатуры?
#include &quot;stdafx.h&quot; #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR* argv) ...

Как подключить к виджету консоль, чтобы там вводить данные?
как подключить к виджету консоль, чтобы в там вводить данные?

Как правильно вызвать конструктор вектора в данном случае?
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;map&gt; #include &lt;vector&gt; #include &lt;string&gt; using namespace std; typedef...

Как осуществить неограниченный ввод в консоль?
Необходимо вводить в консоль случайное количество чисел разделенные пробелом, например: 2 10 11 9 Как это осуществить? Обычный cin не...

Прилетают данные UTF-8, как правильно преобразовать в читабельный вид?
Как преобразовать вот это: cout &lt;&lt; buf&lt;&lt;endl; Выдает в UTF-8 кодировке: 01%3Aasd+%D0%92%D0%B0%D1%81%D0%B8%D0%BB%D0%B8%D0%B9 ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru