none
VC6.0 WriteProcessMemory的问题 RRS feed

  • 问题

  • 做远线程注入时,需要用到WriteProcessMemory,在VC++6.0中,第三个参数始终是有问题。

    在我直接用char *str="D://VC6Common//MSDev98//MyProjects//testexe//dllhk.dll";时,能正常写入。

    但是在我获取自身路径,修改字符串后再写,就写不进去了。

    这个代码在VC2010测试又是正常的,太诡异了。


    代码如下:



    POINT pt;
    ::GetCursorPos(&pt);
    HWND t_hWnd=::WindowFromPoint(pt);//随便取个句柄,指到哪个就注入哪个。
    const DWORD THREADSIZE=1024*4;
    HANDLE pRThread,hRProcess;
    PTHREAD_START_ROUTINE pfnAddr = NULL;
    DWORD pId = 0;
    void *pFileRemote = NULL;
    ::GetWindowThreadProcessId(t_hWnd,&pId); //获取目标句柄的PID
    hRProcess=::OpenProcess(PROCESS_ALL_ACCESS,false,pId); //打开进程
    pFileRemote=::VirtualAllocEx(hRProcess,0,THREADSIZE,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);//分配内存空间。
    TCHAR tchr[256];
    ::GetCurrentDirectory(256,tchr);//这里用GetModuleFileName也是一样的。
    CString str(tchr);
    str=str+"//dllhk.dll";
    str.Replace("\\","//");
    //char *str2=str.GetBuffer(0);//尝试过这样也写不进去,还尝试过强制转换char *str=(LPSTR)(LPCTSTR)str;也不行。
    //MessageBox(str2);//这里弹出来看是正常的。
    if(!::WriteProcessMemory(hRProcess,pFileRemote,str.GetBuffer(0),THREADSIZE,NULL)){
    MessageBox("写入DLL路径失败!");
    return;
    }
    pfnAddr=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryA"); //获取API地址
    pRThread=::CreateRemoteThread(hRProcess,NULL,0,pfnAddr,pFileRemote,0,NULL);//注入线程
    if(pRThread==NULL){
    return;
    }else{
    MessageBox("注入成功");
    }
    2011年11月20日 10:18

答案

  • 目前已解决,这个问题的原因在于CString,只要是通过CString处理过的字符串,最后无论怎样转换到char,都无法正常写入。

    我只能自己写一个替换字符串的函数来操作。

    代码如下:

    //非原创,代码出处:http://wenku.baidu.com/view/9819c4d149649b6648d74798.html

    int ReplaceStr(char* sSrc, char* sMatchStr, char* sReplaceStr)
    {
     int StringLen;
     char caNewString[64];
     char* FindPos;
     FindPos = (char*)strstr(sSrc,sMatchStr);
     if(!FindPos||!sMatchStr)
      return -1;

     while(FindPos)
     {
      memset(caNewString, 0, sizeof(caNewString));
      StringLen = FindPos - sSrc;
      strncpy(caNewString, sSrc, StringLen);
      strcat(caNewString, sReplaceStr);
      strcat(caNewString, FindPos+strlen(sMatchStr));
      strcpy(sSrc, caNewString);
      FindPos = (char*)strstr(sSrc, sMatchStr);
     }
     free(FindPos);
     return 0;

    }

    • 已标记为答案 Gnorth 2011年11月20日 12:17
    2011年11月20日 12:16

全部回复

  • 目前已解决,这个问题的原因在于CString,只要是通过CString处理过的字符串,最后无论怎样转换到char,都无法正常写入。

    我只能自己写一个替换字符串的函数来操作。

    代码如下:

    //非原创,代码出处:http://wenku.baidu.com/view/9819c4d149649b6648d74798.html

    int ReplaceStr(char* sSrc, char* sMatchStr, char* sReplaceStr)
    {
     int StringLen;
     char caNewString[64];
     char* FindPos;
     FindPos = (char*)strstr(sSrc,sMatchStr);
     if(!FindPos||!sMatchStr)
      return -1;

     while(FindPos)
     {
      memset(caNewString, 0, sizeof(caNewString));
      StringLen = FindPos - sSrc;
      strncpy(caNewString, sSrc, StringLen);
      strcat(caNewString, sReplaceStr);
      strcat(caNewString, FindPos+strlen(sMatchStr));
      strcpy(sSrc, caNewString);
      FindPos = (char*)strstr(sSrc, sMatchStr);
     }
     free(FindPos);
     return 0;

    }

    • 已标记为答案 Gnorth 2011年11月20日 12:17
    2011年11月20日 12:16
  • Gnorth 你好!

    恭喜你在这么短的时间内就把问题解决了,我很为你感到高兴。

    我期待与您的再次合作。

    祝好运


    Helen Zhao [MSFT]
    MSDN Community Support | Feedback to us
    2011年11月22日 2:04