внедрение в консольный процесс под 9х
От: Valerio Россия linkedin.com/in/boronin
Дата: 01.04.03 16:46
Оценка:
коллега задал интересный вопрос :
дословно "если у нас есть процесс без очереди сообщений (типа консольного) под 98, то поставить хук не удается"

вообще говоря, хук для него не самоцель, его интересовал вопрос внедрения в такой процесс в широком смысле, вплоть до использования Kernel mode компонентов. Сам я ничего вспомнить-подсказать тут не сумел, но вопрос остался занозой...

наконец решил эту занозу удалить , но поиск навскидку ничего мне не принес

может быть Гуру, уже наверняка отвечавшие тут, не сочтут за труд просветить нас в этом вопросе
... << RSDN@Home 1.0 beta 6a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re: внедрение в консольный процесс под 9х
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 01.04.03 17:44
Оценка: 12 (1)
Здравствуйте, Valerio, Вы писали:

V>коллега задал интересный вопрос :

V>дословно "если у нас есть процесс без очереди сообщений (типа консольного) под 98, то поставить хук не удается"
V>вообще говоря, хук для него не самоцель, его интересовал вопрос внедрения в такой процесс в широком смысле, вплоть до использования Kernel mode компонентов. Сам я ничего вспомнить-подсказать тут не сумел, но вопрос остался занозой...

Есть ключ в реестре, который указывает, какие дллки будут загружены при старте процесса.
Еще можно внедриться чз таблицу импорта при загрузке процесса.
Re[2]: внедрение в консольный процесс под 9х
От: Valerio Россия linkedin.com/in/boronin
Дата: 01.04.03 20:38
Оценка:
Здравствуйте, Plutonia Experiment, Вы писали:

PE>Есть ключ в реестре, который указывает, какие дллки будут загружены при старте процесса.

PE>Еще можно внедриться чз таблицу импорта при загрузке процесса.

спасибо, забыл только сказать что такие способы не очень катят (где нужно перегружаться и т.п.)
по идее процесс уже _может быть_ запущен. В этом случае есть варианты?
... << RSDN@Home 1.0 beta 6a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[3]: внедрение в консольный процесс под 9х
От: Блудов Павел Россия  
Дата: 02.04.03 02:52
Оценка: 50 (4)
Здравствуйте, Valerio, Вы писали:

V>В этом случае есть варианты?


Есть "тяжелая" артиллерия. ::DebugActiveProcess().
Это единственный способ получить хендл нити из
чужого процесса в Win9x. А нам нужен полный список
всех нитей этого приложения.

Дальше все просто


Павел.
P.S. Не стоит оно того.
Re: внедрение в консольный процесс под 9х
От: eax  
Дата: 02.04.03 04:53
Оценка:
Здравствуйте, Valerio, Вы писали:

V>коллега задал интересный вопрос :

V>дословно "если у нас есть процесс без очереди сообщений (типа консольного) под 98, то поставить хук не удается"

V>вообще говоря, хук для него не самоцель, его интересовал вопрос внедрения в такой процесс в широком смысле, вплоть до использования Kernel mode компонентов. Сам я ничего вспомнить-подсказать тут не сумел, но вопрос остался занозой...

самый простой вариант IMHO — вписать в процесс небольшой загрузчик, выделяющий память и подгружающий основной код. А также, переставить на этот загрузчик вектор функции WriteFile/ReadFile/WriteConsole/ReadConsole в секции импортов — большинство консольных прог часто используют эти вызовы
Re[2]: внедрение в консольный процесс под 9х
От: Блудов Павел Россия  
Дата: 02.04.03 05:24
Оценка:
Здравствуйте, eax, Вы писали:

eax>самый простой вариант IMHO — вписать в процесс небольшой загрузчик


Нельзя ли подровнее, что значит "вписать в процесс небольшой загрузчик"?
Павел.
Re[2]: внедрение в консольный процесс под 9х
От: maniac  
Дата: 03.04.03 02:04
Оценка:
V>>коллега задал интересный вопрос :
V>>дословно "если у нас есть процесс без очереди сообщений (типа консольного) под 98, то поставить хук не удается"
V>>вообще говоря, хук для него не самоцель, его интересовал вопрос внедрения в такой процесс в широком смысле, вплоть до использования Kernel mode компонентов. Сам я ничего вспомнить-подсказать тут не сумел, но вопрос остался занозой...

PE>Есть ключ в реестре, который указывает, какие дллки будут загружены при старте процесса.

PE>Еще можно внедриться чз таблицу импорта при загрузке процесса.

