VC++6.0长途调用Call

    添加时间:2013-6-13 点击量:

    VC++6.0长途调用Call


    转载:http://wodeball.blog.163.com/blog/static/69365999201242293613680/


    好久没来了,表情不好,又来到这熟悉又悼念的处所,伴我快一年多的处所,真的很感激伴我度过孤单的大半年。 
    又看到喜好的VC++,VC++这块一向很少有人揭晓,可能高手都忙吧。今天没事就发下我以前的长途调用Call。 
    有不好的处所大师可以斧正交换。 



    typedef struct ParamData    //参数布局 
    
    {
    long Param1;
    long Param2;
    DWORD Param3;
    DWORD Param4;
    }ParamData,
    Paramp;

    //
    //函数名:InfusionFunc
    //功能 :封装长途注入的函数
    //参数 1:过程ID
    //参数 2:被注入函数指针<函数名>
    //参数 3:参数
    //参数 4:参数长度
    //
    void InfusionFunc(DWORD dwProcId,LPVOID mFunc, LPVOID Param, DWORD ParamSize)
    {
    HANDLE hProcess;
    //长途句柄
    LPVOID mFuncAddr;//申请函数内存地址
    LPVOID ParamAddr;//申请参数内存地址
    HANDLE hThread; //线程句柄
    DWORD NumberOfByte; //帮助返回值
    CString str;
    //打开被注入的过程句柄
    hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcId);
    //申请内存
    mFuncAddr = VirtualAllocEx(hProcess,NULL,128,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    ParamAddr
    = VirtualAllocEx(hProcess,NULL,ParamSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    //写内存
    WriteProcessMemory(hProcess,mFuncAddr,mFunc,128, &NumberOfByte);
    WriteProcessMemory(hProcess,ParamAddr,Param,ParamSize,
    &NumberOfByte);
    //创建长途线程
    hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)mFuncAddr,
    ParamAddr,
    0,&NumberOfByte);
    WaitForSingleObject(hThread, INFINITE);
    //守候线程停止
    //开释申请有内存
    VirtualFreeEx(hProcess,mFuncAddr,128,MEM_RELEASE);
    VirtualFreeEx(hProcess,ParamAddr,ParamSize,MEM_RELEASE);
    //开释长途句柄
    CloseHandle(hThread);
    CloseHandle(hProcess);
    }

    //
    //函数名:CallAddhp
    //功能 :调用加血Call
    //
    void CallAddhp ()
    {
    DWORD dwAddr
    = 0 x00452E98;
    _asm
    {
    pushad
    mov eax,dword ptr DS:[
    0 x456D68]
    mov edx,
    0 x00453028
    call dwAddr
    popad
    }
    }

    //
    //函数名:CallAddhp
    //功能 :调用加法策画Call
    //
    void CallAdd(LPVOID lParam)
    {
    ParamData
    lp;
    lp
    =(ParamData )lParam;
    long lp1=(long)lp->Param1;
    long lp2=(long)lp->Param2;
    DWORD dwAddr
    = 0 x45992C;
    _asm
    {
    pushad
    pushad
    push lp2
    push lp1
    mov eax,dword ptr DS:[
    0 x461CF8]
    push eax
    call dwAddr
    popad
    }
    }


    下面是调用实例 



    //一例:调用无参Call 
    
    void CInfusionFunDlg::OnButton4()
    {
    // TODO: Add your control notification handler code here
    DWORD ProcessId=NULL;
    HWND hWnd
    = ::FindWindow(NULL,游戏找CALL操练实例one); //窗口题目取句柄
    GetWindowThreadProcessId(hWnd,&ProcessId);
    if(ProcessId==NULL)
       {
    ::AfxMessageBox(
    未找到过程);
       }
    else
    {
        InfusionFunc(ProcessId,CallAddhp,NULL,NULL);
    }
    }
    //二例:调用有参Call
    void CInfusionFunDlg::OnButtonAdd()
    {
    // TODO: Add your control notification handler code here
    DWORD ProcessId=NULL;
    HWND hWnd
    = ::FindWindow(NULL,F8 CALL 01); //窗口题目取句柄
    GetWindowThreadProcessId(hWnd,&ProcessId);
    ParamData CallParam;
    CallParam.Param1
    = atoi(m_edit1_text);
    CallParam.Param2
    = atoi(m_edit2_text);
    if(ProcessId==NULL)
       {
    ::AfxMessageBox(
    未找到过程);
      }
    else
    {
        InfusionFunc(ProcessId,CallAdd,
    &CallParam,sizeof(CallParam));
    }
    }


    我所有的自负皆来自我的自卑,所有的英雄气概都来自于我的软弱。嘴里振振有词是因为心里满是怀疑,深情是因为痛恨自己无情。这世界没有一件事情是虚空而生的,站在光里,背后就会有阴影,这深夜里一片寂静,是因为你还没有听见声音。—— 马良《坦白书》
    分享到: