инжект в машинный код

Тема в разделе "LANGS.C", создана пользователем BadLogin, 1 апр 2009.

  1. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Про stdafx забудь, у мну не работает пример вываливаетс с "Попытка обращения к неверному адресу"
    вот здесь
    Код (Text):
    1. char* hNewModule = (char*)VirtualAllocEx(hProc,hModule,size,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    2.   if(hNewModule==NULL) return false;
     
  2. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    Не думаю, что просить выделить память по этому адресу - хорошая идея.
     
  3. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    Если тебе просто нужно там что-то изменить просто юзай WriteProcessMemory, не надо аллокать. А еще лучше перепиши в FASM.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Угу, тем более у эксплорера, к которому м.б. подключена куча шелл-экстов фиг знает по каким адресам.
    Хотя, у меня по этому адресу память в эксплорере нормально выделяется. Поэтому причина м.б. смешной - возможно память при одном из запусков все же выделилась, но произошел облом в другом месте, но поскольку выделенная память не освобождается, то при последующих попытках происходит обломс. Надо бы сделать рестарт системы и добавить в код ожидание завершения потока с последующим освобождением выделенной памяти
     
  5. jaja

    jaja New Member

    Публикаций:
    0
    Регистрация:
    23 июл 2008
    Сообщения:
    243
    Кстати, поменял hModule на NULL и появился мессаджбокс от експлорера. Я аж обосрался.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Ладно, если уж зашла тема про удалённые потоки, то нужно обьяснить. У твоего инжекта изначально не верный принцип.
    Эта строка передаст управление вникуда. Когда начинает исполняться диспетчер APC нельзя никак контролировать поток, он может и будет исполнять не наш код, он будет исполнять код процесса, в который внедряется наш код и если приложение разрешит внедряться, тогда будет выполнен наш код. Например вновь созданный поток обойдёт все модуля, вызывая их InitRoutine(), более того, редирект любого места в процессе обработки апк на код, который будет фильтровать подобные попытки - инжект не удастся выполнить.
    Нормально при инжекте удалённый поток должен создаваться следующим образом:
    > Все потоки должны быть остановлены посредством NtSuspendProcess.
    > Выполняется перехват диспетчера APC(KiUserApcDispatcher). Тут вариантов несколько:
    - Сплайсинг.
    - Редирект на диспетчер исключений, но для этого диспетчер исключений также должен быть перехвачен.
    - Удалённо VEH зарегистрировать невозможно, изза ксора указателя с локальными в процессе куками.
    Если проекция ntdll защищена от записи(путём замещения файловой проеции модуля на не файловую) запись в пределы секций кода ntdll не удастся и следовательно перехват тоже.
    > После создания потока и начала исполнения им внедрённого кода снимаются перехваты и потоки выводятся из спящего состояния, посредством NtResumeProcess.

    Использовать приватную память для инжекта не удобно. Лучше использовать проекцию секции, в этом случае для записи в ап не нужно использовать NtWriteVirtualMemory/NtAllocateVirtualMemory(бывает важно для зиродеев) и это позволяет леко выполнить обмен данными с инжектящим процессом, так как память разделяемая.
     
  7. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Код (Text):
    1. #pragma comment(linker,"/BASE:0x13140000") // сдвигаем базу нашего процесса
    2.  
    3. #include < windows.h>
    4. #include < tlhelp32.h>
    5. #include <stdio.h>
    6. #include <strsafe.h>
    7.  
    8. // ------- тут как обычно описываем прототипы функций --------
    9.  
    10. DWORD GetProcessID(char*);
    11. BOOL Inject(HANDLE,DWORD(WINAPI* func)(LPVOID));
    12. DWORD WINAPI func(LPVOID);
    13.  
    14. void ErrorExit()
    15. {
    16.     LPVOID lpMsgBuf;
    17.     DWORD dw = GetLastError();
    18.     FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS,NULL,dw,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0, NULL );
    19.     MessageBox(NULL, (LPCSTR)lpMsgBuf, "Ошибка", MB_ICONERROR | MB_OK);
    20.     LocalFree(lpMsgBuf);
    21.     ExitProcess(1);
    22. }
    23.  
    24. int SetDebugPrivileges(void)
    25. {
    26.     TOKEN_PRIVILEGES Debug_Privileges;
    27.     if (!LookupPrivilegeValue (NULL,SE_DEBUG_NAME,&Debug_Privileges.Privileges[0].Luid)) ErrorExit();
    28.     HANDLE hToken = 0;
    29.     if (!OpenProcessToken (GetCurrentProcess (),TOKEN_ADJUST_PRIVILEGES,   &hToken)) ErrorExit();
    30.     Debug_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    31.     Debug_Privileges.PrivilegeCount = 1;
    32.     if (!AdjustTokenPrivileges (hToken,FALSE,&Debug_Privileges,0,NULL,NULL)) ErrorExit();
    33.     return 0;
    34. }
    35.  
    36. //-------- главная функция.... вопросов возникнуть не должно :-) ---------
    37.  
    38. int WINAPI WinMain(HINSTANCE,HINSTANCE,LPTSTR,int)
    39. {
    40.   if (SetDebugPrivileges()) return false;
    41.   if(!Inject(OpenProcess(PROCESS_ALL_ACCESS,false,GetProcessID("iexplore.exe")),&func)) return false;
    42.   return true;
    43. }
    44.  
    45. //-------- а вот это та самая функция, которая будет выполнять наши, -------
    46. //-------- конечно же, доброжелательные действия в ---------------------
    47. //-------- чужом адресном пространстве :-)) ---------------------------
    48.  
    49. DWORD WINAPI func(LPVOID)
    50. {
    51.   LoadLibrary("kernel32.dll"); // нам необходимо подгрузить жертве в процесс
    52.   LoadLibrary("user32.dll"); // требуемые нам библиотеки (их может и не быть изначально)
    53.   SYSTEMTIME SysTime;
    54.   GetSystemTime(&SysTime);
    55.   WORD time=SysTime.wSecond+30;
    56. //while(time!=SysTime.wSecond){GetSystemTime(&SysTime);}
    57.   MessageBox(0,"Hello from addres area of explorer","title",0);
    58. return true;
    59. }
    60. //-------- в поисках нашей жертвы ---------
    61.  
    62. DWORD GetProcessID(char* lpNameProcess) // в параметрах передаем имя процесса жертвы
    63. {
    64.   HANDLE snap;
    65.   PROCESSENTRY32 pentry32;
    66.   snap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    67.   if(snap==INVALID_HANDLE_VALUE) return 0;
    68.   pentry32.dwSize=sizeof(PROCESSENTRY32);
    69.   if(!Process32First(snap,&pentry32)) {CloseHandle(snap);return 0;}
    70.   do
    71.   {
    72.     if(!lstrcmpi(lpNameProcess,&pentry32.szExeFile[0]))
    73.     {
    74.       CloseHandle(snap);
    75.       return pentry32.th32ProcessID; // вот наша жертва для внедрения кода;-)
    76.     }
    77.   }while(Process32Next(snap,&pentry32));
    78.   CloseHandle(snap);
    79.   return 0;
    80. }
    81.  
    82. //-------- функция внедрения в пространство жертвы -------------------
    83.  
    84. BOOL Inject(HANDLE hProc,DWORD(WINAPI* func)(LPVOID))
    85. {
    86.   DWORD id;
    87.   DWORD ByteOfWriten;
    88.   HMODULE hModule = GetModuleHandle(NULL);
    89.   if (!hProc) ErrorExit();
    90.   DWORD size=((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(hModule)+((PIMAGE_DOS_HEADER)(hModule))->e_lfanew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
    91.   char* hNewModule = (char*)VirtualAllocEx(hProc,hModule,size,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    92.   if(hNewModule==NULL) ErrorExit();
    93.   if (!WriteProcessMemory(hProc,hNewModule,hModule,size,&ByteOfWriten)) ErrorExit();
    94.   if(ByteOfWriten!=size)ErrorExit();
    95.   HANDLE hThread=CreateRemoteThread(hProc,NULL,16384,func,(LPVOID)hNewModule,CREATE_SUSPENDED ,&id);
    96.   if(!hThread) ErrorExit();
    97.   ResumeThread(hThread);
    98.   WaitForSingleObject(hThread,-1);
    99.   if (!VirtualFreeEx(hProc,hModule,0,MEM_RELEASE)) ErrorExit();
    100.   if(hThread==0) ErrorExit();
    101.   return true;
    102. }
    Вот это у мну работает, одно но iexplore.exe вместо explorer.exe ибо x64
     
  8. doesn

    doesn New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2007
    Сообщения:
    97
    LoadLibrary("kernel32.dll"); // нам необходимо подгрузить жертве в процесс
    LoadLibrary("user32.dll"); // требуемые нам библиотеки (их может и не быть изначально)

    kernel32 -конечно же не будет...
     
  9. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Рестарт делал! А очищать низя! нужно чтобы потом эти изменения я же и показал ... в виде усложнения алгоритма.

    Код (Text):
    1. BOOL WINAPI WriteProcessMemory(
    2.   __in   HANDLE hProcess,
    3.   __in   LPVOID lpBaseAddress,
    4.   __in   LPCVOID lpBuffer,
    5.   __in   SIZE_T nSize,
    6.   __out  SIZE_T *lpNumberOfBytesWritten
    7. );
    __in LPCVOID lpBuffer - для моего примера как должен выглядеть этот указатель ? Если не затруднит...
     
  10. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    Попробуй будет у тебя работать или нет
    собранный образ - http://depositfiles.com/files/41nh3v3vq
    проэкт vs2005 - http://depositfiles.com/files/lj6pqqjfq
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Кстати а как на счёт RtlRemoteCall(), чтото я про неё совсем забыл..
     
  12. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    dag
    Твой exe-шник запускается и выполняется как нада =)

    А вот с кодом прблемы =((
    компилил в Builder'е и есть следующие вопросы:
    1) зачем тебе "strsafe.h" (у меня её, во-первых, нету, а, во-вторых, на неё ничего не ссылается)
    2) после компила следующие ошибки:
    [Linker Error] бла-бла-бла (счаз пока их решаю)
     
  13. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    ВСЕМ ОГРОМНОЕ СПАСИБО!!!!
    Я выполнил поставленную задачу, но без ВАШЕЙ помощи не справился бы!
    Отдельное спасибо dag'у !!!