none
怎么执行内存中exe, 请高人解答 RRS feed

  • 问题

  • 如题.

    目的是想将一个exe文件读入到内存, 然后从磁盘上删除, 接着执行这个保存在内存中的exe. 有没有什么办法做到?

     

     

    2010年10月11日 8:38

答案

  • 您好,

    您可以参考一下以下博文:

    http://webnumen.blog.hexun.com/19268347_d.html

    希望对您有所帮助。


    Daoping Liu - MSFT
    2010年10月13日 2:43
    版主
  • 你可以运行时把文件复制到临时目录 然后删除该文件 然后运行临时文件 console例子代码如下

     

     int main(int argc, char* argv[])
    {
     if (__argc == 1) {

     TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];

     GetModuleFileName(NULL, szPathOrig, _MAX_PATH);

     GetTempPath(_MAX_PATH, szPathClone);

     GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);

     CopyFile(szPathOrig, szPathClone, FALSE);

    //此处 FILE_FLAG_DELETE_ON_CLOSE表示当所有和此文件有关的句柄关闭后则删除文件(删除临时文件夹复制文件)

    HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);

     TCHAR szCmdLine[512];

    //SYNCHRONIZE同步 

    HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());

     wsprintf(szCmdLine, __TEXT("%s %d \"%s\""), szPathClone, hProcessOrig, szPathOrig);

     STARTUPINFO si;

     ZeroMemory(&si, sizeof(si));

     si.cb = sizeof(si);

     PROCESS_INFORMATION pi;

     CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);

     CloseHandle(hProcessOrig);

     CloseHandle(hfile);

     }

     else

    {

     HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);

     WaitForSingleObject(hProcessOrig, INFINITE);

     CloseHandle(hProcessOrig);
     printf("%s\n",__targv[2]);

    //删除真实目录的文件 此时内存运行的是临时目录的文件 原形完毕后会自动删除临时文件
     DeleteFile(__targv[2]);
     MessageBox(NULL,"","-----------------",MB_OK);; }

     return(0);
    }

     

    如果是带窗口程序 道理也是如此 比如在dialog程序里

    InitInstance()
    {
     把判断语句改为 判断命令行参数 如果为空字符则 其余代码相同 
      if (strcmp(m_lpCmdLine , "")==0)

     {...代码同上

    }

    else

    {

     HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);

     WaitForSingleObject(hProcessOrig, INFINITE);

     CloseHandle(hProcessOrig);
     printf("%s\n",__targv[2]);

    //删除真实目录的文件 此时内存运行的是临时目录的文件 原形完毕后会自动删除临时文件
     DeleteFile(__targv[2]);

    后面根对话框程序初始化代码 即原函数代码全放到这里来

     AfxEnableControlContainer();

     #ifdef _AFXDLL
     Enable3dControls();   // Call this when using MFC in a shared DLL
    #else
     Enable3dControlsStatic(); // Call this when linking to MFC statically
    #endif

    ...剩余代码
    }

     

    2010年10月13日 5:26

全部回复

  • 不能做到,你在执行EXE的时候这个文件是被加锁的,你是删不掉的
    0xBAADF00D
    • 已建议为答案 良好市民 2010年10月11日 11:05
    • 取消建议作为答案 Jack.arain 2010年10月12日 9:44
    2010年10月11日 9:35
    版主
  • 也许内存驻留程序就能做到
    2010年10月11日 11:11
  • 搜索程序自毁。 思路有几个。 在WinXP以前的版本可以直接Close程序文件句柄。 WinXP以后的版本可以在程序中添加代码,启动时拷贝自己,然后启动拷贝的文件,在拷贝的文件中删除源文件。这个拷贝的文件位置你可以藏起来。 或者使用Shell,启动程序,然后删除该程序文件
    麻烦把正确答案设为解答。
    2010年10月12日 2:30
    版主
  • 也许内存驻留程序就能做到
    win上怎么实现内存驻留程序?
    2010年10月12日 9:44
  • 您好,

    您可以参考一下以下博文:

    http://webnumen.blog.hexun.com/19268347_d.html

    希望对您有所帮助。


    Daoping Liu - MSFT
    2010年10月13日 2:43
    版主
  • 你可以运行时把文件复制到临时目录 然后删除该文件 然后运行临时文件 console例子代码如下

     

     int main(int argc, char* argv[])
    {
     if (__argc == 1) {

     TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];

     GetModuleFileName(NULL, szPathOrig, _MAX_PATH);

     GetTempPath(_MAX_PATH, szPathClone);

     GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);

     CopyFile(szPathOrig, szPathClone, FALSE);

    //此处 FILE_FLAG_DELETE_ON_CLOSE表示当所有和此文件有关的句柄关闭后则删除文件(删除临时文件夹复制文件)

    HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);

     TCHAR szCmdLine[512];

    //SYNCHRONIZE同步 

    HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());

     wsprintf(szCmdLine, __TEXT("%s %d \"%s\""), szPathClone, hProcessOrig, szPathOrig);

     STARTUPINFO si;

     ZeroMemory(&si, sizeof(si));

     si.cb = sizeof(si);

     PROCESS_INFORMATION pi;

     CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);

     CloseHandle(hProcessOrig);

     CloseHandle(hfile);

     }

     else

    {

     HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);

     WaitForSingleObject(hProcessOrig, INFINITE);

     CloseHandle(hProcessOrig);
     printf("%s\n",__targv[2]);

    //删除真实目录的文件 此时内存运行的是临时目录的文件 原形完毕后会自动删除临时文件
     DeleteFile(__targv[2]);
     MessageBox(NULL,"","-----------------",MB_OK);; }

     return(0);
    }

     

    如果是带窗口程序 道理也是如此 比如在dialog程序里

    InitInstance()
    {
     把判断语句改为 判断命令行参数 如果为空字符则 其余代码相同 
      if (strcmp(m_lpCmdLine , "")==0)

     {...代码同上

    }

    else

    {

     HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);

     WaitForSingleObject(hProcessOrig, INFINITE);

     CloseHandle(hProcessOrig);
     printf("%s\n",__targv[2]);

    //删除真实目录的文件 此时内存运行的是临时目录的文件 原形完毕后会自动删除临时文件
     DeleteFile(__targv[2]);

    后面根对话框程序初始化代码 即原函数代码全放到这里来

     AfxEnableControlContainer();

     #ifdef _AFXDLL
     Enable3dControls();   // Call this when using MFC in a shared DLL
    #else
     Enable3dControlsStatic(); // Call this when linking to MFC statically
    #endif

    ...剩余代码
    }

     

    2010年10月13日 5:26
  • 用二进制方式打开并读取exe,然后将读取的内容memcpy一份,然后关闭exe文件,然后手动删除磁盘上的exe文件。至于memcpy的那一份就看你怎么操作了。
    欢迎光临我的个人网站:http://www.joyvc.cn,本网站提供[IM即时通信|棋牌游戏|网游开发|UI编程|网络通讯|组件开发|图像多媒体|数据库]方面的VC/C++/C技术文章、源代码和教程资料
    2010年10月15日 9:26
    版主