سلام.سوالم این بود که چجوری میشه در cpp به یک آدرس از حافظه RAM مثلا 0374351c مقدار داد.ممنون.
Printable View
سلام.سوالم این بود که چجوری میشه در cpp به یک آدرس از حافظه RAM مثلا 0374351c مقدار داد.ممنون.
باید از API استفاده کنی اول با VirtualProtect از اون آدرس دسترسی نوشتن بگیری (البته اگه آدرس معتبری باشه)
بعد با memcpy روش می نویسی ، توضیحات بیشتر در مورد این دو تابع رو بهتره از MSDN ببینید
این یک مثال به این صورت است که در آدرسی که گفتین به طول 5 بایت مقدار 0x90 رو مینویسه
اینجا من فرض کردم که میخوای آدرسی از پروسه خودت رو تغییر بدی، اگه روی حافظه پروسه های دیگه بخوای بنویسی
یکم فرق میکنه اگه ایجوری بگو برات توضیح میدم
کد:#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#define BUF_SIZE 5
int main()
{
DWORD dwAddr = 0x0374351c;
DWORD dwOldProtect;
LPSTR lpBuf = "\x90\x90\x90\x90\x90";
if ( !VirtualProtect((LPVOID) dwAddr, BUF_SIZE, PAGE_READWRITE, &dwOldProtect) )
{
fprintf(stderr, "Error on getting new page protection \n");
exit(-1);
}
memcpy((LPVOID) dwAddr, (LPVOID) lpBuf, BUF_SIZE);
printf("Data successfully write on specific address.\n");
return 0;
}
اگه ممکنه روش نوشتن بر روی حافظه پروسه های دیگر و هم بگید.ممنون.
با سلام.
اگر منظورتون از پروسه های دیگر همون برنامه های در حال اجرا غیر از برنامه ی خودتان می باشد ،
باید بهتون بگم که این امر در ویندوز شدنی نیست ، زیرا بعد از دستور دسترسی به خانه ای از حافظه
غیر از خانه های برنامه ی خودتان سیستم عامل شما را به عنوان یک برنامه ی نفوذ گر شناسایی خواهد کرد
و اجازه دسترسی برای نرم افزار شما صادر نخواهد کرد ، حتی ممکن است برنامه ی شما را ببندد.
برای نوشتن روی حافظه دیگر پروسه ها باید با استفاده از تابع OpenProcess یه هندل از اون پروسه بگیری اینجا از VirtualProtectEx و WriteProcessMemory استفاده میکنیم
این یه مثال برای اینکار، باید PID پروسه ی مورد نظر رو گرفت برای همین کدنویسیش یکم بیشتر شده
پروسه رو program.exe در نظر گرفتم.
کد:#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 5
static LPSTR process_name = "program.exe";
DWORD GetPID(LPSTR ProcName)
{
HANDLE hSnap;
PROCESSENTRY32 p32;
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
memset(&p32, 0, sizeof(PROCESSENTRY32));
p32.dwSize = sizeof(PROCESSENTRY32);
if ( !Process32First(hSnap, &p32) )
return -1;
do
{
if ( _stricmp(ProcName, p32.szExeFile) == 0 )
return p32.th32ProcessID;
}while(Process32Next(hSnap, &p32));
return -1;
}
int main()
{
HANDLE hProcess;
LPSTR lpBuf = "\x90\x90\x90\x90\x90";
DWORD dwAddr = 0x0374351c;
DWORD dwOldProtect;
DWORD dwPID = -1;
dwPID = GetPID( process_name );
if ( dwPID == -1 )
{
fprintf(stderr, "Error on getting PID of process.\n");
exit(-1);
}
hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwPID);
if ( !VirtualProtectEx(hProcess, (LPVOID) dwAddr, BUF_SIZE, PAGE_READWRITE, &dwOldProtect) )
{
fprintf(stderr, "Error on getting new page protection.\n");
exit(-1);
}
if ( !WriteProcessMemory(hProcess, (LPVOID) dwAddr, (LPVOID) lpBuf, BUF_SIZE, NULL) )
{
fprintf(stderr, "Error on write on memory :(\n");
exit(-1);
}
printf("Data successfully write on specific address.\n");
return 0;
}
مشکلم حل شد.خیلی ممنون.