发送wm_dropfiles消息

来源:百度文库 编辑:神马文学网 时间:2024/05/01 20:16:33
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 (pBuf)
    {
        delete [] pBuf;
        pBuf = NULL;
    }
    return nResult;
}