一.概念
記憶體截取,故名思意,軟體從記憶體中讀取\獲取自己想要知道的信息返回給用戶的一種記憶體讀寫的用法。常用於外掛、盜號、外掛程式等開發當中。二.實例代碼
常見的記憶體讀寫API有ReadProcessMemory。實例:
截取UC密碼(演示記憶體截取用)
/*----------------------------我是分割線----------------------- 此程式只為演示記憶體截取,BUG多多,截取密碼最好是與HOOK相結合。 ----------------------------我是分割線-----------------------*/ #include #include #include //懶得重複寫彈框,自定義一個函式實現,其實還是調用MessageBox void MyMessageBox(char* lpText) { MessageBox(NULL,lpText,"Error",0); } //讀取記憶體,所需參數為進程句柄和要讀取的基址 char* MyReadMemory(HANDLE hProcess,LPCVOID lpBaseAddress) { char *CountPt=new char[MAX_PATH]; ReadProcessMemory(hProcess,lpBaseAddress,CountPt,strlen(CountPt)+1,NULL); return CountPt; } //獲取進程PID,所需參數為進程名 DWORD GetProcessID(char* ProcessName) { PROCESSENTRY32 pe32; //獲取進程快照 HANDLE Procnap= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if(Procnap==INVALID_HANDLE_VALUE) { return 0; } //枚舉快照中的第一個進程 BOOL pdnap=Process32First(Procnap,&pe32); while(pdnap) { BOOL ReValue=true; //如果當前進程不是要找的進程名則查找下一個,這裡為uc.exe if(strcmp(pe32.szExeFile,ProcessName)!=0) { pdnap=Process32Next(Procnap,&pe32); } //否則查到到,返回進程PID else { return pe32.th32ProcessID;; } } return 0; } int main() { //進程名 char *ProcName="uc.exe"; DWORD Pid; //獲取進程PID Pid=GetProcessID(ProcName); if(Pid==0) { MyMessageBox("GetProcessID Error!"); return 0; } //打開進程 HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Pid); if(hProcess==NULL) { MyMessageBox("GetProcessID Error!"); return 0; } LPCVOID lpNameBase=(LPCVOID)0x01BA9FAA; //固定地址,包含UC號碼,暱稱和狀態 LPCVOID lpPassBase=(LPCVOID)0x01BFEF68; //密碼動態地址,各位自己調出來 //讀取記憶體中的內容 char* Countpt=MyReadMemory(hProcess,lpNameBase); char* MyPass=MyReadMemory(hProcess,lpPassBase); MyMessageBox(Countpt); MyMessageBox(MyPass); return 0; } |