Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 18.08.2012
Сообщений: 4

Неправильно записываются значения в память функцией ptrace()

18.08.2012, 04:27. Показов 1359. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я под линукс писать только учусь, поэтому пишу, можно сказать, все, что под руку попадется, вот и взялся читер для игрушек писать по типу artmoney под виндой.
В общем, ситуация такая: я решил, для начала, попробовать, как оно все работает: чтение и запись в память другого процесса, но без особых наворотов в пробном варианте.
Написал простенькую прогу, которую потом трассирую, и другую, которой выполняю трассировку, но тут неожиданная проблема появилась: вычитываю я значения из трассируемого процесса корректно, зато пишется туда совсем не то что я хотел.
Помогите пожалуйста разобраться, что не так.
Вот исходник трассируемого процесса
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
#include <cstdlib>
#include <stdlib.h>
#include <iostream>
 
using namespace std;
 
/*
 * 
 */
int main(int argc, char** argv)
{
    char ch='i';
    //искомое значение храню в куче
    int *int_ptr=new int;
    int *tmp_ptr=0;
    int tmp_int=0;
    while(ch!='q'&&ch!='Q')
    {
        switch(ch)
        {
            case 'i':
            case 'I':
                system("clear");
                cout<<"Введите значение переменной int_ptr:";
                cin>>(*int_ptr);
                break;
            case 'c':
            case 'C':
                system("clear");
                cout<<"int_ptr="<<(*int_ptr)<<" адрес int_ptr:"<<int_ptr<<endl;
                break;
            case 's':
            case 'S':
                system("clear");
                cout<<"Введите смещение :";
                cin>>tmp_int;
                tmp_ptr=(int*)((unsigned long)int_ptr+tmp_int);
                cout<<"*tmp_ptr="<<*tmp_ptr<<"tmp_ptr="<<(unsigned long)tmp_ptr<<endl;
                cout<<"*int_ptr="<<*int_ptr<<"int_ptr="<<(unsigned long)int_ptr<<endl;
                break;
        }
        //system("clear");
        cout<<"i - ввести новое значение перемнной"<<endl;
        cout<<"c - вывести на экран текущее значение переменной"<<endl;
        cout<<"s - обшаривание оперативки"<<endl;
        cout<<"q - выход"<<endl;
        cin>>ch;
    }
    delete int_ptr;
    return 0;
}
А вот трассирующий, заранее прошу прощения за бардак, просто очень долго его мурыжу многое расплылось до неузнаваемости.
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include "get_range.h"
#include "searching_tips.h"
#include <iostream>
#include <fstream>
#include <string>
#include <sys/ptrace.h>
#include <sys/wait.h>
#define ULONG unsigned long
 
 
/*
 * 
 */
