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

Cис. вызовы

20.11.2011, 00:12. Показов 5124. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, подскажите ошибку в коде, а то уже пару дней голову ломаю - не компилица...
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
#include <stdio.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <sys/user.h>
 
void child();
void parent(pid_t pid);
 
int main(int argc, char *argv[]) {
    pid_t pid = fork();
    if (pid)
        parent(pid);
    else
        child();
    return 0;
}
 
void child() {
    ptrace(PTRACE_TRACEME, 0, 0, 0);
    execl("/bin/echo", "/bin/echo", "Hello, world!", NULL);
    perror("execl");
}
 
void parent(pid_t pid) {
    int status;
    
    waitpid(pid, &status, 0);
    
    ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD);
    
    while (!WIFEXITED(status)) {
 
        struct user_regs_struct state;
        
        ptrace(PTRACE_SYSCALL, pid, 0, 0);
        waitpid(pid, &status, 0);
        
        // at syscall
        if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80) {
            ptrace(PTRACE_GETREGS, pid, 0, &state);
            printf("SYSCALL %ld at %08lx\n", state.orig_eax, state.eip);
            
            // sys_write
            if (state.orig_eax == 4) {
                char * text = (char *)state.ecx;
                ptrace(PTRACE_POKETEXT, pid, (void*)(text+7), 0x72626168); //mup!
                ptrace(PTRACE_POKETEXT, pid, (void*)(text+11), 0x00000a21); //!\n
            }
            
            // skip after syscall
            ptrace(PTRACE_SYSCALL, pid, 0, 0);
            waitpid(pid, &status, 0);
 
        }
        
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2011, 00:12
Ответы с готовыми решениями:

Системные вызовы
Как осуществить вывод счета в секундах на консоль (своеобразный таймер). и как организовать отсчет числа секунд в обратном направлении? ...

Системные вызовы ядра и библиотека glibc
Изучаю программирование под linux, что бы процесс изучения не был скучным решил написать игру - морской бой. Игра будет работать в...

Заменить вызовы функции printf на write
Доброго всем вечера!задали задание чтобы процесс породил новый процесс и позволял родительскому процессу завершиться раньше...

29
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.11.2011, 05:09
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
 
#include <stdio.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <sys/user.h>
 
#include <sys/types.h>
 
void child();
void parent(pid_t pid);
 
int main(int argc, char *argv[]) {
    pid_t pid = fork();
    if (pid)
        parent(pid);
    else
        child();
    return 0;
}
 
void child() {
    ptrace(PTRACE_TRACEME, 0, 0, 0);
    execl("/bin/echo", "/bin/echo", "Hello, world!", NULL);
    perror("execl");
}
 
