Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 28.10.2018
Сообщений: 102

Memcpu заменить одну строку в памяти на другую

05.08.2019, 15:48. Показов 993. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Делаю движок для простой MMO игры, нужно научиться заменять строчки в памяти моей игры.
Например, есть в игре кнопка "Play" она используется для присоединения к матчу (в бой)
я хочу с помощью memcpu найти по String тексту эту строку и заменить скажем на InGame (в игре)
Я просто не знаю как это должно правильно работать в памяти запущенно приложения.

Примерно представляю себе это так

C++
1
2
3
4
#define InGame *"Play"
#define Play *"InGame"
memcpy (InGame, replace); 
memcpy (Play, replace);
Если будет проще через MemProcessWrite, тоже напишите.

Добавлено через 14 минут
Все же я думаю WriteProcess лучше работает.

Только как его правильно использовать для замены я не понимаю

C++
1
2
3
DWORD Engine = (DWORD)GetModuleHandle("Engine32.exe");
MEMwrite((DWORD*)(Engine), (int*)(CHAR)"Play", 1);
MEMwrite((DWORD*)(Engine), (int*)(CHAR)"InGame", 1);
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.08.2019, 15:48
Ответы с готовыми решениями:

Заменить в файле одну строку на другую
Дан символьный файл f. Написать программу, которая каждую букву "б" в файле f заменяет сочетанием "ку". unit Program1; ...

Заменить в файле одну строку на другую
Реализовать в программе функцию замену в текстовом файле заданной строки на другую строку, также задаваемую с клавиатуры.

Патчер: заменить в приложении одну строку на другую
Код работает привосходно! procedure TForm6.Button1Click(Sender: TObject); var tf:TFileStream; t:AnsiString; i:integer; ...

9
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
05.08.2019, 22:41
Цитата Сообщение от Zero4 Посмотреть сообщение
я хочу с помощью memcpu найти по String тексту эту строку и заменить скажем на InGame (в игре)
1) Нафига вам что-то искать в собственном приложении?
2) Так вам на Си или плюсах?
C
1
2
3
4
5
6
7
8
int main()
{
    char str[128]="Play";
    printf("%s\n",str);
    strcpy(str,"Go!");
    printf("%s\n",str);
    return 0;
}
C++
1
2
3
4
5
6
7
8
int main()
{
    std::string str="Play";
    std::cout<<str<<std::endl;
    str="Go!";
    std::cout<<str<<std::endl;
    return 0;
}
0
1 / 1 / 0
Регистрация: 28.10.2018
Сообщений: 102
06.08.2019, 06:46  [ТС]
Я это использую для смены параметров в игре.
мне для Си
Попробовал ваш пример, текст не меняется((
Есть еще способы?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.08.2019, 06:48
Цитата Сообщение от Zero4 Посмотреть сообщение
Попробовал ваш пример, текст не меняется((
Показывайте код этого вашего Engine32.exe. Если "Делаю движок для простой MMO игры" означало "пытаюсь хакнуть чужой движок", то вы ошиблись форумом.
0
1 / 1 / 0
Регистрация: 28.10.2018
Сообщений: 102
06.08.2019, 06:56  [ТС]
Я же написал для чего мне нужно заменить текст.

Нашел такой пример, как его можно использовать?
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
char* getMem(char* buff, size_t buffLen, int from, int to)
{
    
    size_t ourSize = buffLen * 2;
    char* ret = (char*)malloc(ourSize);
 
    memset(ret, 0, ourSize);
 
    memcpy(ret, &buff[from], buffLen - from);
    memset(&ret[to - from], 0, to - from);
 
    return ret;
}
 
char* delMem(char* buff, size_t buffLen, int from, int to)
{
    /*
    Освобождаем память.
    */
    size_t ourSize = buffLen * 2;
    char* ret = (char*)malloc(ourSize);
    int i, x = 0;
 
    memset(ret, 0, ourSize);
 
    for (i = 0; i < buffLen; i++) {
        if (!(i >= from && i < to)) {
            ret[x] = buff[i];
            x++;
        }
    }
 
    return ret;
}
 
char* addMem(char* buff, size_t buffLen, char* buffToAdd, size_t addLen, int addFrom)
{
    /*
    Запись в память.
    */
    size_t ourSize = (buffLen + addLen) * 2;
    char* ret = (char*)malloc(ourSize);
    int i, x = 0;
 
    memset(ret, 0, ourSize);
 
    memcpy(ret, getMem(buff, buffLen, 0, addFrom), addFrom);
 
    x = 0;
    for (i = addFrom; i < addLen + addFrom; i++) {
        ret[i] = buffToAdd[x];
        x++;
    }
 
    x = 0;
    for (i; i < addFrom + buffLen; i++) {
        ret[i] = buff[addFrom + x];
        x++;
    }
 
    return ret;
}
 
char* replaceMem(char* buff, size_t buffLen, int from, int to, char* replaceBuff, size_t replaceLen)
{
    /*
    Заменяем найденную "строку" на свою.
    */
    size_t ourSize = (buffLen) * 2;
    char* ret = (char*)malloc(ourSize);
 
    memset(ret, 0, ourSize);
 
    memcpy(ret, buff, buffLen); // copy 'buff' into 'ret'
 
    ret = delMem(ret, buffLen, from, to); // delete all memory from 'ret' betwen 'from' and 'to'
    ret = addMem(ret, buffLen - to + from, replaceBuff, replaceLen, from);
 
    return ret;
}
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.08.2019, 06:58
Цитата Сообщение от Zero4 Посмотреть сообщение
Я же написал для чего мне нужно заменить текст.
Для текста кнопки в программе. Задается и меняется этот текст в коде программы. Вот и показывайте этот код. Если кода у вас нет, а есть только чужой exe-шник, так не надо заливать про то что вы пилите движок сами.
0
1 / 1 / 0
Регистрация: 28.10.2018
Сообщений: 102
06.08.2019, 07:56  [ТС]
Зачем оффтопить в теме? Если не желаете помочь, не помогайте.

Добавлено через 55 минут
Актуально!

Нужна помощь с этим примером.

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
char* getMem(char* buff, size_t buffLen, int from, int to)
{
    
    size_t ourSize = buffLen * 2;
    char* ret = (char*)malloc(ourSize);
 
    memset(ret, 0, ourSize);
 
    memcpy(ret, &buff[from], buffLen - from);
    memset(&ret[to - from], 0, to - from);
 
    return ret;
}
 
char* delMem(char* buff, size_t buffLen, int from, int to)
{
    /*
    Освобождаем память.
    */
    size_t ourSize = buffLen * 2;
    char* ret = (char*)malloc(ourSize);
    int i, x = 0;
 
    memset(ret, 0, ourSize);
 
    for (i = 0; i < buffLen; i++) {
        if (!(i >= from && i < to)) {
            ret[x] = buff[i];
            x++;
        }
    }
 
    return ret;
}
 
char* addMem(char* buff, size_t buffLen, char* buffToAdd, size_t addLen, int addFrom)
{
    /*
    Запись в память.
    */
    size_t ourSize = (buffLen + addLen) * 2;
    char* ret = (char*)malloc(ourSize);
    int i, x = 0;
 
    memset(ret, 0, ourSize);
 
    memcpy(ret, getMem(buff, buffLen, 0, addFrom), addFrom);
 
    x = 0;
    for (i = addFrom; i < addLen + addFrom; i++) {
        ret[i] = buffToAdd[x];
        x++;
    }
 
    x = 0;
    for (i; i < addFrom + buffLen; i++) {
        ret[i] = buff[addFrom + x];
        x++;
    }
 
    return ret;
}
 
char* replaceMem(char* buff, size_t buffLen, int from, int to, char* replaceBuff, size_t replaceLen)
{
    /*
    Заменяем найденную "строку" на свою.
    */
    size_t ourSize = (buffLen) * 2;
    char* ret = (char*)malloc(ourSize);
 
    memset(ret, 0, ourSize);
 
    memcpy(ret, buff, buffLen); // copy 'buff' into 'ret'
 
    ret = delMem(ret, buffLen, from, to); // delete all memory from 'ret' betwen 'from' and 'to'
    ret = addMem(ret, buffLen - to + from, replaceBuff, replaceLen, from);
 
    return ret;
}
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
06.08.2019, 10:27
Цитата Сообщение от Zero4 Посмотреть сообщение
C
1
2
/* Освобождаем память. */
char* ret = (char*)malloc(ourSize);
Где ж тут освобождение памяти?
Цитата Сообщение от Zero4 Посмотреть сообщение
Нужна помощь с этим примером.
А что с ним не так? На первый взгляд он не соответствует описанию из первого поста, в нем нет ни объявления строк, ни использования.
Цитата Сообщение от Zero4 Посмотреть сообщение
C
1
2
3
DWORD Engine = (DWORD)GetModuleHandle("Engine32.exe");
MEMwrite((DWORD*)(Engine), (int*)(CHAR)"Play", 1);
MEMwrite((DWORD*)(Engine), (int*)(CHAR)"InGame", 1);
Если говорить об этом примере, вообще непонятно зачем memcpy. Берете указатель и меняете его:
C
1
2
3
4
5
6
const char *btn_names[] = {"Name1", "Name2", "Name3"};
char *btn_name = btn_names[0];
MEMwrite((DWORD*)(Engine), (int*)(CHAR)btn_name, 1);
...
btn_name = btn_names[2];
MEMwrite((DWORD*)(Engine), (int*)(CHAR)btn_name, 1);
Уж под свой движок сами перепишете, вы же его писали.
1
1 / 1 / 0
Регистрация: 28.10.2018
Сообщений: 102
06.08.2019, 10:59  [ТС]
COKPOWEHEU, спасибо!
То что нужно.
Я правильно понимаю это должно быть так?

C++
1
2
3
4
5
6
DWORD Engine = (DWORD)GetModuleHandle("Engine32.exe");
char* btn_names[] = { "Play", "InGame"};
char* btn_name = btn_names[0];
MEMwrite((DWORD*)(Engine), (int*)(CHAR)btn_name, 1);
btn_name = btn_names[2];
MEMwrite((DWORD*)(Engine), (int*)(CHAR)btn_name, 1);
Т.е мы заменяем Play на InGame.
ну и почему то в вашем примере ругается на const char, я заменил на char
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,922
06.08.2019, 12:03
Цитата Сообщение от Zero4 Посмотреть сообщение
Я правильно понимаю это должно быть так?
Мне-то откуда знать? Я вашего движка в глаза не видел.
Я привел пример как подсунуть функции разные строки: через переменную. Вообще-то, это первое, что рассматривается в учебниках.
А уж подходит ли оно именно к вашему движку и как именно нужно дорабатывать напильником - вам виднее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.08.2019, 12:03
Помогаю со студенческими работами здесь

Создать строку, состоящую из символов, которые входят как в одну, так и в другую строку (не string-ом)
Условие: Заданы две строки. Построить новую строку, состоящую из символов, которые входят как в одну, так и в другую строку Здесь я...

Заданы две строки. Построить новую строку, состоящую из символов, которые входят как в одну, так и в другую строку
Прошу помощи!

Заменить одну часть строки на другую
Доброго всем дня помогите решить проблему В Word с помощью записи макросов записал действие замещающее одну часть строки на другую часть...

Заменить в предложении одну букву на другую
2) Заменить в предложении одну букву на другую (их значения вводить с клавиатуры).

Заменить в строке одну последовательность символов на другую
Нужно ввести строку, создать вторую из символов первой, заменив каждую последовательность символов &quot;xyz&quot; заменить на...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru