【练习】试图通过mprotect保护一个静态变量

试图使用mprotect保护一个静态变量数组,当对该静态变量受保护的部分写时,程序core dump

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>

int protect_bss(void * p, size_t len)
{
    size_t page_size = sysconf(_SC_PAGE_SIZE);
    if(page_size == -1) {
        return -1;
    }

    size_t start = (size_t)p;
    size_t new_start = (start + (page_size - 1)) / page_size * page_size;
    size_t new_len = (start + len - new_start) / page_size * page_size;

    if(mprotect((void *)new_start, new_len, PROT_READ) == 0) {
        printf( "bss [%p, %p), protected [%p, %p)\n", p, p+len, (void*)new_start, (void*)new_start+new_len);
        return 0;
    }

    return -1;
}

char bss[20000];

int main(void)
{
    printf("%d\n", protect_bss(bss, sizeof(bss)));
    bss[10000] = 1;
    return 0;
}
时间: 2024-08-01 11:55:22

【练习】试图通过mprotect保护一个静态变量的相关文章

关于一个静态变量的计算

代码如下: <?php $count = 5; function get_count(){ static $count = 0; return $count++; } echo $count; //5 ++$count; echo get_count(); //0 echo get_count(); //1 echo $count; //6 关于静态变量的说法可以参看C++的:static静态变量的理解

局部静态变量是如何做到只初始化一次的?

关于编译选项 -Wa,-adlhn参考 http://blog.csdn.net/lanxinju/article/details/5900986 以下内容来自于内网别的高人的回复 可以写个程序测试一下: class A { public: A() {} public: int a; }; int static_var_func() { static A a; return a.a++; } int main(int argc, char * argv[]) { static_var_func(

android产品研发(十)--&gt;不使用静态变量保存数据

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android中的几种常见网络协议:xml,json,protobuf等,以及各自的优缺点,一般而言主要我们的App涉及到了网络传输都会有这方面的内容,具体可根据项目的需求确定各自的网络传输协议.这里可参考android产品研发(九)–>App网络传输协议 而本文讲解的其实并不是一个技术方面,而是一个android产品研发过程中的技巧:尽量不使用静态变量保存核心数据.这是为什么呢?这是因为android的进程并不是安全的,包括applicat

java中的静态变量

大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员.此时就是 static 大显身手的时候了!! Java 中被 static 修饰的成员称为静态成员或类成员.它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享.静态成员可以使用类名直接访问,也可以使用对象名进行访问.当然,鉴于他作用的特殊性更推荐用类名访问~~ 使用 static 可以修饰变量.方法和代码块. 本小节,我们先认识一下静态变量. 例

C++ 怎么让静态变量只初始化一次

童鞋们在学习C++的时候,往往只是按照书本上的原文去强行记忆各种特性,比方说,静态变量只初始化一次.你心中一定在默念:一定要记住,static只会初始化一次云云,希望自己能够记住.告诉你,你为什么总是记不住,因为你没有正真理解静态变量的原理, 所以下面我就来告诉大家它的原理,直接上代码:[code=C/C++]#include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]){    int initNum = 3;    for (int

block 解析 - 静态变量

静态变量 上一篇 我们了解了block全局变量的使用,静态变量和全局变量一样,可以直接在block内部使用,也可以在block内部修改 引用官方文档: Global variables are accessible, including static variables that exist within the enclosing lexical scope. 我们来看一段代码: 声明一个静态变量,在block内部修改 static NSString * _para1; -(void )tes

PHP 静态变量和静态方法

PHP静态变量静态变量(也叫类变量) 静态的变量的基本用法1.在类中定义静态变量形式:[访问修饰符] static $变量名;例;  //public static $nums=0;2.如何访问静态变量如果在类中访问  有两种方法    self::$静态变量名  ,  类名::$静态变量名如果在类外访问: 有一种方法    类名::$静态变量名 例程:提出一个问题:说,有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?请使用面向对象的思想,编写程序解决 [php] vi

java 成员变量、局部变量、静态变量、类变量、非静态变量、实例变量、向前引用、非法向前引用、静态代码块、非静态代码块

①java类的成员变量有俩种: 一种是被static关键字修饰的变量,叫类变量或者静态变量 另一种没有static修饰,为成员变量 ②通俗点说: 类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享.静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期. 而实例变量取决于类的实例.每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期. 注意点: 1.JAVA中初始化

静态库里的静态变量

我们知道,在C语言里面的静态变量,在程序运行上只有一份拷贝, 在程序的任何一处改变其值后, 其他地方再调用会得到已经修改后的值, 因此可以当做一个全局变量来使用. 但是,当系统比较庞大时,经常会将一些功能代码编译成各种库来调用,这里的库有静态库和动态库. 问题是, 当一个静态变量是定义在一个静态库里面时, 它是不是也只有一份拷贝呢,答案是不一定. 考虑这样的一个情况, 有一个静态库liba, 包含了静态变量x, 还有两个动态库dlib1, dlib2, 这两个动态库在创建时都包含了静态库liba