Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467

Управление памятью в чужом процессе используя его апи

16.07.2016, 20:52. Показов 2037. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
За пару дней с++ не со многими вещами разобрался, поэтому мог написать местами глупости.
Суть:
Внедряю dll(сплайсинг).
Некоторые функции, экспортируемые из одной dll, процессом, типа этой
C++
1
void __thiscall UNetworkHandler::RequestMagicSkillUse(UNetworkHandler *this, struct L2ParamStack *)
требуют в качестве параметра некий L2ParamStack.

И тут трудности - что бы её корректно заюзать, нужно пихнуть некий L2ParamStack.
В соседней экспортируемой dll нашлись методы для работы с ней
C++
1
2
3
4
public: __thiscall L2ParamStack::L2ParamStack(int)
_DWORD __thiscall L2ParamStack::~L2ParamStack(L2ParamStack *__hidden this)
__int64 __thiscall L2ParamStack::Top(L2ParamStack *__hidden this)
int __thiscall L2ParamStack::PushBack(L2ParamStack *this, __int64)
и прочие.

Вопрос первый - как корректно выделить память?
Использую
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        typedef L2ParamStack* (__fastcall *t_l2paramstack_constructor)(void*/*ecx - this*/, int/*edx - any*/, int/*parameter*/);
    static t_l2paramstack_constructor _create = NULL;
    L2ParamStack* Create() {
 
        if (_create == NULL) {
            HMODULE handle = GetModuleHandle(L"core.dll");
            (FARPROC &)_create = GetProcAddress(handle, LPS_CREATE_HF);
        }
 
        L2ParamStack *result = new char[16];
        _create(result, 0, 0x0a);
 
        return result;
    }
Не совсем понимаю зачем, я так делаю D
Что делает экспортируемый конструктор не могу понять... Вроде же не моя ответственность выделять память под указатель, да еще и неизвестного размера.
Если функцию t_l2paramstack_constructor определить как возвращающую указатель, то она что то возвращает (а может быть какой то мусор, бывший в регистрах(или в стеке?)), но дело от этого не меняется.

Но при этом, используя другие методы класса, я могу применять их к любому указателю, и вроде даже работает (после вызова Clear, правда, врядли так должно быть). Я собираю стек аргументов и могу их "скормить" нужной функции.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    int Top(L2ParamStack *self) {
        if (_top == NULL) {
            HMODULE handle = GetModuleHandle(L"core.dll");
            (FARPROC &)_top = GetProcAddress(handle, LPS_TOP_HF);
        }
 
        return _top(self);
    }
 
    void PushBack(L2ParamStack *self, int val) {
        if (_pushBackInt == NULL) {
            HMODULE handle = GetModuleHandle(L"core.dll");
            (FARPROC &)_pushBackInt = GetProcAddress(handle, LPS_PUSHBACK_INT_HF);
        }
 
        _pushBackInt(self, 0, val);
    }

Но самая главная проблема - как мне потом корректно освободить память? Применяя

C++
1
2
3
4
5
6
7
8
    void Free(L2ParamStack *self) {
        if (_free == NULL) {
            HMODULE handle = GetModuleHandle(L"core.dll");
            (FARPROC &)_free = GetProcAddress(handle, LPS_FREE_HF);
        }
 
        _free(self);
    }
self* не становится nil. используя оператор delete происходит Heap Corruption.
Аналогичное происходит при попытке освободить память в теле хука функции с таким аргументом (а он туда попадает извне, правильно инициализированный).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.07.2016, 20:52
Ответы с готовыми решениями:

Создание потока в чужом процессе
Здравствуйте. У меня беда, полтергейст, не знаю даже что, 5-й день уже не могу ничего сделать, помогите пожалуйста, может кто на свежий...

Перехват нажатия клавиш в чужом процессе
Пишу трейнер для игры и мне нужно что-бы при нажатии в игре например F1 вызывалась нужная мне функция которая выполняет определенные...

