Никак немогу понять как передать в такой поток адреса 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; }
То есть записать значения в структуру через WriteProcessMemory ?И как мне тогда высчитать смещение для структуры?