VC直接发送WM_DROPFILES消息,模拟拖拽动作代码

//模拟拖拽消息

BOOL CprjVPackV4BatchToolsDlg::FSendDropFile(CString strFilePath)
{
    int    nResult = FALSE;
    HWND   hMain = NULL;
    char   szFile[MAX_PATH] = {0};
    DWORD  dwBufSize   =   0; //sizeof(DROPFILES)   +   sizeof(szFile)   +   1;
    BYTE   *pBuf   =   NULL;
    DWORD  dwProcessId = 0;

    HANDLE hProcess    = 0;

    LPSTR  pszRemote = NULL;

    wcstombs(szFile,strFilePath.GetBuffer(0),_MAX_PATH);

    dwBufSize = sizeof(DROPFILES) + strlen(szFile) + 1;

    hMain = ::FindWindow(NULL,_T("免杀压缩壳 "));
    if ( hMain == NULL)
    {
        MessageBox(_T("不能找到加壳主程序!"));
        goto Exit0;
    }

    pBuf = new BYTE[dwBufSize];
    if (pBuf == NULL)
        goto Exit0;

    memset(pBuf,0,dwBufSize);
    DROPFILES *pDrop = (DROPFILES *)pBuf;
    pDrop->pFiles = sizeof(DROPFILES);
    strcpy((char *)(pBuf + sizeof(DROPFILES)), szFile);

    GetWindowThreadProcessId(hMain,&dwProcessId);
    if (0 == dwProcessId)
    {
        goto Exit0;
    }
    hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwProcessId);
    if (hProcess == 0)
    {
        goto Exit0;
    }
    pszRemote = (LPSTR)VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);

    if (NULL == pszRemote)
    {
        goto Exit0;
    }

    if(WriteProcessMemory(hProcess, pszRemote, pBuf, dwBufSize, 0))
    {
        ::SendMessage(hMain, WM_DROPFILES, (WPARAM)pszRemote, NULL);
    }
    else
    {
        goto Exit0;
    }
    nResult = TRUE;
Exit0:
    if (pszRemote)
    {
        VirtualFreeEx(hProcess, pszRemote, dwBufSize, MEM_DECOMMIT);
    }
    if (pBuf)
    {
        delete [] pBuf;
        pBuf = NULL;
    }
    if (hProcess)
    {
        CloseHandle(hProcess);
    }
    return nResult;
}

  

posted @ 2009-07-14 15:45  debugzhu  阅读(3222)  评论(0编辑  收藏  举报