Изменить значения по заданному адресу в чужом процессе
почему не работает не меняет значения нужно менять значения по адресу 5E02C0 на 2 var buf : Integer; hWnd, PID, hProc, wSize :...

4
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
17.07.2016, 13:21
Обязательно выделять память динамически? И сколько выделять, если ты ни размер объекта не знаешь, ни его назначение.
1
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
17.07.2016, 18:31  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Обязательно выделять память динамически? И сколько выделять, если ты ни размер объекта не знаешь, ни его назначение.
Статическое выделение так же не дало результатов.

Единственное чего не могу понять - разве конструктор не должен выделить память сам? Тогда размер мне знать ни к чему, т.к. все нужные для работы методы экспортируются и мне достаточно указателя.

Вообщем то, решил проблему выделяя память с помощью HeapAlloc() и освобождением соответствующим методом.
Работает корректно, вроде как.

C++
1
2
3
4
5
6
7
8
9
10
11
    L2ParamStack *Create() {
        L2ParamStack *result = HeapAlloc(GetProcessHeap(), 8, 20);
        _create(result);
        return result;
    }
 
    void Free(L2ParamStack *self) {
        _free(self);
 
        HeapFree(GetProcessHeap(), 8, self);
    }
Остался лишь вопрос с размером выделяемой памяти.
Поидее, выделить я могу заведомо больше чем нужно, ведь методы этого объекта будут использовать равно столько памяти, сколько необходимо(а значит не тронут память за пределами), так ведь?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
17.07.2016, 20:07
Конструктор может выделять память только для внутренних объектов, если они есть. А так будет внешний new вместе с конструктором.
Ну наверное, выделение с запасом возможно.
А что работает-то? Именно эта часть или всё? Что за int передаётся в конструктор?
0
139 / 139 / 53
Регистрация: 14.06.2016
Сообщений: 467
17.07.2016, 20:42  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
А что работает-то? Именно эта часть или всё? Что за int передаётся в конструктор?
Да всё работает(и работало, впринципе, вот только при попытке освободить память используя delete - процесс критовал).

int - трудно сказать, судя по названию класса - может быть глубина.
В конструкторе по умолчанию 10.
Assembler
1
2
3
4
5
6
7
.text:15004DF0 ; public: void __thiscall L2ParamStack::`default constructor closure'(void)
.text:15004DF0                 public ??_FL2ParamStack@@QAEXXZ
.text:15004DF0 ??_FL2ParamStack@@QAEXXZ proc near      ; DATA XREF: .rdata:off_150C4DD8o
.text:15004DF0                 push    0Ah
.text:15004DF2                 call    ??0L2ParamStack@@QAE@H@Z ; L2ParamStack::L2ParamStack(int)
.text:15004DF7                 retn
.text:15004DF7 ??_FL2ParamStack@@QAEXXZ endp
Его сейчас и использую.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.07.2016, 20:42
Помогаю со студенческими работами здесь

Установить защиту памяти в чужом процессе на запись
Делаю трейнер для игры. Мне нужно по определенному адресу памяти установить разрешение на запись.

Нужна помощь в получении base address DLL в чужом процессе.
Что то странное с форумом происходит, слово "помощь" вызывает какую-то ошибку :O_O: WriteProcessMemory(prohandle,...

Directx рисование в чужом x64 процессе; Hex опкоды в ассемблер
Добрый вечер. Я замечал, что такие темы уже имеются на форуме и на других тоже, но все они сводятся к Detours. В моем случае решение...

Как закрыть поток в чужом процессе зная адрес этого потока
Здравствуйте, я хочу закрыть поток в чужом процессе зная адрес потока (test.dll!test001+0x60520), как это можно сделать ?? Заранее...

Как закрыть поток в чужом процессе зная адрес этого потока
Здравствуйте, я хочу закрыть поток в чужом процессе зная адрес потока (test.dll!test001+0x60520), как это можно сделать ?? PS: В...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru