zoukankan      html  css  js  c++  java
  • c++指针练习

    • Pointers
    • 在getchar处断点,断点后,调试->窗口->反汇编 查看数据

    main

    #include <iostream>
    #include <Windows.h>
    
    /*
    Player : object
    Name : string
    Health : integer
    Coins : integer
    Coordinates : object
    X : float
    Z : float
    Y : float
    Inventory : array - Array of item objects, having the item and item count.
    */
    
    
    uintptr_t _Inventory[3] = { 1,2,3 };
    
    struct _Coordinates
    {
    	float x = 4.0;
    	float y = 2.0;
    	float z = 3.0;
    } coordinates;
    
    struct Player
    {
    	const char* Name = "ab";
    	uintptr_t Health = 6;
    	uintptr_t Coins = 3;
    
    	/*
    
    	// 这种方法类似把coordinates直接复制到这里来
    	// Padding1的偏移量将是 playerBaseAddress+4*6
    	_Coordinates Coordinates = coordinates;
    
    	float x = 4.0;
    	float y = 2.0;
    	float z = 3.0;
    	*/
    
    	_Coordinates* Coordinates = &coordinates;
    	// uintptr_t Padding1 = 1;
    
    	/*
    	 //类似直接复制到这
    	 //std::cout << "arrar[0]: " << *(uintptr_t*)(playerBaseAddress + sizeof(uintptr_t) * 4) << std::endl;
    	 //std::cout << "arrar[1]: " << *(uintptr_t*)(playerBaseAddress + sizeof(uintptr_t) * 5) << std::endl;
    	 //std::cout << "arrar[2]: " << *(uintptr_t*)(playerBaseAddress + sizeof(uintptr_t) * 6) << std::endl;
    	 const int Inventory[3] = { 1,2,3 };
    	*/
    
    	// 数组直接返回的就是指针,所以不用&
    	 uintptr_t* Inventory = _Inventory;
    } player;
    
    
    int main()
    {
    	std::cout << "playerBaseAddress: " << &player << std::endl;
    
    	uintptr_t playerBaseAddress = (uintptr_t)&player;
    
    	// name
    	// lea stringNameAddress, [playerBaseAddress]
    	uintptr_t* stringNameAddress = (uintptr_t*)(playerBaseAddress);
    
    	// 从指针中获取值
    	// mov eax, dowrd ptr [stringNameAddress]
    	std::cout << "Name: " << std::hex << *(uintptr_t*)(*stringNameAddress) << std::endl;
    
    
    	// get Health
    	std::cout << "Health: " << *(uintptr_t*)(playerBaseAddress + sizeof(uintptr_t)) << std::endl;
    
    	// get Coins
    	std::cout << "Coins: " << *(uintptr_t*)(playerBaseAddress + sizeof(uintptr_t) * 2) << std::endl;
    
    
    	// 获取Coordinates指针
    	uintptr_t coordinatesAddress = *(uintptr_t*)(playerBaseAddress + sizeof(uintptr_t) * 3);
    	std::cout << "CoordinatesAddress: " << coordinatesAddress << std::endl;
    	std::cout << "Coordinates->x: " << *(float*)(coordinatesAddress) << std::endl;
    	std::cout << "Coordinates->y: " << *(float*)(coordinatesAddress + sizeof(float)) << std::endl;
    	std::cout << "Coordinates->z: " << *(float*)(coordinatesAddress + sizeof(float) * 2) << std::endl;
    
    	
    	// 获取Inventory指针
    	uintptr_t InventoryAddress = *(uintptr_t*)(playerBaseAddress + sizeof(uintptr_t) * 4);
    	std::cout << "InventoryAddress: " << InventoryAddress << std::endl;
    	std::cout << "Inventory[0]: " << *(uintptr_t*)(InventoryAddress) << std::endl;
    	std::cout << "Inventory[1]: " << *(uintptr_t*)(InventoryAddress + sizeof(uintptr_t)) << std::endl;
    	std::cout << "Inventory[2]: " << *(uintptr_t*)(InventoryAddress + sizeof(uintptr_t) * 2) << std::endl;
    
    	// set
    	*(uintptr_t*)(playerBaseAddress + sizeof(uintptr_t)) = 4;
    	*(uintptr_t*)(playerBaseAddress + sizeof(uintptr_t)*2) = 5;
    
    	getchar();
    	return 0;
    }
    

    x86打印结果:

    playerBaseAddress: 0026D05C
    Name: 6261
    Health: 6
    Coins: 3
    CoordinatesAddress: 26d050
    Coordinates->x: 4
    Coordinates->y: 2
    Coordinates->z: 3
    InventoryAddress: 26d044
    Inventory[0]: 1
    Inventory[1]: 2
    Inventory[2]: 3
    

    x64打印结果:

    playerBaseAddress: 00007FF7CC8AD028
    Name: 6261
    Health: 6
    Coins: 3
    CoordinatesAddress: 7ff7cc8ad018
    Coordinates->x: 4
    Coordinates->y: 2
    Coordinates->z: 3
    InventoryAddress: 7ff7cc8ad000
    Inventory[0]: 1
    Inventory[1]: 2
    Inventory[2]: 3
    
  • 相关阅读:
    nmake不是内部或外部命令,也不是可运行的程序
    MinGW下载和安装教程
    Qt接单
    C++ web 框架
    原型链
    ssh: Could not resolve hostname的一种解决方案
    oracle客户端安装配置
    linux安装go
    golang 为什么结构体方法要写成指针传递
    traceback模块
  • 原文地址:https://www.cnblogs.com/ajanuw/p/13416188.html
Copyright © 2011-2022 走看看