• 60再谈指针


    32位操作系统下:一个应用程序理论上的虚拟内存空间4GB内存
    0000 0000 0000 0000 0000 0000 0000 0000  - 1111 1111 1111 1111 1111 1111 1111 1111
    0x0000 0000 - 0xFFFF FFFF

    指针的本质就是一个int类型的变量.
    只不过这个变量是存放一个4字节的内存地址,并且这个int是无符号的类型,因为内存地址不存在负数.

    我们平常定义的
    char * l_v1
    double * l_v2
    int * l_v3

    只是在用这个指针的时候,在内存移动一个多大的距离.
     
    l_v1 = 0x 12345678



    64位操作系统下:一个应用程序的虚拟内存是2的64次方内存空间.当然这只是理论.
    所以指针就是8个字节的无符号整数了.
    0x0000 0000 0000 0000 - 0x FFFF FFFF FFFF FFFFF


     int l_v1 = 100;
     int *l_v2 = &l_v1;




    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    void main() {
     char l_v1[100] = "ABCDEFGHIGKLMN";
     char * l_v2 = &l_v1;
     int *l_v3 = &l_v1;
     printf("%c ", *l_v2);
     printf("%c ", *l_v3);
     l_v2++;
     l_v3++;
     printf("%c ", *l_v2);
     printf("%c ", *l_v3);
     system("pause");
    }


      int l_v1 = 0;
     const int *l_v2 = &l_v1; //常量指针

     __asm {
      mov eax, dword ptr[ebp - 14h];
      mov dword ptr[eax], 64h;
     }

     printf("l_v1 is %d ", l_v1);
     // 指针可以指向一个int类型的地址,但不可以用*l_v3修改这个内存的值.
     // mov     eax,dword ptr [ebp-14h] 
     // mov     dword ptr[eax], 64h
     // mov     dword ptr[ebp - 8h], 64h;


    const int l_v1 = 0;
    这只是一些语法限制,编译器不允许我们这么做.
    不过如果想要绕过去,有时候可以通过指针或者内嵌汇编的方式.

    跟外挂和黑客很相似.  //都是跟内存打交道.
  • 相关阅读:
    软件测试作业1:android手机应用布局之TabActivity
    软件测试作业2:对faulty,error和failure的理解和应用
    python-字符串常用方法、文件简单读写
    python-字典练习题
    python-字典
    python-list 列表 数组
    python基础一循环
    Charles抓包
    Jmeter分布式
    Jmeter如何操作数据库
  • 原文地址:https://www.cnblogs.com/xiaodaxiaonao/p/7912102.html
Copyright © 2020-2023  润新知