Я тот коллега, который задавал этот вопрос.
Через реестр dll'ки подгружаются только в те процессы, которые импортируют user32.dll, т.е. все равно есть некоторое ограничение. Ну и перезагружаться не хочется. К тому же строчка, где хранится список этих dll'ек ограничена какой-то маленькой длиной, сейчас точно не вспомню какой.
Re[4]: внедрение в консольный процесс под 9х
От: maniac  
Дата: 03.04.03 02:07
Оценка:
БП>Есть "тяжелая" артиллерия. ::DebugActiveProcess().
БП>Это единственный способ получить хендл нити из
БП>чужого процесса в Win9x. А нам нужен полный список
БП>всех нитей этого приложения.

Этот вариант не подходит по причине того, что если мы один раз сделали на процесс DebugActiveProcess, то detach сделать мы уже не сможем. А если например нужно встраивать свой код в любой запускаемый процесс в системе, то вообще все плохо
Re[2]: внедрение в консольный процесс под 9х
От: maniac  
Дата: 03.04.03 02:11
Оценка:
eax>самый простой вариант IMHO — вписать в процесс небольшой загрузчик, выделяющий память и подгружающий основной код. А также, переставить на этот загрузчик вектор функции WriteFile/ReadFile/WriteConsole/ReadConsole в секции импортов — большинство консольных прог часто используют эти вызовы
eax>
А если стоит ограничение что менять exe'шник нельзя? К тому же есть процессы, которые отрицательно относятся к изменению себя на диске.
А если вы говорили не про прямое изменение exe на диске, то проясните пожалуйста ситуацию.
Re[3]: внедрение в консольный процесс под 9х
От: Аноним  
Дата: 03.04.03 04:20
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

eax>>самый простой вариант IMHO — вписать в процесс небольшой загрузчик


БП>Нельзя ли подровнее, что значит "вписать в процесс небольшой загрузчик"?

БП>Павел.

Перебираешь модули процесса (ModuleFirst/ModuleNext в win9x; EnumProcessModules в winnt).
В каждый из модулей в свободное место между секциями пытаешься вписать загрузчик (VirtualProectEx, WriteProcessMemory) . 100% гарантии нет,
но в сам EXE и однократно загруженные DLL писать обычно можно.
Re[3]: внедрение в консольный процесс под 9х
От: Аноним  
Дата: 03.04.03 04:24
Оценка:
Здравствуйте, maniac, Вы писали:


eax>>самый простой вариант IMHO — вписать в процесс небольшой загрузчик, выделяющий память и подгружающий основной код. А также, переставить на этот загрузчик вектор функции WriteFile/ReadFile/WriteConsole/ReadConsole в секции импортов — большинство консольных прог часто используют эти вызовы

eax>>
M>А если стоит ограничение что менять exe'шник нельзя? К тому же есть процессы, которые отрицательно относятся к изменению себя на диске.
M>А если вы говорили не про прямое изменение exe на диске, то проясните пожалуйста ситуацию.

в память через WriteProcessMemory
Re[4]: внедрение в консольный процесс под 9х
От: maniac  
Дата: 03.04.03 05:01
Оценка:
А>Перебираешь модули процесса (ModuleFirst/ModuleNext в win9x; EnumProcessModules в winnt).
А>В каждый из модулей в свободное место между секциями пытаешься вписать загрузчик (VirtualProectEx, WriteProcessMemory) . 100% гарантии нет,
А>но в сам EXE и однократно загруженные DLL писать обычно можно.

Ну этот вариант тоже довольно таки ограничен, например: Windows 95/98/Me: You cannot use VirtualProtectEx on any memory region located in the shared virtual address space (from 0x80000000 through 0xBFFFFFFF).
Остается писать только в сам EXE. А если места нет между секциями или его очень мало???

А вообще лучше переформулировать задачу — нужно цепляться ко всем процессам, которые запускаются, сразу, т.е. до того как мы перешли на entry point.
Re[5]: внедрение в консольный процесс под 9х
От: maniac  
Дата: 03.04.03 05:05
Оценка:
Да, забыл добавить. Скорее всего нет решения для моей проблемы только через user mode, ищется решение на уровне ядра.
Re[5]: внедрение в консольный процесс под 9х
От: eax  
Дата: 03.04.03 05:24
Оценка: 2 (1)
Здравствуйте, maniac, Вы писали:


А>>Перебираешь модули процесса (ModuleFirst/ModuleNext в win9x; EnumProcessModules в winnt).

А>>В каждый из модулей в свободное место между секциями пытаешься вписать загрузчик (VirtualProectEx, WriteProcessMemory) . 100% гарантии нет,
А>>но в сам EXE и однократно загруженные DLL писать обычно можно.

M>Ну этот вариант тоже довольно таки ограничен, например: Windows 95/98/Me: You cannot use VirtualProtectEx on any memory region located in the shared virtual address space (from 0x80000000 through 0xBFFFFFFF).

