Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 7 của 7
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    WriteProcessMemory ReadProcessMemory Đọc Ghi Memory Trên Process Khác

    Mình có 1 process đang chạy, mình có địa chỉ VA của 1 ô nhớ cần quản lý từ process đó,
    điều mình muốn hỏi là làm thế nào mình có thể quản lý ô nhớ đó từ app của mình : read, change,
    [IMG]images/smilies/1.gif[/IMG][IMG]images/smilies/1.gif[/IMG][IMG]images/smilies/1.gif[/IMG]
    (mình muốn thay đổi 1 giá trị trong app đó , và mình muốn thử thay đổi code của 1 hàm đã load lên mem của pe file đó bạn....)
    cám ơn các bạn đã chỉ mình

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    cậu sử dụng WriteProcessMemory nhé [IMG]images/smilies/wink.png[/IMG]

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    cám ơn cậu nhiều nhiều,
    tớ thử luôn
    hj hj

  4. #4
    Ngày tham gia
    Sep 2015
    Đang ở
    hà nội
    Bài viết
    0
    Không thể dùng thẳng ngay WriteProcessMemory được trừ phi bạn muốn ghi đè dữ liệu có sẵn của process không phải process của chương trình.

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi icttrack
    Không thể dùng thẳng ngay WriteProcessMemory được trừ phi bạn muốn ghi đè dữ liệu có sẵn của process không phải process của chương trình.
    cám ơn icttrack ,

    à cậu có code demo nào về vụ này ko share cho tớ với

    thanks so much

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    trước hết phải alloc vùng nhớ dành cho process muốn write sử dụng hàm VirtualAllocEx
    vd điển hình nhất cho việc WriteProcessmemory là InjectDLL

    VD
    Mã:
    #include <windows.h>
    #include <stdio.h>
    #include <tlhelp32.h>
    #include <shlwapi.h>
    
    #define PROCESS_NAME "Explorer.exe"
    #define DLL_NAME "UKHook40.dll"
    
    
    #define CREATE_THREAD_ACCESS (PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ)
     
    BOOL WriteProcessBYTES(HANDLE hProcess,LPVOID lpBaseAddress,LPCVOID lpBuffer,SIZE_T nSize);
    
    BOOL LoadDll(char *procName, char *dllName);
    BOOL InjectDLL(DWORD ProcessID, char *dllName);
    unsigned long GetTargetProcessIdFromProcname(char *procName);
    
    bool IsWindowsNT()
    {
    	// check current version of Windows
    	DWORD version = GetVersion();
    	// parse return
    	DWORD majorVersion = (DWORD)(LOBYTE(LOWORD(version)));
    	DWORD minorVersion = (DWORD)(HIBYTE(LOWORD(version)));
    	return (version < 0x80000000);
    }
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
    {
        if(IsWindowsNT())
    		LoadDll(PROCESS_NAME, DLL_NAME);
        else
    		MessageBox(0, "Your system does not support this method", "Error!", 0);
    	
        return 0;
    }
    
    
    BOOL LoadDll(char *procName, char *dllName)
    {
    	DWORD ProcID = 0;
    	
    	ProcID = GetTargetProcessIdFromProcname(procName);
    	
    	if(!(InjectDLL(ProcID, dllName)))
    		MessageBox(NULL, "Process located, but injection failed", "Loader", NULL);
    	
    	return true;
    }
    
    BOOL InjectDLL(DWORD ProcessID, char *dllName)
    {
    	HANDLE Proc;
    	char buf[50]={0};
    	LPVOID RemoteString, LoadLibAddy;
    	
    	if(!ProcessID)
    		return false;
    	
    	Proc = OpenProcess(CREATE_THREAD_ACCESS, FALSE, ProcessID);
    	
    	if(!Proc)
    	{
    		sprintf(buf, "OpenProcess() failed: %d", GetLastError());
    		MessageBox(NULL, buf, "Loader", NULL);
    		return false;
    	}
    	
    	LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
    	
    	RemoteString = (LPVOID)VirtualAllocEx(Proc, NULL, strlen(DLL_NAME), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
    	WriteProcessMemory(Proc, (LPVOID)RemoteString, dllName, strlen(dllName), NULL);
    	CreateRemoteThread(Proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL);   
    	
    	CloseHandle(Proc);
    	
    	return true;
    }
    
    unsigned long GetTargetProcessIdFromProcname(char *procName)
    {
    	PROCESSENTRY32 pe;
    	HANDLE thSnapshot;
    	BOOL retval, ProcFound = false;
    	
    	thSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	
    	if(thSnapshot == INVALID_HANDLE_VALUE)
    	{
    		MessageBox(NULL, "Error: unable to create toolhelp snapshot", "Loader", NULL);
    		return false;
    	}
    	
    	pe.dwSize = sizeof(PROCESSENTRY32);
    	
    	retval = Process32First(thSnapshot, &pe);
    	
    	while(retval)
    	{
    		if(StrStrI(pe.szExeFile, procName) )
    		{
    			ProcFound = true;
    			break;
    		}
    		
    		retval    = Process32Next(thSnapshot,&pe);
    		pe.dwSize = sizeof(PROCESSENTRY32);
    	}
    	
    	return pe.th32ProcessID;
    }

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi AlexF
    trước hết phải alloc vùng nhớ dành cho process muốn write sử dụng hàm VirtualAllocEx
    vd điển hình nhất cho việc WriteProcessmemory là InjectDLL

    VD
    Mã:
    #include <windows.h>
    #include <stdio.h>
    #include <tlhelp32.h>
    #include <shlwapi.h>
     
    #define PROCESS_NAME "Explorer.exe"
    #define DLL_NAME "UKHook40.dll"
     
     
    #define CREATE_THREAD_ACCESS (PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ)
     
    BOOL WriteProcessBYTES(HANDLE hProcess,LPVOID lpBaseAddress,LPCVOID lpBuffer,SIZE_T nSize);
     
    BOOL LoadDll(char *procName, char *dllName);
    BOOL InjectDLL(DWORD ProcessID, char *dllName);
    unsigned long GetTargetProcessIdFromProcname(char *procName);
     
    bool IsWindowsNT()
    {
        // check current version of Windows
        DWORD version = GetVersion();
        // parse return
        DWORD majorVersion = (DWORD)(LOBYTE(LOWORD(version)));
        DWORD minorVersion = (DWORD)(HIBYTE(LOWORD(version)));
        return (version < 0x80000000);
    }
     
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
    {
        if(IsWindowsNT())
            LoadDll(PROCESS_NAME, DLL_NAME);
        else
            MessageBox(0, "Your system does not support this method", "Error!", 0);
     
        return 0;
    }
     
     
    BOOL LoadDll(char *procName, char *dllName)
    {
        DWORD ProcID = 0;
     
        ProcID = GetTargetProcessIdFromProcname(procName);
     
        if(!(InjectDLL(ProcID, dllName)))
            MessageBox(NULL, "Process located, but injection failed", "Loader", NULL);
     
        return true;
    }
     
    BOOL InjectDLL(DWORD ProcessID, char *dllName)
    {
        HANDLE Proc;
        char buf[50]={0};
        LPVOID RemoteString, LoadLibAddy;
     
        if(!ProcessID)
            return false;
     
        Proc = OpenProcess(CREATE_THREAD_ACCESS, FALSE, ProcessID);
     
        if(!Proc)
        {
            sprintf(buf, "OpenProcess() failed: %d", GetLastError());
            MessageBox(NULL, buf, "Loader", NULL);
            return false;
        }
     
        LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
     
        RemoteString = (LPVOID)VirtualAllocEx(Proc, NULL, strlen(DLL_NAME), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
        WriteProcessMemory(Proc, (LPVOID)RemoteString, dllName, strlen(dllName), NULL);
        CreateRemoteThread(Proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)RemoteString, NULL, NULL);   
     
        CloseHandle(Proc);
     
        return true;
    }
     
    unsigned long GetTargetProcessIdFromProcname(char *procName)
    {
        PROCESSENTRY32 pe;
        HANDLE thSnapshot;
        BOOL retval, ProcFound = false;
     
        thSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
     
        if(thSnapshot == INVALID_HANDLE_VALUE)
        {
            MessageBox(NULL, "Error: unable to create toolhelp snapshot", "Loader", NULL);
            return false;
        }
     
        pe.dwSize = sizeof(PROCESSENTRY32);
     
        retval = Process32First(thSnapshot, &pe);
     
        while(retval)
        {
            if(StrStrI(pe.szExeFile, procName) )
            {
                ProcFound = true;
                break;
            }
     
            retval    = Process32Next(thSnapshot,&pe);
            pe.dwSize = sizeof(PROCESSENTRY32);
        }
     
        return pe.th32ProcessID;
    }
    úi mắc quá bây giờ mới ra nét ngồi được,[IMG]images/smilies/1.gif[/IMG][IMG]images/smilies/1.gif[/IMG][IMG]images/smilies/1.gif[/IMG]
    cám ơn cậu nhiều lắm.....

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •