1 / 1 / 0
Регистрация: 28.10.2018
Сообщений: 102
1

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

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

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

Делаю движок для простой 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2019, 15:48
Ответы с готовыми решениями:

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

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

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

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

9
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
05.08.2019, 22:41 2
Цитата Сообщение от 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  [ТС] 3
Я это использую для смены параметров в игре.
мне для Си
Попробовал ваш пример, текст не меняется((
Есть еще способы?
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
06.08.2019, 06:48 4
Цитата Сообщение от Zero4 Посмотреть сообщение
Попробовал ваш пример, текст не меняется((
Показывайте код этого вашего Engine32.exe. Если "Делаю движок для простой MMO игры" означало "пытаюсь хакнуть чужой движок", то вы ошиблись форумом.
0
1 / 1 / 0
Регистрация: 28.10.2018
Сообщений: 102
06.08.2019, 06:56  [ТС] 5
Я же написал для чего мне нужно заменить текст.

Нашел такой пример, как его можно использовать?
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
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
06.08.2019, 06:58 6
Цитата Сообщение от Zero4 Посмотреть сообщение
Я же написал для чего мне нужно заменить текст.
Для текста кнопки в программе. Задается и меняется этот текст в коде программы. Вот и показывайте этот код. Если кода у вас нет, а есть только чужой exe-шник, так не надо заливать про то что вы пилите движок сами.
0
1 / 1 / 0
Регистрация: 28.10.2018
Сообщений: 102
06.08.2019, 07:56  [ТС] 7
Зачем оффтопить в теме? Если не желаете помочь, не помогайте.

Добавлено через 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
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,862
06.08.2019, 10:27 8
Цитата Сообщение от 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  [ТС] 9
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
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,862
06.08.2019, 12:03 10
Цитата Сообщение от Zero4 Посмотреть сообщение
Я правильно понимаю это должно быть так?
Мне-то откуда знать? Я вашего движка в глаза не видел.
Я привел пример как подсунуть функции разные строки: через переменную. Вообще-то, это первое, что рассматривается в учебниках.
А уж подходит ли оно именно к вашему движку и как именно нужно дорабатывать напильником - вам виднее.
0
06.08.2019, 12:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2019, 12:03
Помогаю со студенческими работами здесь

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

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

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

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

Заменить в данном предложении одну букву на другую
Помогите написать программы:1)Заменить в данном предложении всюду одну букву на другую. Компьютер...

Заменить в строке одну последовательность символов на другую
Всем привет. Напишите программу, которая заменяет во всей строке одну последовательность символов...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru