26 / 1 / 1
Регистрация: 27.06.2021
Сообщений: 72
1

Переменная без имени

21.06.2022, 01:18. Показов 1733. Ответов 10

Author24 — интернет-сервис помощи студентам
Добрый вечер. Создал я значит макрос с шелл-кодом(для структуры) сохранения всех регистров общего назначения x64, вот он:
C++
1
#define SaveAllRegistersX64 byte ANONIM_VAR1[24] = { 0x50, 0x53, 0x51, 0x52, 0x55, 0x54, 0x56, 0x57, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57 } /* push rax...r15 */
Эххх... жаль, что в x64 нет волшебного аналога(pushad|popad) , но не суть

Такой вопрос: есть-ли в c++ определенный синтаксис, который позволит мне не указывать названия(ANONIM_VAR1, ANONIM_VAR2 и т.д...), а просто вставить без именования этот шелл-код в мою структу.
В гугле видел, что для битовых полей такое присутствует, пример:
C++
1
2
3
struct Test {
    char : 2;
};
Я пытаюсь найти примерно тоже самое, только для моего случая, но увы - не нахожу.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.06.2022, 01:18
Ответы с готовыми решениями:

Загадочно - Переменная без имени
Сначала по мотивам того, что когда-то видел в сети, придумал вот такой CMD/Perl гибрид: ...

Переменная по имени
Привет всем. Вопрос наверное будет идиотский. Просто никогда не применял и не было необходимости....

Переменная случайного имени
Доброго времени суток! Подскажите, пожалуйста, как в матлабе можно задать случайную переменную?...

Переменная из имени папки
Есть папка1, в ней лежит папка2, в ней новая_папка_139, в ней python.py. Как скрипту узнать имя...

Переменная в имени элемента
Можно ли поместить переменную в название элемента? Например: textBox(p) - где на месте (p) была бы...

10
фрилансер
5860 / 5399 / 1105
Регистрация: 11.10.2019
Сообщений: 14,418
21.06.2022, 06:38 2
Shert, так что ли ?

C++
1
2
3
4
struct Test
{
    const char array[24]={ 0x50, 0x53, 0x51, 0x52, 0x55, 0x54, 0x56, 0x57, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57 }; /* push rax...r15 */
};
не очень понятно, зачем там (в примере) битовое поле
0
26 / 1 / 1
Регистрация: 27.06.2021
Сообщений: 72
21.06.2022, 06:57  [ТС] 3
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Shert, так что ли ?

C++
1
2
3
4
struct Test
{
    const char array[24]={ 0x50, 0x53, 0x51, 0x52, 0x55, 0x54, 0x56, 0x57, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57 }; /* push rax...r15 */
};
не очень понятно, зачем там (в примере) битовое поле
Не совсем: мне нужно определить без названия array. Чтобы в будущем я не плодил(array,array1,array2,array3...). И главное через макрос(для красоты ), пример - показал выше.
0
фрилансер
5860 / 5399 / 1105
Регистрация: 11.10.2019
Сообщений: 14,418
21.06.2022, 07:09 4
Цитата Сообщение от Shert Посмотреть сообщение
мне нужно определить без названия array
непонятно. А как его без названия использовать? И обычно такие вещи можно (и нужно) без макросов делать
0
Нарушающий
417 / 305 / 46
Регистрация: 13.04.2022
Сообщений: 1,759
21.06.2022, 08:00 5
Shert,

"\0x50\0x53\0x51\0x52.."
0
26 / 1 / 1
Регистрация: 27.06.2021
Сообщений: 72
21.06.2022, 11:35  [ТС] 6
Цитата Сообщение от QueryMonkey Посмотреть сообщение
Shert,

"\0x50\0x53\0x51\0x52.."
А поподробнее можно пожалуйста, не понял, какой синтаксис использовать, чтобы применить ваш ответ.

Добавлено через 3 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
И обычно такие вещи можно (и нужно) без макросов делать
Лин, ну ведь так структура более лаконичнее и читабельнее выглядит:
C++
1
2
3
4
#define SaveAllRegistersX64 byte ANONIM_VAR1[24] = { 0x50, 0x53, 0x51, 0x52, 0x55, 0x54, 0x56, 0x57, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57 } /* push rax...r15 */
struct Test {
    SaveAllRegistersX64;
};
Не знаю, что плохого в использовании макроса в моём случае, хотелось-бы услышать аргументацию, спасибо
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
21.06.2022, 13:31 7
Лучший ответ Сообщение было отмечено Shert как решение

Решение

Цитата Сообщение от Shert Посмотреть сообщение
хотелось-бы услышать аргументацию, спасибо
Принцип наименьшего удивления нарушается.

