Запись в чужой процесс.
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Запись в чужой процесс. - 2009-07-20 12:10:34.406666
|
|
|
furiousangel
Сообщений: 1116
Оценки: 0
Присоединился: 2005-05-28 06:31:47
|
Сразу говорю. Искал 4 дня. Даже на забугорных форумах. Был обижен австралйцами. Но решения так и не нашел. Есть чужой процесс. Нужно в нем перезаписать пару байтиков. Вот мой код (PoC. так что немного кривой), который компилится, выолняется без исключений, но не делает того, что мне надо. Я вобщем С знаю, но работать с процессам не приходилось раньше. HWND hwnd;
int go=4;
float x=1,y=2,z=3;
DWORD procid;
HANDLE hproc;
hwnd=FindWindow(NULL,"ххх");//получаем хендл окна
if (hwnd==0) ShowMessage("ххх не запущен");//проверяем создано ли окно
GetWindowThreadProcessId(hwnd,&procid);//получаем pid
hproc = OpenProcess( PROCESS_ALL_ACCESS,TRUE, procid );//получаем хендл процесса
if(!WriteProcessMemory(hproc,(LPVOID)(CTM_BASEX),&x,sizeof(x),NULL)) ShowMessage("Failed");
WriteProcessMemory(hproc,(LPVOID)(CTM_BASEY),&y,sizeof(y),NULL);
WriteProcessMemory(hproc,(LPVOID)(CTM_BASEZ),&z,sizeof(z),NULL);
WriteProcessMemory(hproc,(LPVOID)(CTM_BASESTATUS),&go,sizeof(go),NULL);
Судя по вылетеющему меседжбоксу, процесс записи обламывается на корню. ЧЯДНТ? ЗЫ. Константы предопределены выше.
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 12:19:29.130000
|
|
|
Mатцал Коушек
Сообщений: 10407
Оценки: 91
Присоединился: 2008-07-09 10:27:49.520000
|
Может лучше, не менять чужие байты, а целиком в чужой процесс внедрить свой. Получается без проблем, пробовал много раз. Типа, запущен блокнот и висит в процессах, он выполняет свой код, но, ещё и выпоняется твой файл, но его уже в процессах, конечно, не будет.
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 12:27:21.726666
|
|
|
uzzzver4556464
Сообщений: 230
Оценки: 0
Присоединился: 2008-07-31 01:42:54.426666
|
А в области памяти куда пишешь атрибуты каки? Если эта страница имеет атрибуты Read Execute то с записью облом (стандартные атрибуты на секции кода), так что VirtualProtect в помощь.
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 12:28:05.050000
|
|
|
furiousangel
Сообщений: 1116
Оценки: 0
Присоединился: 2005-05-28 06:31:47
|
Нет. Создавать свой поток в процессе или даже подсовывать свой код крайне нежелательно. Там стоит оч мощная защита, обойти которую не представляется возможности ввиду оооогромного (для анализа) куска памяти, занятого процессом. UPD: quote:
А в области памяти куда пишешь атрибуты каки? Если эта страница имеет атрибуты Read Execute то с записью облом (стандартные атрибуты на секции кода), так что VirtualProtect в помощь. Вот я тоже думал что запись обламывается из-за отсуствия атрибута на запись, но тогда по идее должно было вылететь исключение?
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 12:33:46.776666
|
|
|
uzzzver4556464
Сообщений: 230
Оценки: 0
Присоединился: 2008-07-31 01:42:54.426666
|
А попробуй чем …. не шутит. кстати месаджБокс пренадлежит той программе которую ты ломаешь? Она ведь могла поставить свой сех-обработчик и все исключения обрабатывать сама.
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 12:37:59.366666
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
Может записываешь туда куда нельзя?
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 13:26:57.913333
|
|
|
VaZoNeZ
Сообщений: -6758
Оценки: 0
Присоединился: 2008-10-31 14:38:43.796666
|
quote:
А попробуй чем …. не шутит. кстати месаджБокс пренадлежит той программе которую ты ломаешь? Она ведь могла поставить свой сех-обработчик и все исключения обрабатывать сама. ну так вроде этот код выплевывает мессаджбокс)) quote:
ShowMessage("Failed");
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 13:36:55.863333
|
|
|
furiousangel
Сообщений: 1116
Оценки: 0
Присоединился: 2005-05-28 06:31:47
|
Да. Я о том что меседжбокс не перехватывается этим злым процессом, над которым я хочу надругаться, а нативный. А что менять аттрибуты то если и так стоят права на запись? (если я с секцией не ошибся).
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 16:04:42.190000
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
Imagebase у программы какой ?
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 16:21:57.140000
|
|
|
furiousangel
Сообщений: 1116
Оценки: 0
Присоединился: 2005-05-28 06:31:47
|
0x00400000 дефолтный.
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 17:33:51.836666
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
01118120h - 00400000h = 00D18120h Стало быть это секция .data, судя по скрину у нее C0000040h - есть права на запись. Попробуй свой код перекомпилируй для более простой программы типа helloworld. Если вернет ошибку можно будет подебажить.
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 17:59:27.273333
|
|
|
furiousangel
Сообщений: 1116
Оценки: 0
Присоединился: 2005-05-28 06:31:47
|
Спасибо. Я уже стало быть сам хотел написать PoC код. Создать 2 проги. 1) Выводит меседжбокс 2) Модифицирует память первой Потом поставить в первой бряк на меседжбокс подменить с помощью второй адресс строки, которая выводится и дать право первой выполнятся. Но этим я наверно вечером займусь. Пока бьюсь над более простой задачей - прочитать пару байт чужого процесса. Как оказалось задача не намного легче.
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 18:21:18.273333
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
quote:
Пока бьюсь над более простой задачей - прочитать пару байт чужого процесса. Как оказалось задача не намного легче. Ничего там сложного
..............
push dword ptr ds: [pid]
push 0
push 10h
call OpenProcess; открываем процесс
mov dword ptr ds:[hid], eax; сохраним хэндл
push 0
push 4
push dword ptr ds: [size_of_target_process]; размер блока
push dword ptr ds: [base_of_target_process]; начало блока
push dword ptr ds: [hid]
call VirtualProtectEx;устанавливаем новые атрибуты памяти
push dword ptr ds: [skoka_prochitali]; сколько прочитали
push dword ptr ds: [size_of_target_process]; сколько читаем
push dword ptr ds: [adress_pamyati]; куда читаем
push dword ptr ds: [base_of_target_process]; начало блока
push dword ptr ds: [hid]
call ReadProcessMemory; Читаем данные
push dword ptr ds: [hid]
call CloseHandle; Отключаемся от процесса
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 18:35:31.306666
|
|
|
furiousangel
Сообщений: 1116
Оценки: 0
Присоединился: 2005-05-28 06:31:47
|
Мне бы на С реализацию. Ибо проект быстро разрастется асмом там будет оч неинтересно тыкать. Код на чтение таков.
HWND hwnd;
float x,y,z;
DWORD procid;
HANDLE hproc;
hwnd=FindWindow(NULL,"ххх");
if (hwnd==0) {
ShowMessage("ххх не запущен");
exit;}
GetWindowThreadProcessId(hwnd,&procid);
hproc=OpenProcess(ACCESS, 1, (int)procid );
if(!ReadProcessMemory(hproc,(LPCVOID)(CTM_BASEX),(LPVOID)&x,sizeof(x),NULL)) ShowMessage("1 Failed");
ReadProcessMemory(hproc,(LPCVOID)(CTM_BASEY),(LPVOID)&y,sizeof(y),NULL);
ReadProcessMemory(hproc,(LPCVOID)(CTM_BASEZ),(LPVOID)&z,sizeof(z),NULL);
ShowMessage(GetLastError());
Edit1->Text=FloatToStrF(x,ffFixed,5,5);
Edit2->Text=FloatToStrF(y,ffFixed,5,5);
Edit3->Text=FloatToStrF(z,ffFixed,5,5);
Так вот. Первый меседжбокс вылетает (чтение не происходит). GetLastError() выдает 6, что как мне помнится из msdn значит неверный хендл. Т.е. я хендл неверно получаю (hproc). procid верный. под отладкой проверял.
|
|
|
RE: Запись в чужой процесс. - 2009-07-20 18:51:48.366666
|
|
|
Flint_ta
Сообщений: 3720
Оценки: 1120
Присоединился: 2007-01-26 15:49:18.323333
|
Лучше скомпилируй и выложи бинарник
|
|
|
RE: Запись в чужой процесс. - 2009-07-21 11:33:20.033333
|
|
|
furiousangel
Сообщений: 1116
Оценки: 0
Присоединился: 2005-05-28 06:31:47
|
Отчет о проделанной работе… меня поверг в ступор.(поначалу) Было написано две программы 1) msgbox.exe Окно с кнопкой, при нажатии на которую вылетал меседжбокс (Листинг1) 2) PoC.exe Окно с кнопкой, при нажатии на которую происходила запись в память первой программы в область, которая выводится меседжбоксом (Листинг2)
MessageBox(NULL,"Data is safe ","Test",NULL);
Листинг1
#define ADDR 0x00403190// адресс был отловлен в ольке
#define ACCESS 0x1F0FFF
HWND hwnd;
DWORD procid;
HANDLE hproc;
char x[]="Data is hacked";//строка, на которую будем заменять
hwnd=FindWindow(NULL,"Test");//получаем хендл окна
if (hwnd==0) ShowMessage("Test не запущен");//проверяем есть ли окно
GetWindowThreadProcessId(hwnd,&procid);// получаем PID
ShowMessage(IntToStr((int)procid));//Выводим pid на всякий
hproc = OpenProcess( ACCESS,1,procid );//Получаем хендл процесса
if (hproc==0) ShowMessage(IntToStr((int)hproc));//Выводим хендл процесса
if (WriteProcessMemory(hproc,(LPVOID)(ADDR),(LPCVOID)&x,sizeof(x),NULL)) ShowMessage("Запись произошла успешно");//производим запись
Листинг2 Запускаем 1 прогу. Жмем кнопку. Выскакивает "Data is safe". Не закрываем. Запускаем 2 прогу. Жммем кнопку. Вылетает PID процесса. Потом нам пишут что запись произошла успешно. Проверяем. Возвращаемся к 1 проге. Жмем кнопку, и получаем "Data is hacked", что значит, что мы перезаписали данные 1-ой проги из 2-ой. Сдедовательно код рабочий. Я долго не мог понять почему же тогда с тем другим процессом так не получется. Где-то наткнулся на привелегии процессов. Дал своему процессу привелегии SE_DEBUG_NAME и все отлично заплясало). О том как выставлять\снимать привелегии написано здесь http://msdn2.microsoft.com/en-us/library/aa446619(VS.85).aspx PS. Бинарники здесь. Кто хочет может поиграться. Вирей нет. Проверяйте не виртотале кто сомневается.
|
|
|
RE: Запись в чужой процесс. - 2009-07-22 01:46:54.653333
|
|
|
DenCoder
Сообщений: 49
Оценки: 0
Присоединился: 2009-07-07 19:45:30.303333
|
Молодец!!!… Сам разобрался и другим дал ссылку
|
|
|
RE: Запись в чужой процесс. - 2009-11-05 22:44:33.370000
|
|
|
DenCoder
Сообщений: 49
Оценки: 0
Присоединился: 2009-07-07 19:45:30.303333
|
У меня проблема с инжектом в чужой процесс. Точнее на моей тачке все ОК, а вот на другой из 25 процессов инжектятся только 2. Причина в этом - нет доступа на открытие процесса. Присвоил процессу SE_DEBUG_NAME и у меня стали открываться даже smss, csrss, lsass, winlogon, services и т.д. с правами PROCESS_VM_OPERATION, PROCESS_VM_READ, PROCESS_VM_WRITE, PROCESS_QUERY_INFORMATION, PROCESS_SUSPEND_RESUME. А вот на другом компьютере с такой же маской доступа и такой же включенной привилегией нифига. Хотя там тоже запускается моя прога под админом. Хотелось бы разобраться, в чем дело? Можно ли заставить OpenProcess открывать все без исключения процессы на всех машинах?
|
|
|
RE: Запись в чужой процесс. - 2009-12-11 19:43:02.636666
|
|
|
levinsoft
Сообщений: 5
Оценки: 0
Присоединился: 2007-02-21 06:13:15.983333
|
furiousangel, подскажи, а вообще то, антивирусники хоть как то ругаются на твои действия? Вапче то ковыряние чужого процесса эт должно расцениваться антивирусом как Inside. Я это к тому, что как раз не могу добиться от антивируса расценивания моих действий как противоправных… З.Ы. Если не сложно, перезалей плиз свои исходники. хочу попробовать поиграться:)
|
|
|
RE: Запись в чужой процесс. - 2009-12-20 21:37:41.210000
|
|
|
furiousangel
Сообщений: 1116
Оценки: 0
Присоединился: 2005-05-28 06:31:47
|
DenCoder Он и открывает. Надо просто разобраться какие он не открывает. Потом почему. Я в таких случаях в дебаг версиях выкидываю меседжбоксы с промежуточными результатами, и проверяю их. Так же проверку возвращаемых значений функций и GetLastError(). Потом это все легко убирается, но очень помогает понять в чем проблема levinsoft Нод молчит. Что и неудивительно. Антивирус в классическом его виде проверяет лишь файлы на наличие вредоносного кода. А вот фаерволы и ids-ки молчат не будут. Вот бинарники. Перезалил.
|
|
|
|
|