C++随笔(一)关于用int来表示一个对象指针并复原问题

昨天群里一个老哥问我的,他去取了一个线程的DWORD地址,然后保存成为一个char* buffer,在接下来的使用过程中,把buffet内存储的指针地址赋值给一个变量hook那个线程,于是我寻思DWORD的定义

#define DWORD unsigned long

win32下面是4个字节大小,于是我写了个例子

#include <iostream>
#include<cstring>
#include <stdio.h>
using namespace std;
class test{
public:
  int id;
  test(int id){
      this->id=id;
  }
};
int main(int argc,char **argv){
    int a=20;
    test b(60);
	//用int*指针去保存b的地址
    int *p=(int*)&b;
    std::cout<<p<<std::endl;//输出:0x32fe08
    char buf[255]={0};
	//将刚才保存了b的地址的p格式化为一个十六进制数字的字符串
    sprintf(buf,"0x%x",p);
    std::cout<<buf<<std::endl;//输出:0x32fe08
	//将代表着b对象地址的十六进制的字符串buf转为int
    int ptr=std::stoi(buf,nullptr,16);int
	//将ptr的内存拷贝给同样4个字节大小的int变量a
    memcpy(&a,&ptr,4);
    std::cout<<a<<"  "<<ptr<<std::endl;//输出:2358792  2358792
    //通过类型转换从变量a中复原出test对象b
	std::cout<<((test*)(a))->id<<std::endl;//输出:60
    return 0;
}

突然觉得这种形式在某些特殊的函数委托情形下可以用来进行指针复原,于是就记下了。

转载于:https://my.oschina.net/VenusV/blog/3030004

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值