Передача параметров в поток(CreateRemoteThread)

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 16 окт 2010.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Способ для обычного потока неподходит в этом случае
    Код (Text):
    1. LPSTR UnicodeToAnsi(LPCWSTR s)
    2. {
    3. if (s==NULL) return NULL;
    4. int cw=lstrlenW(s);
    5. if (cw==0) {CHAR *psz=new CHAR[1];*psz='\0';return psz;}
    6. int cc=WideCharToMultiByte(CP_ACP,0,s,cw,NULL,0,NULL,N  ULL);
    7. if (cc==0) return NULL;
    8. CHAR *psz=new CHAR[cc+1];
    9. cc=WideCharToMultiByte(CP_ACP,0,s,cw,psz,cc,NULL,N  ULL);
    10. if (cc==0) {delete[] psz;return NULL;}
    11. psz[cc]='\0';
    12. return psz;
    13. }
    14.  
    15. bool GetProcessByExeName(DWORD* Pid,std::string ExeName)
    16. {
    17. HANDLE hProcessSnap = NULL;
    18. PROCESSENTRY32 pe32= {0};
    19. std::string temp="";
    20.  
    21. hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);
    22. if(hProcessSnap == (void*)-1)
    23.        {
    24.        MessageBoxA(NULL, "er", "!", MB_OK|MB_ICONWARNING|MB_SYSTEMMODAL);
    25.        return false;
    26.        }
    27. pe32.dwSize=sizeof(PROCESSENTRY32);
    28.  
    29. if(Process32First(hProcessSnap,&pe32))
    30. {
    31.     temp=std::string(UnicodeToAnsi(pe32.szExeFile));
    32. }
    33. if(strstr(temp.c_str(),ExeName.c_str())!=NULL)
    34.       {
    35.       *Pid= pe32.th32ProcessID;
    36.       CloseHandle (hProcessSnap);
    37.       return true;
    38.       }
    39. pe32.dwSize=sizeof(PROCESSENTRY32);
    40.  
    41. while(Process32Next(hProcessSnap,&pe32))
    42.        {
    43.            temp=std::string(UnicodeToAnsi(pe32.szExeFile));
    44.        if(strstr(temp.c_str(),ExeName.c_str())!=NULL)
    45.                {
    46.                *Pid= pe32.th32ProcessID;
    47.                CloseHandle(hProcessSnap);
    48.                return true;
    49.                }
    50.        pe32.dwSize=sizeof(PROCESSENTRY32);
    51.        }
    52.        
    53. CloseHandle(hProcessSnap);
    54. *Pid=0;
    55. return false;
    56. }
    57. typedef int(WINAPI *LoadLibraryD)(LPCTSTR);
    58. typedef int(WINAPI *GetProcAdressD)(HMODULE,LPCSTR);
    59. typedef int(WINAPI *MessageBoxD)(HWND,LPCTSTR,LPCTSTR,UINT);
    60. struct basefuncs
    61. {
    62.     DWORD LL;
    63.     DWORD GA;
    64. };
    65. DWORD _stdcall ThreadProc(LPVOID lParam)
    66. {
    67.     basefuncs *bs=(basefuncs*)lParam;
    68.     LoadLibraryD LoadLibraryd=(LoadLibraryD)bs->LL;
    69.     GetProcAdressD GetProcAdressd=(GetProcAdressD)bs->GA;
    70.     HMODULE us=(HMODULE)LoadLibraryd((LPCTSTR)"User32.dll");
    71.     MessageBoxD MessageBoxd=(MessageBoxD)GetProcAdressd(us,(LPCSTR  )"MessageBoxA");
    72.     MessageBoxd(0,(LPCTSTR)"!",(LPCTSTR)"!",MB_OK);
    73.     return(0);
    74. }
    75. int _tmain(int argc, _TCHAR* argv[])
    76. {
    77.     DWORD pid=0;
    78.     GetProcessByExeName(&pid,"qip.exe");
    79.     SetLastError(0);
    80.     void* p;
    81.     HANDLE ht;
    82.     DWORD rc;
    83.     HANDLE            hToken;
    84.     LUID              takeOwnershipValue;
    85.     TOKEN_PRIVILEGES  tkp;
    86.     OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_  PRIVILEGES | TOKEN_QUERY, &hToken);
    87.     LookupPrivilegeValue(0, SE_SHUTDOWN_NAME, &takeOwnershipValue);
    88.     tkp.PrivilegeCount = 1;
    89.     tkp.Privileges[0].Luid = takeOwnershipValue;
    90.     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    91.     AdjustTokenPrivileges(hToken, false, &tkp, sizeof(TOKEN_PRIVILEGES), 0, 0);
    92.     HANDLE process = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
    93.     p = VirtualAllocEx(process,0,4096,MEM_COMMIT,PAGE_EXEC  UTE_READWRITE);
    94.     WriteProcessMemory(process,p,ThreadProc,4096,0);
    95.     HMODULE kernel=LoadLibraryA("Kernel32.dll");
    96.     GetProcAdressD GetProcAdressd=(GetProcAdressD)GetProcAddress(kern  el,"GetProcAddress");
    97.     basefuncs bs;
    98.     ZeroMemory(&bs,sizeof(bs));
    99.     bs.LL=(DWORD)GetProcAdressd(kernel,"LoadLibraryA");
    100.     bs.GA=(DWORD)GetProcAdressd(kernel,"GetProcAddress");
    101.     ht = CreateRemoteThread(process,0,0,(DWORD(__stdcall*)(  void*))p,(void*)&bs,0,&rc);
    102.     printf("%d",GetLastError());
    103.     getch();
    104.     return 0;
    105. }
    Как же можно передать данные в удаленный поток?
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    _nic
    А в чем проблема? bs надо записать в ап процесса цели с помощью WriteProcessMemory
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    До или после запуска потока?Или инициализация переменных в потоке неимеет значения?И как тогдап просчитать смещение что бы точно попасть на структуру?
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    _nic
    Выделяешь память по адресу (VirtualAllocEx), пишешь (WriteProcessMemory), вызываешь поток(CreateRemoteThread) как параметр адрес выделенной памяти. Вот также как ты код инжектешь, так же и записывай данные.
     
  5. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    И как их потом прочитать из потока?
     
  6. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    Если таким образом выделяешь память,
    Код (Text):
    1. p = VirtualAllocEx(process,0,4096,MEM_COMMIT,PAGE_EXEC  UTE_READWRITE);
    то адрес выделенной памяти заранее не определен, значит вычислить его нужно уже в удаленном потоке, через дельта смещение. Из потока читать по относительному адресу.
     
  7. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Причем здесь дельтам смещение?И опять же как я передам этот адрес в поток?
     
  8. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    поток сам должен найти это адрес:

    Код (Text):
    1. Call $ + 5
    2. pop eax
    3. xor ax, ax
    Так получите адрес по которому записан поток. Относительно него на фиксированном расстоянии должны быть записаны данные.
     
  9. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Код (Text):
    1.     basefuncs bs;
    2.     ZeroMemory(&bs,sizeof(bs));
    3.     bs.LL=(DWORD)GetProcAdressd(kernel,"LoadLibraryA");
    4.     bs.GA=(DWORD)GetProcAdressd(kernel,"GetProcAddress");
    5.     ht = CreateRemoteThread(process,0,0,(DWORD(__stdcall*)(  void*))p,(void*)&bs,0,&rc);
    (void*)&bs видишь? это адрес в твоем ап, в этом параметре ты должен передать адрес в ап процесса цели. Ты вообще сам этот код писал?
     
  10. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Код (Text):
    1. HANDLE WINAPI CreateRemoteThread(
    2.   __in   HANDLE hProcess,
    3.   __in   LPSECURITY_ATTRIBUTES lpThreadAttributes,
    4.   __in   SIZE_T dwStackSize,
    5.   __in   LPTHREAD_START_ROUTINE lpStartAddress,
    6.   __in   LPVOID lpParameter,
    7.   __in   DWORD dwCreationFlags,
    8.   __out  LPDWORD lpThreadId
    9. );
    Читаем вдумчиво.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    В контексте передать нельзя чтоле.
     
  12. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Код (Text):
    1. ............................................
    2.            basefuncs bs;
    3.     ZeroMemory(&bs,sizeof(bs));
    4.     bs.LL=(DWORD)GetProcAdressd(kernel,"LoadLibraryA");
    5.     bs.GA=(DWORD)GetProcAdressd(kernel,"GetProcAddress");
    6.     void *d=VirtualAllocEx(process,0,sizeof(basefuncs),MEM_COMMIT,PAGE_READWRITE);
    7.     WriteProcessMemory(process,d,(void*)&bs,sizeof(basefuncs),0);
    8.     ht = CreateRemoteThread(process,0,0,(DWORD(__stdcall*)(void*))p,d,0,&rc);
    9. ............................................
    неработает так,процесс цель вылетает.Или я чего то непонял?
     
  13. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    _nic
    логику вроде правильно уловил, дальше отладка :derisive:
     
  14. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Адрес данных то ведь абсолютным получается.Может ли тот поток что либо читать по этому адресу??Я думаю по этому неработает.Или я неправ?
     
  15. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Вобщем тупо отнять от адреса данных адрес потока не работает.Подскажите нужную арифметику плз.
     
  16. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    _nic
    не нужна никакая арифметика. Потоку надо передать адрес, который вернула VirtualAllocEx. Если что-то падает, то поставь точку останова в начало ф-ии потока, и смотри, что не так.
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    _nic
    Коденг видимо не ваше занятие, комерц поможет =)
     
  18. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Как можно не разобраться в трех вызовах документированных апи?

    Код (Text):
    1. static void injectLibrary()
    2. {
    3.     ULONG bw;
    4.     ShellCodeParams scParams = {0};
    5.  
    6.     strcpy(scParams.libName, getLibName());
    7.     strcpy(scParams.loadLibStr, "LoadLibraryA");
    8.     strcpy(scParams.freeLibStr, "FreeLibrary");
    9.     strcpy(scParams.setEventStr, "SetEvent");
    10.     strcpy(scParams.closeHandleStr, "CloseHandle");
    11.     strcpy(scParams.openEventStr, "OpenEventA");
    12.     strcpy(scParams.setStateStr, "setState");
    13.     strcpy(scParams.eventName, "Global\\BOProtoDumperEvent");
    14.     wcscpy(scParams.kernelName, L"kernel32.dll");
    15.     scParams.opType = shellcodeLoadLibrary;
    16.     g_shellcodeStart = VirtualAllocEx(g_hProc, 0, (UCHAR *)shellcodeStubEnd - (UCHAR *)shellcodeStub + sizeof(scParams), MEM_COMMIT, PAGE_READWRITE);
    17.     WriteProcessMemory(g_hProc, g_shellcodeStart, &scParams, sizeof(scParams), &bw);
    18.     WriteProcessMemory(g_hProc, g_shellcodeStart + sizeof(scParams), (UCHAR *)shellcodeStub, (UCHAR *)shellcodeStubEnd - (UCHAR *)shellcodeStub, &bw);
    19.     CloseHandle(CreateRemoteThread(g_hProc, 0, 0, (LPTHREAD_START_ROUTINE)(g_shellcodeStart + sizeof(scParams)), g_shellcodeStart, 0, &bw));
    20. }
    21.  
    22. ULONG shellcodeStub(ShellCodeParams *params)
    23. {
    24.     HANDLE hKernel, hEvent;
    25.     pLoadLibrary _LoadLibrary;
    26.     pSetEvent _SetEvent;
    27.     pFreeLibrary _FreeLibrary;
    28.     pCloseHandle _CloseHandle;
    29.     pOpenEvent _OpenEvent;
    30.  
    31.     hKernel = GetModuleBase(params->kernelName);
    32.     _LoadLibrary = xGetProcAddress(hKernel, params->loadLibStr);
    33.     _SetEvent = xGetProcAddress(hKernel, params->setEventStr);
    34.     _FreeLibrary = xGetProcAddress(hKernel, params->freeLibStr);
    35.     _CloseHandle = xGetProcAddress(hKernel, params->closeHandleStr);
    36.     _OpenEvent = xGetProcAddress(hKernel, params->openEventStr);
    37.     hEvent = _OpenEvent(EVENT_ALL_ACCESS, FALSE, params->eventName);
    38.     if (params->opType == shellcodeLoadLibrary)
    39.     {
    40.         params->hMod = _LoadLibrary(params->libName);
    41.         params->setStateProc = xGetProcAddress(params->hMod, params->setStateStr);
    42.     } else
    43.     {
    44.         _FreeLibrary(params->hMod);
    45.     }
    46.     _SetEvent(hEvent);
    47.     _CloseHandle(hEvent);
    48. }
     
  19. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    А разве можно отлаживать код в чужом адресном пространстве? Вбил напрямую адреса ф-ций в код,Все равно падает :dntknw:
     
  20. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    n0name
    Если честно по моему, ваш код не полон.Что такое GetModuleBase и xGetProcAddress ? инлайновое что-то как я понимаю)

    _nic
    Строки передавай как n0name