void parent(pid_t pid) {
    int status;
    
    waitpid(pid, &status, 0);
    
    ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD);
    
    while (!WIFEXITED(status)) {
 
        struct user_regs_struct state;
        
        ptrace(PTRACE_SYSCALL, pid, 0, 0);
        waitpid(pid, &status, 0);
        
        /* at syscall */
        if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80) {
            ptrace(PTRACE_GETREGS, pid, 0, &state);
            printf("SYSCALL %ld at %08lx\n", state.orig_eax, state.eip);
            
            /* sys_write */
            if (state.orig_eax == 4) {
                char * text = (char *)state.ecx;
                ptrace(PTRACE_POKETEXT, pid, (void*)(text+7), 0x72626168); /* mup! */
                ptrace(PTRACE_POKETEXT, pid, (void*)(text+11), 0x00000a21); /* !\n */
            }
            
            /* skip after syscall */
            ptrace(PTRACE_SYSCALL, pid, 0, 0);
            waitpid(pid, &status, 0);
 
        }
        
    }
}
Code
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
[guest@localhost tests]$ .ansi t.c -o t
[guest@localhost tests]$ ./t
SYSCALL 45 at 0038ca6d
SYSCALL 192 at 0038de33
SYSCALL 33 at 0038dd31
SYSCALL 5 at 0038dbf4
SYSCALL 197 at 0038dbbe
SYSCALL 192 at 0038de33
SYSCALL 6 at 0038dc2d
SYSCALL 5 at 0038dbf4
SYSCALL 3 at 0038dc74
SYSCALL 197 at 0038dbbe
SYSCALL 192 at 0038de33
SYSCALL 125 at 0038deb4
SYSCALL 192 at 0038de33
SYSCALL 192 at 0038de33
SYSCALL 6 at 0038dc2d
SYSCALL 192 at 0038de33
SYSCALL 243 at 00378f82
SYSCALL 125 at 0038deb4
SYSCALL 125 at 0038deb4
SYSCALL 91 at 0038de71
SYSCALL 45 at 00271416
SYSCALL 45 at 00271416
SYSCALL 45 at 00271416
SYSCALL 5 at 00271416
SYSCALL 197 at 00271416
SYSCALL 192 at 00271416
SYSCALL 6 at 00271416
SYSCALL 197 at 00271416
SYSCALL 192 at 00271416
SYSCALL 4 at 00271416
Hello, habr!
SYSCALL 6 at 00271416
SYSCALL 91 at 00271416
SYSCALL 6 at 00271416
SYSCALL 252 at 00271416
[guest@localhost tests]$
1
13 / 13 / 0
Регистрация: 11.10.2011
Сообщений: 116
20.11.2011, 12:40  [ТС]
Цитата Сообщение от accept Посмотреть сообщение
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
 
#include <stdio.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <sys/user.h>
 
#include <sys/types.h>
 
void child();
void parent(pid_t pid);
 
int main(int argc, char *argv[]) {
    pid_t pid = fork();
    if (pid)
        parent(pid);
    else
        child();
    return 0;
}
 
void child() {
    ptrace(PTRACE_TRACEME, 0, 0, 0);
    execl("/bin/echo", "/bin/echo", "Hello, world!", NULL);
    perror("execl");
}
 