int main(int argc, char** argv)
{
    
    using std::cout;
    using std::cin;
    using std::endl;
    using std::ifstream;
    using std::string;
    using std::stringstream;
    int pid=0;
    cout<<"Введите pid процесса:";
    cin>>pid;
    //цепляюсь к трассируемому процессу tmp_ptrace просто чтобы в дебаге выдеть возврат из ptrace()
    int tmp_ptrace=ptrace(PTRACE_ATTACH,pid);
    //вроде как отправляю сигнал трасируемому процессу остановится
    ptrace(PTRACE_CONT,pid,SIGSTOP,0);
    wait(0);
    //Ranges структура хранящая 4 значения начало и конец диапазонов для кучи и для стека.
    //get_range(pid) просто читает в Ranges диапазоны из /proc/pid/maps файла
    Ranges ranges=get_range(pid);
    if(ranges.heap.start&&ranges.heap.end)
    {
        //в tested буду вычитывать значения из файла
        ULONG tested=0;
        ULONG end_of_range=ranges.heap.end-sizeof(ULONG);
        //структура для хранения искомых значений, на будущее а, пока там всего одно поле int-вое
        Semples semple;
        cin>>semple.int_semple;
        stringstream path;
        //формирую путь и открываю на чтение файл /proc/pid/mem
        path<<"/proc/"<<pid<<"/mem";
        FILE *mem_file;
        mem_file=fopen(path.str().c_str(),"rb");
        if(mem_file==0)//!stream.is_open())
        {
            cout<<"не удалось открыть память процесса на чтение"<<endl;
            ptrace(PTRACE_DETACH,pid,0,0);
            return 1;
        }
        //в структуре пока тоже всего доно поле vector<unsigned long> * ints хранит адреса из памяти
       //трасируемого процесса значения которых совпали с образцом для поиска
        Results result;
        int tmp_read=0;
        //собственно перебираю адреса внутри диапазона кучи сравниваю хранимые значения с образцом
        //заполняю структруру по мере нахождения совпадений
        for(ULONG i=ranges.heap.start;i<=end_of_range;i++)
        {
            fseek(mem_file,i,SEEK_SET);
            tmp_read=fread(&tested,sizeof(tested),1,mem_file);
            //stream.seekg(i);
            //stream>>tested;
            search_int(semple,tested,result,i);
        }
/////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //Самое главное начинается здесь
        ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //обычно находит всего одно совпадение найденый адрес я сверял с сдресом выданным трасируемым
        //процессом всегда правильный
        cout<<"найдено адресов:"<<result.ints->size()<<endl;
        //сделал возможность задавать смещение для места куда пишу в трассируемом процессе
        //переменная хранит смещение
        int choice=0;
        const ULONG ulong_size=sizeof(ULONG);
        while(choice>=0&&choice<12)
        {
            //жду останоыки трассируемого процесса перед кажой записью в память
            //не думаю что в этом случае это так уж важно но на всякий пожарный
            wait(0);
            //указатель для модификации переменной
            signed int *tmp_int_p=0;
            //буфер для считывания памяти из трасируемого процесса
            char buf[16];//=new ULONG[2];
            //ращот смещений относительно начала файла и диапазона кучи
            tmp_ptrace=result.ints->at(0)%ulong_size;
            cout<<"Смещение относительно начала файла ="<<tmp_ptrace<<endl;
            tmp_ptrace=(result.ints->at(0)-ranges.heap.start)%ulong_size;
            cout<<"Смещение относительно начала кучи ="<<tmp_ptrace<<endl;
            //адрес в виртульной памяти трассируемого процесса куда буду писать
            ULONG write_adrr=result.ints->at(0)-choice;
            //считываю память из трассируемого процесса
            //data=ptrace(PTRACE_PEEKDATA,pid,write_adrr,0);
            fseek(mem_file,write_adrr,SEEK_SET);
            if(choice>4)
            {
                tmp_ptrace=fread(buf,ulong_size,2,mem_file);
            }
            else
            {
                tmp_ptrace=fread(buf,ulong_size,1,mem_file);
            }
            //цепляю указатель для модификации с учотом смещения
            tmp_int_p=(int*)((ULONG)buf+choice);
            //модифицирую считаное значение
            *tmp_int_p=55;
            //пишу назад в память трассируемого процесса
            if(choice>4)
            {
                tmp_ptrace=ptrace(PTRACE_POKEDATA,pid,write_adrr,buf);
                write_adrr+=ulong_size;
                tmp_ptrace=ptrace(PTRACE_POKEDATA,pid,write_adrr,buf+8);
            }
            else
            {
                tmp_ptrace=ptrace(PTRACE_POKEDATA,pid,write_adrr,buf);
            }
            //перечитываю значение из пямяти трассируемого процесса чтобы убедится что все ок
            fseek(mem_file,result.ints->at(0),SEEK_SET);
            fread(buf,ulong_size,1,mem_file);
            tmp_int_p=(int*)buf;
            cout<<"значение после редактирования ="<<*tmp_int_p<<endl;
            tmp_ptrace=ptrace(PTRACE_CONT,pid,SIGCONT,0);
            cout<<"Введите смещение адреса :";
            cin>>choice;
            //перечитываю значение чтобы убедится что оно правильно записалось
            //data=ptrace(PTRACE_PEEKDATA,pid,write_adrr,0);
            //cout<<"data="<<data<<endl;
            //cout<<"tmp_int="<<(*tmp_int_p)<<endl;
        }
        ptrace(PTRACE_CONT,pid,SIGCONT,0);
        fclose(mem_file);
        cin>>pid;
        //delete [] buf;
    }
    else
        cout<<"ошибка получения диапазона адресов"<<endl;
    ptrace(PTRACE_DETACH,pid,0,0);
    return 0;
}
И все это счастье не работает так как хотелось бы. При записи в память трассируемого процесса на том конце получаю либо отрицательное значение либо очень большое положительное(что изначально навело на мысль о смещении), но никогда не получаю того что записал. Поясните пожалуйста кто нибудь если знаете почему так происходит?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.08.2012, 04:27
Ответы с готовыми решениями:

Замена значения в запущенном процессе (ptrace(), Linux)
Здравствуйте, уважаемые форумчане! Суть задачи: есть некий процесс в Linux'e. В этом процессе по определенному адресу находится...

Неправильно записываются байты в файл
Здравствуйте. Пытаюсь создать программу, которая записывает байты в файл. Вот мой код: char bytes...

Цифры в файл записываются неправильно
Здравствуйте!Начал изучать Паскаль, и возник вопрос!При записи информации в файл txt (Например FIO data) FIO нормально записываются, а...

3
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
19.08.2012, 16:12
Цитата Сообщение от Kotiara Посмотреть сообщение
вот и взялся читер для игрушек писать
Ты сказал волшебную фразу, после которой те, кто смогли бы помочь, скорее всего помогать не станут
0
0 / 0 / 0
Регистрация: 18.08.2012
Сообщений: 4
19.08.2012, 16:22  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Ты сказал волшебную фразу, после которой те, кто смогли бы помочь, скорее всего помогать не станут
Я признаться думал что здесь форум программистов, вот и поделился честно что делаю и зачем мне это нужно а, вы предполагаете что здесь собираются геймеры моралисты?
В любом случае по что невидно даже намека на то что кто-то знает в чем тут дело.
0
337 / 4 / 1
Регистрация: 29.11.2011
Сообщений: 39
12.09.2012, 05:45
вместо чтения /proc/%pid%/mem нужно пользоваться функцией process_vm_readv, она напрямую читает из памяти процесса в одно копирование, чтение из файла обойдётся в два копирования
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.09.2012, 05:45
Помогаю со студенческими работами здесь

Неправильно записываются поля в XML-файл
Есть файл compiler_test.xml &lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt; &lt;!--MSG-1 configuration version 1.2--&gt; &lt;Root&gt; ...

Неправильно записываются двоичные данные в таблицу БД
Здравствуйте, уважаемые! Уже сбилась с ног, никак не могу понять в чем ошибка... Суть проблемы. Пишу картинку в таблицу SQL, тип...

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

Есть ли в матлаб ссылочные типы данных? Как переменные записываются в память?
добрый день. пожалуйста ответьте на вопрос: есть ли в matlab ссылочные типы и значимые (как например в c#, в кт классы - ссылочные,...

В БД не записываются значения
Этот сервис обрабатывает поступившее сообщение. sms_body_name и sms_body_text имеют нужные значения (строка 65 и 66), а вот в БД вообще...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru