VC进程相关的学习(一)(查找进程和内存读取)

想通过BHO获取FLASH AJAX通讯数据的想法是没治了,彻底走了弯路(%>_<%),老老实实走正路吧。
1 HANDLE HINSTANCE HMOUDLE都是同一样东西。
2 获取其他进程的HANDLE方法目前知道三种:
    a:由本进程打开

    PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); HANDLE process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_CREATE_THREAD|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pi.dwProcessId);

    b:查找HWND打开

    DWORD _pid; ::GetWindowThreadProcessId(_hwnd, &_pid); // 获得进程ID HANDLE _handle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, _pid); // 最高权限打开

    c:通过已加载的DLL获得

     // 因为加载DLL的GetModuleHandle就是应用程序的HANDLE HANDLE handle = GetModuleHandle(NULL) 

3 获取其他进程内存数据用readProcessMemory,自己进程直接指针指过去就好了
    MyHook.h

    #pragma once #include <string> using namespace std; class MyHook { enum MYHOOK_STATE { MYHOOK_NULL, MYHOOK_READY, }; public: MyHook(void); virtual ~MyHook(void); public: static MyHook& instance(); BOOL readProcessMemory(LPVOID pBuff, LPVOID pAddr, int nLength = 4); // 读取内存值 void init(const HWND& hwnd, const HANDLE& handle, bool bSelf = FALSE); // 初始化 void initByWindowName(const string& strName, bool isReal); void initByCreateProcess(const string& strCmd, const string& strParameter = ""); private: static BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam); // EnumWindows CALLBACK static string s_strWindowName; // 窗体名 void _initByWindowNameReal(const string& strName); // 用实名初始化进程 void _initByWindowNameSimilar(const string& strName); // 用相似名初始话进程 private: HWND _hwnd; // 窗体句柄 HANDLE _handle; // HANDLE bool _bSelf; // 是否为自己 MYHOOK_STATE _state; // 状态 static MyHook *s_instance; };    

    MyHook.cpp

    #include "StdAfx.h" #include "MyHook.h" MyHook* MyHook::s_instance = NULL; string MyHook::s_strWindowName = ""; MyHook::MyHook(void):_hwnd(0),_handle(0),_bSelf(FALSE),_state(MYHOOK_NULL) { } MyHook::~MyHook(void) { } MyHook& MyHook::instance() { if (s_instance == NULL) { static MyHook defaultInstance; s_instance = &defaultInstance; } return *s_instance; } void MyHook::init(const HWND& hwnd, const HANDLE& handle, bool bSelf) { _handle = handle; _hwnd = hwnd; _bSelf = bSelf; _state = MYHOOK_READY; } void MyHook::initByWindowName(const string& strName, bool isReal) { // 进程初始化 // strName 窗口名字符串 if(isReal) { _initByWindowNameReal(strName); } else { _initByWindowNameSimilar(strName); } } void MyHook::_initByWindowNameReal(const string& strName) { // 用实名初始化进程 DWORD pid; _hwnd = ::FindWindowA(NULL, strName.c_str()); ::GetWindowThreadProcessId(_hwnd, &pid); // 获得进程ID _handle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); // 最高权限打开 init(_hwnd, _handle); } void MyHook::_initByWindowNameSimilar(const string& strName) { // 用相似名初始话进程 s_strWindowName = strName; EnumWindows(lpEnumFunc, (LPARAM)this); } BOOL CALLBACK MyHook::lpEnumFunc(HWND hwnd, LPARAM lParam) { // EnumWindows CALLBACK // lParam为类指针 char strBuff[MAX_PATH]; MyHook* pMyHook = (MyHook*)lParam; GetWindowTextA(hwnd, strBuff, MAX_PATH); string strName = strBuff; if (strName.find(s_strWindowName) != string::npos) { HWND hwnd = ::FindWindowA(NULL, strName.c_str()); DWORD pid; ::GetWindowThreadProcessId(hwnd, &pid); // 获得进程ID HANDLE handle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); // 最高权限打开 pMyHook->init(hwnd, handle); } return TRUE; } void MyHook::initByCreateProcess(const string& strCmd, const string& strParameter) { STARTUPINFOA si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); if(CreateProcessA(strCmd.c_str(), const_cast<char*>(strParameter.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { HANDLE handle = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_CREATE_THREAD| PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pi.dwProcessId); // 打开进程 init(NULL, handle); } } BOOL MyHook::readProcessMemory(LPVOID pBuff, LPVOID pAddr, int nLength) { // 读取内存值 // pBuff 内存位置 // pAddr 地址 // nLength 长度 if(_state == MYHOOK_NULL) { return FALSE; } if(_bSelf) { memcpy(pBuff, pAddr, nLength); } else { ::ReadProcessMemory(_handle, pAddr, pBuff, nLength, NULL); } return TRUE; }   

你可能感兴趣的:(thread,String,null,query,Access,callback)