void parent(pid_t pid) {
    int status;
    
    waitpid(pid, &status, 0);
    
    ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD);
    
    while (!WIFEXITED(status)) {
 
        struct user_regs_struct state;
        
        ptrace(PTRACE_SYSCALL, pid, 0, 0);
        waitpid(pid, &status, 0);
        
        /* at syscall */
        if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80) {
            ptrace(PTRACE_GETREGS, pid, 0, &state);
            printf("SYSCALL %ld at %08lx\n", state.orig_eax, state.eip);
            
            /* sys_write */
            if (state.orig_eax == 4) {
                char * text = (char *)state.ecx;
                ptrace(PTRACE_POKETEXT, pid, (void*)(text+7), 0x72626168); /* mup! */
                ptrace(PTRACE_POKETEXT, pid, (void*)(text+11), 0x00000a21); /* !\n */
            }
            
            /* skip after syscall */
            ptrace(PTRACE_SYSCALL, pid, 0, 0);
            waitpid(pid, &status, 0);
 
        }
        
    }
}
[guest@localhost tests]$[/CODE]
Те же грабли, можно узнать, чем вы компилировали? g++ и gcc не хавают код может из-за процессора? я уже не знаю, что думать...
C
1
2
3
4
5
6
gcc t.c -o t
t.c: В функции «parent»:
t.c:44:51: ошибка: «struct user_regs_struct» не содержит элемента с именем «orig_eax»
t.c:44:67: ошибка: «struct user_regs_struct» не содержит элемента с именем «eip»
t.c:47:22: ошибка: «struct user_regs_struct» не содержит элемента с именем «orig_eax»
t.c:48:44: ошибка: «struct user_regs_struct» не содержит элемента с именем «ecx»
C++
1
2
3
4
5
6
g++ t.c -o t
t.c: В функции «void parent(pid_t)»:
t.c:44:52: ошибка: «struct user_regs_struct» has no member named «orig_eax»
t.c:44:68: ошибка: «struct user_regs_struct» has no member named «eip»
t.c:47:23: ошибка: «struct user_regs_struct» has no member named «orig_eax»
t.c:48:45: ошибка: «struct user_regs_struct» has no member named «ecx»
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.11.2011, 13:03
хз о чем ты... все компилится.
0
13 / 13 / 0
Регистрация: 11.10.2011
Сообщений: 116
20.11.2011, 13:05  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
хз о чем ты... все компилится.
У вас процессор от intel? у меня просто на ноуте amd и мне кажется там с регистрами проблема. Сейчас на десктоп пойду смотреть.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.11.2011, 13:06
у меня AMD. и процессор тут не при чем.
0
13 / 13 / 0
Регистрация: 11.10.2011
Сообщений: 116
20.11.2011, 13:09  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
у меня AMD. и процессор тут не при чем.
Тогда я совершенно не пойму в чем проблема. Код один и тот же, но не компилируется, 2мя компиляторами пробовал - ошибки написал же...
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.11.2011, 13:10
какая ОС? какой компилятор?
0
13 / 13 / 0
Регистрация: 11.10.2011
Сообщений: 116
20.11.2011, 13:12  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
какая ОС? какой компилятор?
убунта 11.10, g++, gcc.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.11.2011, 13:13
"gcc -v" что выводит?
0
13 / 13 / 0
Регистрация: 11.10.2011
Сообщений: 116
20.11.2011, 13:17  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
"gcc -v" что выводит?
4.6.1, да утром я проверял их древность...
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.11.2011, 13:23
Цитата Сообщение от Rels Посмотреть сообщение
4.6.1
ну это свежий компилятор. в общем у меня идей нет...
0
13 / 13 / 0
Регистрация: 11.10.2011
Сообщений: 116
20.11.2011, 13:29  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
ну это свежий компилятор. в общем у меня идей нет...
Да вот у меня так же, обычно на форум пишу, когда совсем туго, вот один из таких случаев
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.11.2011, 13:31
совсем нелепая идея: переименуй исходник в reg.c, к примеру. мало ли...
0
13 / 13 / 0
Регистрация: 11.10.2011
Сообщений: 116
20.11.2011, 13:37  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
совсем нелепая идея: переименуй исходник в reg.c, к примеру. мало ли...
Не, та же басня. Там что-то не то с регистрами, мне кажется.
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.11.2011, 13:42
Цитата Сообщение от Rels
Те же грабли, можно узнать, чем вы компилировали?
Code
1
2
3
4
5
6
7
8
9
10
11
[guest@localhost ~]$ alias .ansi
alias .ansi='gcc -ansi -pedantic -Wall'
[guest@localhost ~]$
[guest@localhost ~]$ gcc --version
gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
Copyright (C) 2010 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая 
коммерческую ценность и применимость для каких-либо целей.
 
[guest@localhost ~]$
0
Заблокирован
20.11.2011, 13:43
user.h:
C
1
2
3
4
5
#ifdef CONFIG_X86_32
# include "user_32.h"
#else
# include "user_64.h"
#endif

user_32.h:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct user_regs_struct {
    unsigned long   bx;
    unsigned long   cx;
    unsigned long   dx;
    unsigned long   si;
    unsigned long   di;
    unsigned long   bp;
    unsigned long   ax;
    unsigned long   ds;
    unsigned long   es;
    unsigned long   fs;
    unsigned long   gs;
    unsigned long   orig_ax;
    unsigned long   ip;
    unsigned long   cs;
    unsigned long   flags;
    unsigned long   sp;
    unsigned long   ss;
};

