昨天群里一个老哥问我的,他去取了一个线程的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;
}
突然觉得这种形式在某些特殊的函数委托情形下可以用来进行指针复原,于是就记下了。