Подскажите с внедрением потока в чужой процесс

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 16 Oct 2010.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Никак немогу понять как передать в такой поток адреса LoadLibrary и GetProcAddress.Пробовал как с обычным потоком,ничего неполучилось :(
    Code:
    LPSTR UnicodeToAnsi(LPCWSTR s)
    {
    if (s==NULL) return NULL;
    int cw=lstrlenW(s);
    if (cw==0) {CHAR *psz=new CHAR[1];*psz='\0';return psz;}
    int cc=WideCharToMultiByte(CP_ACP,0,s,cw,NULL,0,NULL,NULL);
    if (cc==0) return NULL;
    CHAR *psz=new CHAR[cc+1];
    cc=WideCharToMultiByte(CP_ACP,0,s,cw,psz,cc,NULL,NULL);
    if (cc==0) {delete[] psz;return NULL;}
    psz[cc]='\0';
    return psz;
    }
    
    bool GetProcessByExeName(DWORD* Pid,std::string ExeName)
    {
    HANDLE hProcessSnap = NULL;
    PROCESSENTRY32 pe32= {0};
    std::string temp="";
    
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
    if(hProcessSnap == (void*)-1)
           {
           MessageBoxA(NULL, "er", "!", MB_OK|MB_ICONWARNING|MB_SYSTEMMODAL);
           return false;
           }
    pe32.dwSize=sizeof(PROCESSENTRY32);
    
    if(Process32First(hProcessSnap,&pe32)) 
    {
    	temp=std::string(UnicodeToAnsi(pe32.szExeFile));
    }
    if(strstr(temp.c_str(),ExeName.c_str())!=NULL)
          {
          *Pid= pe32.th32ProcessID;
          CloseHandle (hProcessSnap);
          return true;
          }
    pe32.dwSize=sizeof(PROCESSENTRY32);
    
    while(Process32Next(hProcessSnap,&pe32))
           {
    		   temp=std::string(UnicodeToAnsi(pe32.szExeFile));
    	   if(strstr(temp.c_str(),ExeName.c_str())!=NULL)
                   {
                   *Pid= pe32.th32ProcessID;
                   CloseHandle(hProcessSnap);
                   return true;
                   }
           pe32.dwSize=sizeof(PROCESSENTRY32);
           }
           
    CloseHandle(hProcessSnap);
    *Pid=0;
    return false;
    }
    typedef int(WINAPI *LoadLibraryD)(LPCTSTR);
    typedef int(WINAPI *GetProcAdressD)(HMODULE,LPCSTR);
    typedef int(WINAPI *MessageBoxD)(HWND,LPCTSTR,LPCTSTR,UINT);
    struct basefuncs
    {
    	DWORD LL;
    	DWORD GA;
    };
    DWORD _stdcall ThreadProc(LPVOID lParam)
    {
    	basefuncs *bs=(basefuncs*)lParam;
    	LoadLibraryD LoadLibraryd=(LoadLibraryD)bs->LL;
    	GetProcAdressD GetProcAdressd=(GetProcAdressD)bs->GA;
    	HMODULE	us=(HMODULE)LoadLibraryd((LPCTSTR)"User32.dll");
    	MessageBoxD MessageBoxd=(MessageBoxD)GetProcAdressd(us,(LPCSTR)"MessageBoxA");
    	MessageBoxd(0,(LPCTSTR)"!",(LPCTSTR)"!",MB_OK);
    	return(0);
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    	DWORD pid=0;
    	GetProcessByExeName(&pid,"qip.exe");
    	SetLastError(0);
    	void* p;
    	HANDLE ht;
    	DWORD rc;
    	HANDLE            hToken;
    	LUID              takeOwnershipValue;
    	TOKEN_PRIVILEGES  tkp;
    	OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
    	LookupPrivilegeValue(0, SE_SHUTDOWN_NAME, &takeOwnershipValue);
    	tkp.PrivilegeCount = 1;
    	tkp.Privileges[0].Luid = takeOwnershipValue;
    	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    	AdjustTokenPrivileges(hToken, false, &tkp, sizeof(TOKEN_PRIVILEGES), 0, 0);
    	HANDLE process = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
    	p = VirtualAllocEx(process,0,4096,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    	WriteProcessMemory(process,p,ThreadProc,4096,0);
    	HMODULE kernel=LoadLibraryA("Kernel32.dll");
    	GetProcAdressD GetProcAdressd=(GetProcAdressD)GetProcAddress(kernel,"GetProcAddress");
    	basefuncs bs;
    	ZeroMemory(&bs,sizeof(bs));
    	bs.LL=(DWORD)GetProcAdressd(kernel,"LoadLibraryA");
    	bs.GA=(DWORD)GetProcAdressd(kernel,"GetProcAddress");
    	ht = CreateRemoteThread(process,0,0,(DWORD(__stdcall*)(void*))p,(void*)&bs,0,&rc);
    	printf("%d",GetLastError());
    	getch();
    	return 0;
    }
    
    
     
  2. Catbert

    Catbert Banned

    Joined:
    29 Jun 2010
    Messages:
    80
    Likes Received:
    27
    Reputations:
    10
    http://www.rsdn.ru/article/baseserv/IntercetionAPI.xml
     
  3. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    То есть записать значения в структуру через WriteProcessMemory ?И как мне тогда высчитать смещение для структуры?
     
    #3 _nic, 16 Oct 2010
    Last edited: 16 Oct 2010