user_64.h:
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
struct user_regs_struct {
    unsigned long   r15;
    unsigned long   r14;
    unsigned long   r13;
    unsigned long   r12;
    unsigned long   bp;
    unsigned long   bx;
    unsigned long   r11;
    unsigned long   r10;
    unsigned long   r9;
    unsigned long   r8;
    unsigned long   ax;
    unsigned long   cx;
    unsigned long   dx;
    unsigned long   si;
    unsigned long   di;
    unsigned long   orig_ax;
    unsigned long   ip;
    unsigned long   cs;
    unsigned long   flags;
    unsigned long   sp;
    unsigned long   ss;
    unsigned long   fs_base;
    unsigned long   gs_base;
    unsigned long   ds;
    unsigned long   es;
    unsigned long   fs;
    unsigned long   gs;
};
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.11.2011, 13:47
sys/user.h
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct user_regs_struct
{
  long int ebx;
  long int ecx;
  long int edx;
  long int esi;
  long int edi;
  long int ebp;
  long int eax;
  long int xds;
  long int xes;
  long int xfs;
  long int xgs;
  long int orig_eax;
  long int eip;
  long int xcs;
  long int eflags;
  long int esp;
  long int xss;
};
0
Заблокирован
20.11.2011, 13:51
вобщем прибавь везде r
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
 
#include <stdio.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/wait.h>
#include <sys/user.h>
 
void child();
void parent(pid_t pid);
 
int main(int argc, char *argv[]) {
    pid_t pid = fork();
    if (pid)
        parent(pid);
    else
        child();
    return 0;
}
 
void child() {
    ptrace(PTRACE_TRACEME, 0, 0, 0);
    execl("/bin/echo", "/bin/echo", "Hello, world!", NULL);
    perror("execl");
}
 
void parent(pid_t pid) {
    int status;
    
    waitpid(pid, &status, 0);
    
    ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD);
    
    while (!WIFEXITED(status)) {
 
        struct user_regs_struct state;
        
        ptrace(PTRACE_SYSCALL, pid, 0, 0);
        waitpid(pid, &status, 0);
        
        // at syscall
        if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80) {
            ptrace(PTRACE_GETREGS, pid, 0, &state);
            printf("SYSCALL %ld at %08lx\n", state.orig_rax, state.rip);
            
            // sys_write
            if (state.orig_rax == 4) {
                char * text = (char *)state.rcx;
                ptrace(PTRACE_POKETEXT, pid, (void*)(text+7), 0x72626168); //mup!
                ptrace(PTRACE_POKETEXT, pid, (void*)(text+11), 0x00000a21); //!\n
            }
            
            // skip after syscall
            ptrace(PTRACE_SYSCALL, pid, 0, 0);
            waitpid(pid, &status, 0);
 
        }
        
    }
}
2
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.11.2011, 13:57
LosAngeles, забыл определение pid_t
https://www.cyberforum.ru/post2190619.html
(ещё комменты заменены на C89)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.11.2011, 13:57
Помогаю со студенческими работами здесь

Вызовы read/write в цикле между процессами
Необходимо реализовать два процесса: родительский считывает N чисел по одному и пишет их потомку, а потомок считывает эти числа и пишет их...

Ввод с клавиатуры содержимого текстового файла, имя которого задается в командной строке, используя системные вызовы
ПОМОГИТЕ, ПОЖАЛУЙСТА, ПОНЯТЬ. У МЕНЯ ЕСТЬ ЗАДАЧА &quot;Ввод с клавиатуры содержимого текстового файла, имя которого задается в командной строке,...

Ввод с клавиатуры содержимого текстового файла, имя которого задается в командной строке, используя системные вызовы и в
ПОМОГИТЕ ПОЖАЛУЙСТА Ввод с клавиатуры содержимого текстового файла, имя которого задается в командной строке, используя системные вызовы...

Вызов функции, точка с запятой, фигурные скобки, внутри которых другие вызовы функций
Что означает такая запись ? foo(); { aoo();

Сделать, чтобы в основном файле были только вызовы функций, а функции — лежали в подключаемом другом
Всем привет! Написал большой код. Хочу, чтобы в основном файле были только вызовы функций, а функции - лежали в подключаемом другом...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru