記憶體截取

記憶體截取,故名思意,軟體從記憶體中讀取\\ 常見的記憶體讀寫API有 實例:

一.概念

記憶體截取,故名思意,軟體從記憶體中讀取\獲取自己想要知道的信息返回給用戶的一種記憶體讀寫的用法。常用於外掛、盜號、外掛程式等開發當中。

二.實例代碼

常見的記憶體讀寫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;
}

相關詞條

熱門詞條

聯絡我們