谁帮我用C写个简单的DLL
这个DLL是被远线程插入到别的进程中去的,主要功能就是用来监视我用VB写的一个程序进程是否在系统中运行,如果不存在就运行这个程序。因为我这里不能安装VC6,2003的系统,不知道为什么装不进,奇怪。只好来求助了,希望能帮帮忙^_^!感激不尽。我不是用来搞病毒和木马的破坏,是我用VB写的一个系统保护程序自身不安全,容易被结束,所以想用这个方法^_^。用个定时器,1000毫秒FindProcess一次,如果未发现就CreateProcess,写成动态链接库,可远线程插入别的进程中运行。
//
// FindProcess
// 这个函数唯一的参数是你指定的进程名,如:你的目标进程
// 是 "Notepad.exe",返回值是该进程的ID,失败返回0
//DWORD FindProcess(char *strProcessName)
{
    DWORD aProcesses[1024], cbNeeded, cbMNeeded;
    HMODULE hMods[1024];
    HANDLE hProcess;
    char szProcessName[MAX_PATH];    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )  return 0;
    for(int i=0; i< (int) (cbNeeded / sizeof(DWORD)); i++)
    {
        //_tprintf(_T("%d\t"), aProcesses[i]);
        hProcess = OpenProcess(  PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);
        EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbMNeeded);
        GetModuleFileNameEx( hProcess, hMods[0], szProcessName,sizeof(szProcessName));
       
        if(strstr(szProcessName, strProcessName))
        {
            //_tprintf(_T("%s;"), szProcessName);
            return(aProcesses[i]);
        }
        //_tprintf(_T("\n"));
    }
    return 0;

解决方案 »

  1.   

    将代码注入其他进程的三种方法:
    http://www.codeproject.com/KB/threads/winspy.aspx (可以下载代码)
      

  2.   

    ZT:int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])  
    {  
      int nRetCode = 0;  
        char szFilePath[]="e:\\Remotedll.dll";  
      int size=(lstrlen(szFilePath)+1)*sizeof(char);  
     
     
      // initialize MFC and print and error on failure  
      if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))  
      {  
      // TODO: change error code to suit your needs  
      cerr << _T("Fatal Error: MFC initialization failed") << endl;  
      nRetCode = 1;  
      }  
      else  
      {  
      // TODO: code your application's behavior here.  
      EnableDebugPriv();  
      HANDLE hWnd = ::OpenProcess (PROCESS_ALL_ACCESS,FALSE,812);  
      if(!hWnd)  
      {  
      cout<<"OpenProcess error!"<<endl;  
      return 0;  
      }  
      TempStruc *pRemoteAddress=(TempStruc *)VirtualAllocEx(hWnd,NULL,size,MEM_COMMIT,PAGE_READWRITE);  
      if(pRemoteAddress==NULL)  
      {  
        cout<<"VirtualAllocEx error!"<<endl;  
      return 0;  
      }  
      if(!::WriteProcessMemory(hWnd,pRemoteAddress,szFilePath,size,0))  
      {  
      cout<<"WriteProcessMemory error!"<<endl;  
      return 0;  
      }  
          DWORD pLoadLibraryAddress=(DWORD)GetProcAddress(GetModuleHandle("Kernel32.dll"),"LoadLibraryA");  
          CreateRemoteThread(hWnd,NULL,0,(DWORD(__stdcall *)(void *))pLoadLibraryAddress,pRemoteAddress, 0, NULL);  
      }  
     
      return nRetCode;  
    }  
     
      void EnableDebugPriv( void )  
      {  
      HANDLE hToken;  
      LUID sedebugnameValue;  
      TOKEN_PRIVILEGES tkp;  
     
      if ( ! OpenProcessToken( GetCurrentProcess(),  
      TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )  
      return;  
      if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) ){  
      CloseHandle( hToken );  
      return;  
      }  
      tkp.PrivilegeCount = 1;  
      tkp.Privileges[0].Luid = sedebugnameValue;  
      tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  
      if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )  
      CloseHandle( hToken );  
    }
      

  3.   

    晕,我不是要远线程的代码,是要被插入的DLL的文件,我这里不能安装VC6!DLL的功能就是用定时器每隔1秒查找目标进程是否存在,不存在就创建这个进程。