Я бы сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// один раз
template <unsigned char... C>
struct ShellCode {
    static inline const unsigned char value[] = { C... };
};
 
// где надо:
using SaveAllRegistersX64 = ShellCode<0x50, 0x53, 0x51, 0x52, 0x55, 0x54, 0x56, 0x57, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57>;
 
int main()
{
    SaveAllRegistersX64::value; // использование
}
2
26 / 1 / 1
Регистрация: 27.06.2021
Сообщений: 72
21.06.2022, 15:08  [ТС] 8
Цитата Сообщение от DrOffset Посмотреть сообщение
Принцип наименьшего удивления нарушается.

Я бы сделал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// один раз
template <unsigned char... C>
struct ShellCode {
    static inline const unsigned char value[] = { C... };
};
 
// где надо:
using SaveAllRegistersX64 = ShellCode<0x50, 0x53, 0x51, 0x52, 0x55, 0x54, 0x56, 0x57, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57>;
 
int main()
{
    SaveAllRegistersX64::value; // использование
}
Воу , спасибо - здорово вы написали inline то , что нужно!
0
4866 / 2664 / 914
Регистрация: 29.11.2010
Сообщений: 5,747
28.06.2022, 02:47 9
Цитата Сообщение от Shert Посмотреть сообщение
просто вставить без именования этот шелл-код в мою структу
Боюсь, что нет. В структуре вам всё равно понадобится объявить поле. Даже с хаком от уважаемого DrOffset.
Хак только спасёт вас от явного копирования значений, как в случае со статическим массивом.

Например так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
template <unsigned char... C>
struct ShellCode {
    static inline const unsigned char value[] = { C... };
};
 
// где надо:
using SaveAllRegistersX64 = ShellCode<0x50, 0x53, 0x51, 0x52, 0x55, 0x54, 0x56, 0x57, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57>;
 
struct SomeStruct {
    SaveAllRegistersX64 saveAllRegistersX64;
};
 
int main() {
    SaveAllRegistersX64;
 
    return 0;
}
2
26 / 1 / 1
Регистрация: 27.06.2021
Сообщений: 72
28.06.2022, 19:23  [ТС] 10
Цитата Сообщение от lemegeton Посмотреть сообщение
Боюсь, что нет. В структуре вам всё равно понадобится объявить поле. Даже с хаком от уважаемого DrOffset.
Хак только спасёт вас от явного копирования значений, как в случае со статическим массивом.

Например так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
template <unsigned char... C>
struct ShellCode {
    static inline const unsigned char value[] = { C... };
};
 
// где надо:
using SaveAllRegistersX64 = ShellCode<0x50, 0x53, 0x51, 0x52, 0x55, 0x54, 0x56, 0x57, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57>;
 
struct SomeStruct {
    SaveAllRegistersX64 saveAllRegistersX64;
};
 
int main() {
    SaveAllRegistersX64;
 
    return 0;
}
Понял вас, хорошо, учту
0
4866 / 2664 / 914
Регистрация: 29.11.2010
Сообщений: 5,747
28.06.2022, 22:51 11
Эм. Я тут подумал. Это не вставит последовательность байт в структуру.
Это даже указателя не вставит. Просто синтаксический сахар.

Можно проверить, что размер структуры гораздо меньше:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
template <unsigned char... C>
struct ShellCode {
    static inline const unsigned char value[] = { C... };
};
 
// где надо:
using SaveAllRegistersX64 = ShellCode<0x50, 0x53, 0x51, 0x52, 0x55, 0x54, 0x56, 0x57, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57>;
 
struct SomeStruct {
    SaveAllRegistersX64 saveAllRegistersX64;
};
 
int main() {
    std::cout << sizeof SaveAllRegistersX64() << std::endl;
 
    return 0;
}
Чтоб прям в структуру вставились байты, надо чутка модифицировать хак так, чтоб байты прям копировались.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
template <unsigned char... C>
struct ShellCode {
    const unsigned char value[sizeof...(C)];
    ShellCode() : value{C...} {}
};
 
// где надо:
using SaveAllRegistersX64 = ShellCode<0x50, 0x53, 0x51, 0x52, 0x55, 0x54, 0x56, 0x57, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57>;
 
struct SomeStruct {
    SaveAllRegistersX64 saveAllRegistersX64;
};
 
int main() {
    std::cout << sizeof SomeStruct() << std::endl;
 
    return 0;
}
Во. Теперь в структуре явно есть эти байты.

