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

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

  1. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Нашел в инете пример:

    Код (Text):
    1. BOOL Inject(HANDLE hProc,DWORD(WINAPI* func)(LPVOID))
    2. {
    3. DWORD id;
    4. DWORD ByteOfWriten;
    5. HMODULE hModule = GetModuleHandle(NULL);
    6. DWORD size=((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(hModule)+((PIMAGE_DOS_HEADER)(hModule))->e_lfanew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
    7. char* hNewModule = (char*)VirtualAllocEx(hProc,hModule,size, MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    8. if(hNewModule==NULL) return false;
    9. WriteProcessMemory(hProc,hNewModule,hModule,size,&ByteOfWriten);
    10. if(ByteOfWriten!=size){return false;}
    11. HANDLE hThread=CreateRemoteThread(hProc,NULL,0,func,(LPVOID)hNewModule,0,&id);
    12. if(hThread==0) return false;
    13. return true;
    14. }
    вообщем вызов этой функции возвращает false ... может кто предположить может почему?
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Скорее всего потому, что адрес hModule в процессе hProc занят и соотв-но VirtualAllocEx обламывается
     
  3. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    эээ ... что нужно сделать ??? если не сложно ...
     
  4. wertyman

    wertyman Member

    Публикаций:
    0
    Регистрация:
    13 дек 2006
    Сообщения:
    74
    Заменить hModule на NULL
     
  5. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    701
    разогнаться и ударится головой в книгу рихтера =)
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. hModule = GetModuleHandle(NULL);
    Афигеть, никодна не понимал такого, ведь двух инструкций достаточно:
    Код (Text):
    1.     mov eax,fs:[0x30]
    2.     mov eax,dword ptr [eax + 0x8]
    Хотя заюзать GetProcAddress("GetModuleHandle") будет вобще чудесно..
     
  7. BlackParrot

    BlackParrot New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2009
    Сообщения:
    163
    Clerk
    1) Стиль программирования. Если среди чистого WinApi-кода будут asm-вставки с константами, то 1) красоты коду это не сделает 2) его сложнее поддерживать 3) его сложнее редактировать. По этому пункту все-таки советую тебе почитать что-нибудь по эффективному программированию. Ведь программы люди не только для себя пишут, и не только в одиночку.
    2) Кроссплаформенность. Для переноса хорошо написанной С-программы достаточно перекомпила, твою же прогу с асм-вставками надо будет переписывать.
    3) Недокументированность. Если что-то не указывается в документации, то есть возможность, что вскоре, в следующей версии операционной системы программа работать не будет. А ведь есть проги, которые работают и через 10 лет! А все из-за того, что они юзали только документированные структуры и функции. Документированные - означает, что описаны в официальной документации по интерфейсу.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    BlackParrot
    Сказанное тобой не относится к инжекту и к началу PEB/TEB тоже - оно не меняется.
     
  9. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Да! спасибо! Теперь функция выполняется, но выскакивает ошибка ... то памят не может быть READ, то WRITE ... видимо ссылаемся на занятую область памяти. Как сместить? Ну или как найти пустое место для размещения моего кода? Может статью какую подскажете, где для дураков расписана методика ...
     
  10. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Код (Text):
    1. char* hNewModule = (char*)VirtualAllocEx(hProc,  
    2. /*hModule*//*NULL*/"/BASE:0x13140000",
    3. size, MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    Как я тока не изголялся уже над этой строчкой ... в таком варианте снова не выполняется, с NULL ошибка, но хоть функция выполняется
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    BadLogin
    Если хочешь домучить этот "дурной пример", то нужно посмотреть распределение памяти в подопытном процессе (например, через OllyDbg) и затем изменить ImageBase своей проги так, чтобы он приходился на незанятую область памяти в целевом процессе.
    А лучше ес-но делать код внедряемой функции базонезависимым (тогда под нее можно будет выделять память в любом месте) и при необходимости подгружать свою dll к целевому процессу
     
  12. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    подключить dll у меня уже получилось! Мне для диплома нужно именно ПЗ в машинном коде, чтобы она была видна в дампе памяти, как часть кода =))

    я вообщем то понимал это и ранее,leo, у меня это не получается =(

    Есть ли где статья про поиск места в машинном коде, и как сместить базу? я пытался ... выше в примере видно
    Код (Text):
    1. "/BASE:0x13140000"
    функция возвращает False (
     
  13. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Инструкция по адресу "0x004013f8" обратилась к памяти по адресу "0x00000000". Память не может быть "writen".

    ________________________
    Зато функция выполняется =)
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    BadLogin
    Чудак-человек, ImageBase нужно задавать в опциях своего компилятора.
    Тогда в твоем экзешнике значение hModule будет равно значению этой заданной базы и если этот адрес не будет занят в подопытном процессе, то VirtualAllocEx(hProc,hModule,..) отработает нормально
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    PS: Все равно код дурной и работать не будет, т.к. CreateRemouteThread передает управление на адрес hModule, по которому расположен не исполняемый код, а PE заголовок. Если тупо сместить адрес на какую-нибудь функцию, то наверняка возникнут проблемы с вызовом импортируемых функций и т.д. и т.п. Поэтому проще выкинуть этот пример на помойку и сделать по человечески ;)
     
  16. BadLogin

    BadLogin Серёга =)

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

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Код (Text):
    1. #pragma comment (linker,"/BASE:0xFFFFFF00")
    пробывал ещё разные значения, всё равно не работает.
     
  18. dag

    dag New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2004
    Сообщения:
    446
    в StdAfx.h и желательно не в область ядра =)
     
  19. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    с этого места по-подробней, пожалуйста...
     
  20. BadLogin

    BadLogin Серёга =)

    Публикаций:
    0
    Регистрация:
    9 окт 2008
    Сообщения:
    82
    Адрес:
    Сайнт-Пи
    Код (Text):
    1. #include < windows.h>
    2. #include < tlhelp32.h>
    3.  
    4. #pragma comment(linker,"/BASE:0x13140000") // сдвигаем базу нашего процесса
    5.  
    6. // ------- тут как обычно описываем прототипы функций --------
    7.  
    8. DWORD GetProcessID(char*);
    9. BOOL Inject(HANDLE,DWORD(WINAPI* func)(LPVOID));
    10. DWORD WINAPI func(LPVOID);
    11.  
    12. //-------- главная функция.... вопросов возникнуть не должно :-) ---------
    13.  
    14. int WINAPI WinMain(HINSTANCE,HINSTANCE,LPTSTR,int)
    15. {
    16. if(!Inject(OpenProcess(PROCESS_ALL_ACCESS,false,GetProcessID("explorer.exe")),&func)) return false;
    17. return true;
    18. }
    19.  
    20. //-------- а вот это та самая функция, которая будет выполнять наши, -------
    21. //-------- конечно же, доброжелательные действия в ---------------------
    22. //-------- чужом адресном пространстве :-)) ---------------------------
    23.  
    24. DWORD WINAPI func(LPVOID)
    25. {
    26. LoadLibrary("kernel32.dll"); // нам необходимо подгрузить жертве в процесс
    27. LoadLibrary("user32.dll"); // требуемые нам библиотеки (их может и не быть изначально)
    28. SYSTEMTIME SysTime;
    29. GetSystemTime(&SysTime);
    30. WORD time=SysTime.wSecond+30;
    31. while(time!=SysTime.wSecond){GetSystemTime(&SysTime);}
    32. MessageBox(0,"Hello from addres area of explorer","title",0);
    33. return true;
    34. }
    35. //-------- в поисках нашей жертвы ---------
    36.  
    37. DWORD GetProcessID(char* lpNameProcess) // в параметрах передаем имя процесса жертвы
    38. {
    39. HANDLE snap;
    40. PROCESSENTRY32 pentry32;
    41. snap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    42. if(snap==INVALID_HANDLE_VALUE) return 0;
    43. pentry32.dwSize=sizeof(PROCESSENTRY32);
    44. if(!Process32First(snap,&pentry32)) {CloseHandle(snap);return 0;}
    45. do
    46. {
    47. if(!lstrcmpi(lpNameProcess,&pentry32.szExeFile[0]))
    48. {
    49. CloseHandle(snap);
    50. return pentry32.th32ProcessID; // вот наша жертва для внедрения кода;-)
    51. }
    52. }while(Process32Next(snap,&pentry32));
    53. CloseHandle(snap);
    54. return 0;
    55. }
    56.  
    57. //-------- функция внедрения в пространство жертвы -------------------
    58.  
    59. BOOL Inject(HANDLE hProc,DWORD(WINAPI* func)(LPVOID))
    60. {
    61. DWORD id;
    62. DWORD ByteOfWriten;
    63. HMODULE hModule = GetModuleHandle(NULL);
    64. DWORD size=((PIMAGE_OPTIONAL_HEADER)((LPVOID)((BYTE*)(hModule)+((PIMAGE_DOS_HEADER)(hM
    65. odule))->e_lfanew+sizeof(DWORD)+
    66. sizeof(IMAGE_FILE_HEADER))))->SizeOfImage;
    67. char* hNewModule = (char*)VirtualAllocEx(hProc,hModule,size,MEM_COMMIT|MEM_RESERVE,PAGE
    68. _EXECUTE_REA
    69. DWRITE);
    70. if(hNewModule==NULL) return false;
    71. WriteProcessMemory(hProc,hNewModule,hModule,size,&ByteOfWriten);
    72. if(ByteOfWriten!=size){return false;}
    73. HANDLE hThread=CreateRemoteThread(hProc,NULL,0,func,(LPVOID)hNewModule,0,&id);
    74. if(hThread==0) return false;
    75. return true;
    76. }
    Вот собственно весь код! если внести изменения:
    То всё выполняется, но эксплорер выдаёт ошибку:
    Мне всего то нужно сделать прогу изменяющую машинный код запущенного процесса (произвольные изменения - просто символы может какие вписать) и чтобы это было видно из IDA или чего-нить подобного, ну вообщем, чтобы в дампе были видны эти изменения, а статике не было никаких изменений.

    Что в этом коде не так? Есть ли ещё примеры для изучения?