C++隨筆(一)關於用int來表示一個物件指標並復原問題
阿新 • • 發佈:2019-03-30
昨天群裡一個老哥問我的,他去取了一個執行緒的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; }
突然覺得這種形式在某些特殊的函式委託情形下可以用來進行指標復原,