Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
1

Аналог VirtualProtect

08.03.2009, 11:13. Показов 5845. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
есть ли в Линукс аналог VirtualProtect

Добавлено через 6 минут 55 секунд
функцию нашел токо вот чето не получается
C
1
2
3
4
5
6
7
8
9
10
void sm(){printf("privet ot mecida");} void sme(){};
 
void handler(int status){
int c=(int)sm-(int)sme;
unsigned char* p=(unsigned char*)malloc(c);
for(p=(unsigned char *)sm;p<(unsigned char *)sme;++p)
mprotect(p,c,PROT_WRITE);
*p=*p^0x666;
mprotect(sm,c,PROT_EXEC);
 }
Segmentation fault
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2009, 11:13
Ответы с готовыми решениями:

VirtualProtect
Привет всем. Не могу получить доступ к User32.dll. procedure TForm1.Button1Click(Sender:...

VirtualProtect
Где можно узнать значение последнего параметра VirtualProtect (typedef DWORD* PDWORD) PDWORD...

Использование VirtualProtect
Добрый день, пользователи форума. Вопрос отражается в названии темы. Объясните пожалуйста, на...

VirtualAlloc и VirtualProtect?
VirtualAlloc и VirtualProtect что из себя представляют даные функцыи,как с ними работать и что они...

24
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.03.2009, 11:38 2
Вот инетересно, для кого люди пишут функции так, чтобы они возвращали различные значения на ошибках и при отсутствии ошибок. Убедись. Проверяй возвращаемое значение из mprotect. Она у тебя -1 вернет. То есть, не запротектит область памяти. То есть *p=*p^0x666; вызовет Segmentation fault.
C++
1
int c=(int)sm-(int)sme;
Что это такое?
C++
1
2
unsigned char* p=(unsigned char*)malloc(c);
for(p=(unsigned char *)sm;p<(unsigned char *)sme;++p)
мне не совсем понятно, что ты хочешь сделать... Выделяем память. Указатель на область. В цикле этот же указатель на другую область...нафига предыдущую выделяли?
Еще ты очень круто доверяешь всему, что делаешь. Проверки надо делать! Вот ты вызвал malloc. Проверь, что у тебя не ноль. проверь возврат из mprotect. проверь значение c перед вызовом mprotect.
0
Любитель давать советы
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
08.03.2009, 12:13 3
Новые установки защиты заменяют предыдущие. Например, если память была ранее помечена PROT_READ, а mprotect вызывается с помощью параметра prot, равного PROT_WRITE, то данные, находящиеся в памяти, невозможно будет считывать.
То есть
C
1
2
mprotect(p,c,PROT_WRITE);
*p=*p^0x666;
- однозначно вызовет ошибку. Не говоря уже об остальных ляпах..
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
08.03.2009, 13:15  [ТС] 4
Цитата Сообщение от Alexiski Посмотреть сообщение
То есть
C
1
2
mprotect(p,c,PROT_WRITE);
*p=*p^0x666;
- однозначно вызовет ошибку. Не говоря уже об остальных ляпах..
но я ведь потом восстанавливаю в PROT_EXEC

Добавлено через 29 минут 30 секунд
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <signal.h>
#include <sys/mman.h>
//sekretnoe soobshenie
void sm(){printf("\nsekretnoe soobshenie\n");} void sme(){}
//shifrator
void handler(int sig){
unsigned char* p=(unsigned char*)sm;
int i;
int c=(int)sme-(int)sm;
if(mprotect(p,c,PROT_WRITE))
for(i=0;i<c;++i) *p++^=0x666;
mprotect(p,c,PROT_EXEC);
}
int main(){
signal(SIGTRAP,handler);
asm("int3");
return 0;
}
вроде исправил,но опять та же ошибка
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.03.2009, 13:57 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
void f1(){;};void f2(){;}; //вот две функции...
 
#define handle_error(msg) \
   do { perror(msg); exit(EXIT_FAILURE); } while (0)
 
char *buffer;
 
static void
handler(int sig, siginfo_t *si, void *unused)
{
   printf("Got SIGSEGV at address: 0x%lx\n",
           (long) si->si_addr);
   exit(EXIT_FAILURE);
}
 
int
main(int argc, char *argv[])
{
   char *p;
   int pagesize;
 
   pagesize = sysconf(_SC_PAGE_SIZE);
   if (pagesize == -1)
       handle_error("sysconf");
 
   buffer = (char *)(((unsigned long) &f1) & ~(pagesize-1)); //выравнивание
   printf("Start of region: 0x%lx\n", (long) buffer);
 
   if (mprotect(buffer, 1000, PROT_WRITE) == -1) //1000 вполне достанет до адреса моей функции
       handle_error("mprotect");
   
   p = &f1;
       *p = 58;
}
Добавлено через 3 минуты 56 секунд
Если бы ты открыл man-страницу, то надо было три раза перечитать:
mprotect() changes protection for the calling process’s memory page(s) containing any part of the address range in the interval
[addr, addr+len-1]. addr must be aligned to a page boundary.
Где сказано, что адрес должен быть выровнен по границе страницы памяти. Я же тебе подсказывал, чтобы ты посмотрел возвращаемое значение. Но не просто посмотрел. А как минимум strerror(errno).
Тогда бы ты увидел сообщение о Invalid argument в mprotect.Исключение EINVAL -
EINVAL addr is not a valid pointer, or not a multiple of the system page size.
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
08.03.2009, 14:03  [ТС] 6
а модешь пояснить для чего нужен pagesize?
C
1
buffer = (char *)(((unsigned long) &f1) & ~(pagesize-1));
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.03.2009, 14:15 7
Я же написал, что для выравнивания по границе страницы.
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
08.03.2009, 14:20  [ТС] 8
Цитата Сообщение от Vourhey Посмотреть сообщение
Я же написал, что для выравнивания по границе страницы.
то есть без этого никак?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.03.2009, 14:23 9
Тебе же написали в документации к функции, что адрес должен быть выровнен по границе страницы. Какие после этого могут быть вопросы.

P. S. если трудно понять булевы операции, то я делал и так:
C++
1
2
   p = &f1;
   buffer= (char*)(p-((unsigned long)p % pagesize));
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
08.03.2009, 14:24  [ТС] 10
да не все ясно
не заметил про ман
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.03.2009, 14:29 11
Цитата Сообщение от Mecid Посмотреть сообщение
не заметил про ман
Бывает. Так что выравнивай адрес, меняй права и пиши в память. И...читай маны
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
08.03.2009, 14:39  [ТС] 12
а в каком файле _SC_PAGE_SIZE?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.03.2009, 14:43 13
Эх, как все плохо-то
А в какой функции ты видишь его использование? sysconf? Вот делаем man sysconf в консоли и узнаем тайны бытия
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
08.03.2009, 14:45  [ТС] 14
No manual entry for sysconf
а почему у меня нет мана?
может мне че установить?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.03.2009, 14:52 15
Нет мана для системных функций, это мощно... Дай, попробую угадать. У тебя ubuntu, что ли?
Подключай unistd.h
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
08.03.2009, 15:33  [ТС] 16
да что тут смешного,а??а еще говорят убунту для новичков даже мана нет

все поставил все маны для девеллопера

Добавлено через 38 минут 19 секунд
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <signal.h>
#include <sys/mman.h>
#include <unistd.h>
//sekretnoe soobshenie
void sm(){printf("\nsekretnoe soobshenie\n");} void sme(){}
//shifrator`
void handler(int sig){
unsigned char* p=(unsigned char*)sm;
int i,e,pagesize=sysconf(_SC_PAGE_SIZE);
if(pagesize==-1) perror("sysconf");
int c=(int)sme-(int)sm;
mprotect((unsigned char*)(p-(unsigned long)p%pagesize),c,PROT_WRITE);
for(i=0;i<c;++i) *p++^=0x66;
mprotect((unsigned char*)(p-(unsigned long)p%pagesize),c,PROT_EXEC);
}
int main(){
signal(SIGTRAP,handler);
asm("int3");
return 0;
}
ну блин надоело опять тоже самое
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.03.2009, 15:43 17
Да, блин, я ж кому говорил все проверять. И я в первом сообщении спросил тебя, что это такое?
C++
1
int c=(int)sme-(int)sm;
Где ответ? Где проверка переменной с? Где вывод ошибок на неработающем mprotect?
Я все это писал в первом сообщении. Забил?
У тебя есть переменная с она определяет, сколько памяти. Почему ты ее, не проверяешь, а? может ты там -20 байт памяти меняют права доступа, а?

Убицца можно (((

Добавлено через 2 минуты 53 секунды
ну блин надоело опять тоже самое
Вот я то же самое хотел тебе сказать )
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
08.03.2009, 15:43  [ТС] 18
Я се проверяю прост чтоб листинг большой не был так прикрепил
C
1
int c=(int)sme-(int)sm;
колличество байт которые шифруются и надо их сделать PROT_WRITE
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.03.2009, 15:48 19
Ёпрст, пойми ты уже.
Страница у тебя например начинается с 800 адреса а адрес функции 850. Доходит на какую длину начиная с 800 нужно менять права доступа? Чтобы до 850 достать и дальше насколько тебе нужно. А у тебя что? Какое-то, блин, магическое:
C++
1
int c=(int)sme-(int)sm;
Добавлено через 2 минуты 48 секунд
Цитата Сообщение от Vourhey Посмотреть сообщение
Ёпрст, пойми ты уже.
Страница у тебя например начинается с 800 адреса а адрес функции 850. Доходит на какую длину начиная с 800 нужно менять права доступа? Чтобы до 850 достать и дальше насколько тебе нужно. А у тебя что? Какое-то, блин, магическое:
C++
1
int c=(int)sme-(int)sm;
Блин у тебя это количество байт начиная со страницы! Не с начала функции! Ты же адрес границы страницы передаешь! Ты меняешь права с начала страницы, а пишешь с начала функции. Разница есть?
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
08.03.2009, 15:52  [ТС] 20
блин терь ясно значит адрес страницы нужно,а я то думал любой адрес
а как тода узнать мне адрес страницы где моя функция
P.S. просто в винде VirtualProtect использует колличество байт
0
08.03.2009, 15:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2009, 15:52
Помогаю со студенческими работами здесь

Обход VirtualProtect
Здравствуйте уважаемые форумчане. Собственно пишу что-то наподобие чита к игре и возникли...

VirtualProtect и отловление ошибок
Здравствуйте. Есть следующий кусок исходника: ... #define MEMBLOCK_SIZE 4096 LPVOID...

Адресация процедур на asm (дублирование кода, VirtualProtect)
Здравствуйте. Не вдаваясь в мотивацию, приведу упрощенный пример для демонстрации проблемы....

Некорректное возвращения значения GetModuleFileName и VirtualProtect + MessageBox
Здравствуйте. Осваиваю использование dll. В инете нашел простенький пример использование. Но что то...


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

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