M>Остается писать только в сам EXE. А если места нет между секциями или его очень мало???
а много и не надо — нужно вызвать всего 3 API функций. в 100 байт можно уложиться, если на асме писать

M>А вообще лучше переформулировать задачу — нужно цепляться ко всем процессам, которые запускаются, сразу, т.е. до того как мы перешли на entry point.

Это можно и из ring3 сделать: влезаешь описанным выше способом во все процессы и перехватываешь CreateProcessA/W
Re[6]: внедрение в консольный процесс под 9х
От: maniac  
Дата: 03.04.03 07:12
Оценка:
M>>Ну этот вариант тоже довольно таки ограничен, например: Windows 95/98/Me: You cannot use VirtualProtectEx on any memory region located in the shared virtual address space (from 0x80000000 through 0xBFFFFFFF).
M>>Остается писать только в сам EXE. А если места нет между секциями или его очень мало???
eax>а много и не надо — нужно вызвать всего 3 API функций. в 100 байт можно уложиться, если на асме писать
100 байт или 1000 какая разница, если места вообще ноль, то ничего не получится. Кстати, а зачем вообще искать свободное место, никто нам не мешает переписать произвольный код в процессе(конечно сделав копию где-нибудь у себя), например начиная с entry point, а потом при исполнении своего кода вернуть все обратно. В этом случае даже ModuleFirst/ModuleNext не нужны, exe'шники всегда по одному адресу 0x400000 грузятся.

M>>А вообще лучше переформулировать задачу — нужно цепляться ко всем процессам, которые запускаются, сразу, т.е. до того как мы перешли на entry point.

eax>Это можно и из ring3 сделать: влезаешь описанным выше способом во все процессы и перехватываешь CreateProcessA/W
Ага, похоже это будет работать, единственно что мне не нравится в данном подходе — куча действий. Програмисты как известно делают баги, а тут любой баг приводит к неработоспособности системы. Поэтому было бы здорово найти более красивый способ (правда если писать код для ядра там еще более страшны баги...).
Спасибо за помощь!
Re[7]: внедрение в консольный процесс под 9х
От: eax  
Дата: 03.04.03 08:34
Оценка:
Здравствуйте, maniac, Вы писали:


M>>>Ну этот вариант тоже довольно таки ограничен, например: Windows 95/98/Me: You cannot use VirtualProtectEx on any memory region located in the shared virtual address space (from 0x80000000 through 0xBFFFFFFF).

M>>>Остается писать только в сам EXE. А если места нет между секциями или его очень мало???
eax>>а много и не надо — нужно вызвать всего 3 API функций. в 100 байт можно уложиться, если на асме писать
M>100 байт или 1000 какая разница, если места вообще ноль, то ничего не получится. Кстати, а зачем вообще искать свободное место, никто нам не мешает переписать произвольный код в процессе(конечно сделав копию где-нибудь у себя), например начиная с entry point, а потом при исполнении своего кода вернуть все обратно.
Я так пробовал — система становится нестабильной. Проще писать в самый конец ImageSize. Там, как правило, есть свободное место из-за того, что обычно ObjectAlign(выравнивание в памяти)>FileAlign (выравнивание в памяти)

> В этом случае даже ModuleFirst/ModuleNext не нужны, exe'шники всегда по одному адресу >0x400000 грузятся.

Большинство, но не все.
Re[8]: внедрение в консольный процесс под 9х
От: eax  
Дата: 03.04.03 09:16
Оценка:
Здравствуйте, eax, Вы писали:

свободное место из-за того, что обычно ObjectAlign(выравнивание в памяти)>FileAlign (выравнивание в памяти)
^^^^ FileAlign (выравнивание в файле)
сорри
Re[8]: внедрение в консольный процесс под 9х
От: maniac  
Дата: 03.04.03 09:21
Оценка:
>Там, как правило, есть свободное место из-за того, что обычно ObjectAlign(выравнивание в памяти)>FileAlign (выравнивание в памяти)
Да. "но как правило это не всегда"


>> В этом случае даже ModuleFirst/ModuleNext не нужны, exe'шники всегда по одному адресу >0x400000 грузятся.

eax>Большинство, но не все.
Ага, соглсаен, забыл про вариант когда base address специально устанавливают другой. А попадались ли вам реальные такие exe'шники???
Re[9]: внедрение в консольный процесс под 9х
От: eax  
Дата: 03.04.03 09:26
Оценка:
Здравствуйте, maniac, Вы писали:

>>> В этом случае даже ModuleFirst/ModuleNext не нужны, exe'шники всегда по одному адресу >0x400000 грузятся.

eax>>Большинство, но не все.
M>Ага, соглсаен, забыл про вариант когда base address специально устанавливают другой. А попадались ли вам реальные такие exe'шники???
в дистрибутивах новых виндов практически все .exe имеют imagebase = 0x1000000
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.