首页
社区
课程
招聘
[求助]求懂VC和DELPHI的大侠帮忙
发表于: 2010-9-7 00:03 4505

[求助]求懂VC和DELPHI的大侠帮忙

2010-9-7 00:03
4505
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;
}

帮忙吧 上面的VC 代码转成DELPHI 的好吗 感谢了

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
貌似远线程注入啊
2010-9-7 20:19
0
雪    币: 348
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
goto....
2010-9-9 09:50
0
雪    币: 1126
活跃值: (156)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
你再多写点程序吧,这样的问题其实不该问。代码没有测试过,你自己调试改改。

function CprjVPackV4BatchToolsDlg.FSendDropFile(strFilePath: AnsiString): Boolean;
var
  dwBufferSize, dwProcessId: Dword;
  hMain: HWND;
  DropData: AnsiString;
  pDrop: PDROPFILES;
  hProcess: THandle;
  pszRemote: Pointer;
begin
  Result := False;
  hMain = FindWindow(nil, '主程序界面');  
  if ( hMain = nil)
  begin
    ShowMessage('不能找到主程序!');
    Exit;
  end;

  dwBufferSize := SizeOf(DROPFILES) + Length(strFilePath) + 1;
  SetLength(DropData, dwBufferSize);
  FillChar(PAnsiChar(DropData)^, dwBufferSize, 0);
  pDrop := PDROPFILES(PAnsiChar(DropData));  
  
  pDrop^.pFiles := SizeOf(DROPFILES);
  Move(PAnsiChar(strFilePath)^, (PAnsiChar(DropData) + SizeOf(DROPFILES))^, Length(strFilePath));
  
  GetWindowThreadProcessId(hMain, dwProcessId);
  if dwProcessId = 0 then Exit;
  
  hProcess := OpenProcess(PROCESS_VM_OPERATION   or   PROCESS_VM_WRITE,   FALSE,  dwProcessId);
  if hProcess = 0 then Exit;
  
  pszRemote := VirtualAllocEx(hProcess, nil, dwBufSize,   MEM_COMMIT,   PAGE_READWRITE);
  if (pszRemote <> nil) then
  begin
    if(WriteProcessMemory(hProcess,   pszRemote,   pBuf,   dwBufSize,   0)) then
    begin
      SendMessage(hMain, WM_DROPFILES, WPARAM(pszRemote), nil);
      Resullt := True;
    end;
    VirtualFreeEx(hProcess, pszRemote, 0, MEM_RELEASE);//内存泄露1
  end;
  CloseHandle(hProcess);//内存泄露2  
end;
2010-9-9 12:37
0
雪    币: 1262
活跃值: (770)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
貌似是我写的,被百度到这里来了疏忽了远程进程内存和句柄泄漏,多谢楼上提醒。
2010-9-9 13:53
0
游客
登录 | 注册 方可回帖
返回
//