Добавлено через 10 минут
Если не хотите, чтоб они не были доступны, можно приватно наследоваться, но обретёте геморрой в локоть с виртуальным наследованием, если начнёте строить иерархии. Я предупредил.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
template <unsigned char... C>
struct ShellCode {
private:
    const unsigned char code[sizeof...(C)];
public:
    ShellCode() : code{C...} {}
};
 
// где надо:
using SaveAllRegistersX64 = ShellCode<0x50, 0x53, 0x51, 0x52, 0x55, 0x54, 0x56, 0x57, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57>;
 
struct SomeStruct : private SaveAllRegistersX64 {
};
 
int main() {
    SomeStruct x;
    std::cout << sizeof x << std::endl;
    return 0;
}
2
28.06.2022, 22:51
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.06.2022, 22:51
Помогаю со студенческими работами здесь

Переменная имени в smb
Когда заходишь в винде скажем на шару то можно сделать пусть типо //server/share/%username% И...

Переменная имени формы
Всем привет! Почему, если я в коде вместо имя формы использую переменную с её именем, то получаю...

Переменная в качестве имени файла
Прошу прощения за совсем ламерский вопрос. Нужно имени файла присвоить значение переменной, чтобы...

Переменная в имени файла ресурсов
НЕ нашел ответа в сети. Подскажите, пжлста, если так пишу pictureBox1.Image = Resources._1Boy;...

Переменная в качестве имени поля
Пытаюсь построить код для сравнения значения поля, вводимого пользователем с другими полями: Set...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как подключить JavaScript файл в другом JavaScript файле
InfoMaster 20.01.2025
В современной веб-разработке организация кодовой базы играет ключевую роль в создании масштабируемых и поддерживаемых приложений. Модульность и правильное структурирование кода стали неотъемлемыми. . .
Как откатить изменения в исходниках, не внесенные в Git
InfoMaster 20.01.2025
При работе с системой контроля версий Git разработчики часто сталкиваются с необходимостью отменить внесенные изменения в исходном коде. Особенно актуальной становится ситуация, когда изменения еще. . .
В чем разница между px, in, mm, pt, dip, dp, sp
InfoMaster 20.01.2025
В мире цифрового дизайна и разработки интерфейсов правильный выбор единиц измерения играет ключевую роль в создании качественного пользовательского опыта. История развития систем измерений для. . .
Как изменить адрес удалённого репозитория (origin) в Git
InfoMaster 20.01.2025
В терминологии Git термин origin является стандартным именем для основного удаленного репозитория, с которым взаимодействует локальная копия проекта. Когда разработчик клонирует репозиторий с. . .
Как переместить последние коммиты в новую ветку (branch) в Git
InfoMaster 20.01.2025
При работе над проектом часто возникают ситуации, когда необходимо изолировать определенные изменения от основной линии разработки. Это может быть связано с экспериментальными функциями, исправлением. . .
Как вернуть результат из асинхронной функции в JavaScript
InfoMaster 20.01.2025
Асинхронное программирование представляет собой фундаментальную концепцию в JavaScript, которая позволяет выполнять длительные операции без блокировки основного потока выполнения программы. В. . .
Какой локальный веб-сервер выбрать
InfoMaster 19.01.2025
В современной веб-разработке локальные веб-серверы играют ключевую роль, предоставляя разработчикам надежную среду для создания, тестирования и отладки веб-приложений без необходимости использования. . .
Почему планшеты и iPad уже не так популярны, как раньше
InfoMaster 19.01.2025
Эра революционных инноваций История планшетов началась задолго до того, как эти устройства стали привычными спутниками нашей повседневной жизни. В начале 1990-х годов появились первые прототипы,. . .
Как самому прошить BIOS ноутбука
InfoMaster 19.01.2025
BIOS (Basic Input/ Output System) представляет собой важнейший компонент любого компьютера или ноутбука, который обеспечивает базовое взаимодействие между аппаратным и программным обеспечением. . .
Какой Linux выбрать для домашнего компьютера
InfoMaster 19.01.2025
Современные реалии выбора операционной системы В современном мире выбор операционной системы для домашнего компьютера становится все более важным решением, которое может существенно повлиять на. . .
Как объединить два словаря одним выражением в Python
InfoMaster 19.01.2025
В мире программирования на Python работа со словарями является неотъемлемой частью разработки. Словари представляют собой мощный инструмент для хранения и обработки данных в формате "ключ-значение". . . .
Как без исключения проверить существование файла в Python
InfoMaster 19.01.2025
При разработке программного обеспечения на Python часто возникает необходимость проверить существование файла перед выполнением операций с ним. Это критически важная задача, которая помогает избежать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru