Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2010, 20:13   #1
coinkrsk
пыжашийся нуб
Пользователь
 
Регистрация: 19.06.2010
Сообщений: 93
По умолчанию Windows I/o без Kernel32.dll и Advapi32.dll

Добрый день.
Необходимо в Windows XP SP3 распечатать в стандартный поток "some text here" без прямого или косвенного использования kernel32.dll и advapi32.dll (в иделе программа вообще с этими библиотеками слинкована быть не должна). В распоряжении С и ассемблер x86; Microsoft Visual Studio 2005 и MASM.

В чем проблема: я математик и программирование для меня всегда было инструментом для кодирования алгоритмов. Никогда не спускался по лестнице абстракции ниже. Вся проблема в том, что я слабо представляю, что значат наложенные ограничения и что я вообще могу использовать.

В чем сложность: сложно получить ответ от гугла, если в строке поиска указать "bla bla bla без kernel32.dll". Получаешь непременно с "kernel32.dll".

Нужно:
1)Понять, что у меня есть в распоряжении - найти границу того, что можно использовать, а что нет.
2)Создать приложение в VS не использующее kernel32.dll. Пустое консольное приложение void mail {}, как оказалость, использует.

Заранее спасибо всем откликнувшимся.
coinkrsk вне форума Ответить с цитированием
Старый 19.06.2010, 20:33   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а без АПИ вы вообще ничего не можете.
kernel32.dll подгружается всегда.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.06.2010, 20:50   #3
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Для чего такие странные требования?
А если из ДОСа работать?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 19.06.2010, 21:30   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
1)Понять, что у меня есть в распоряжении - найти границу того, что можно использовать, а что нет.
Берете либы, что можно использовать и смотрите, что они экспортируют. Советую начать с ntdll.dll

Цитата:
2)Создать приложение в VS не использующее kernel32.dll. Пустое консольное приложение void mail {}, как оказалость, использует.
В опциях: игноре стандартные либы
p51x вне форума Ответить с цитированием
Старый 19.06.2010, 22:45   #5
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Как уже заметили, kernel32 подгружается в любом случае, даже если его нет в таблице импорта. Цепочка вызовов там выглядит приблизительно так:
kernel32.WriteConsoleA -> ntdll.CsrClientCallServer -> ntdll.ZwRequestWaitReplyPort -> ntdll.KiFastSystemCall -> Ядро

В принципе, теоретически можно распихать в памяти нужные данные и дёрнуть SYSENTER, но это абсолютно лишено смысла, т.к. в лучшем случае будет работать на конкретном билде конкретной ОС.
пыщь
JTG вне форума Ответить с цитированием
Старый 20.06.2010, 03:05   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

причина всего этого в том что мы в защищенном режиме на третьем кольце.
в нулевом еще можно побузить но не стоит.

API, это в первую очередь интерфейс взаимодействия с ОС(которая уже затем выводит на экран, в нужное место и тд).
а так как вы находитесь уже в загруженной ОС, то ваша программа ею контролируется, и весь доступ(при условии полной защиты и не использования дыр в ней) идет через АПИ(вам остаются лишь комманды ассемблера, и то, все кроме тех что используют IO(процессорный, а не файлы), и прерывания)

если хотите уж работать со всем напрямую то вам наверно нужно свою ОС писать, ну или уж ДОС.(там реальный режим)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.06.2010, 08:40   #7
coinkrsk
пыжашийся нуб
Пользователь
 
Регистрация: 19.06.2010
Сообщений: 93
По умолчанию

Спасибо всем кто откликнулся. Чувствую быстро у меня ничего не получиться. Ну да ладно

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
а без АПИ вы вообще ничего не можете.
kernel32.dll подгружается всегда.
бох с ним пусть слинковано будет, табу на вызовы от туда функций.

Цитата:
Сообщение от JTG Посмотреть сообщение
В принципе, теоретически можно распихать в памяти нужные данные и дёрнуть SYSENTER, но это абсолютно лишено смысла, т.к. в лучшем случае будет работать на конкретном билде конкретной ОС.
Насчет билда - жестковато, а вот насчет конкретной ОС - так это в в постановке задачи прямо прописано.
Спасибо за наводку, копнем в эту сторону. Пока ничего спрашивать не буду, ибо степень понимания даже для задачи вопроса не достигнута.

Цитата:
Сообщение от DomiNick Посмотреть сообщение
Для чего такие странные требования?
А если из ДОСа работать?
Такова поставленная задача, ни больше, ни меньше.

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
если хотите уж работать со всем напрямую то вам наверно нужно свою ОС писать, ну или уж ДОС.(там реальный режим)
В том то и штука, что работать вот так ничего не будет. Я описал целиком поставленную, целостную задачу. Насколько я понимаю столь странное требование - это увидеть смогу ли я вывернуться в рамках поставленно задачи и задайствовать то, что задействовать нельзя. Стыбрить код из вышеперечиленных библиотек - да(как бы странно это не звучало), скрытно подгрузить - все же нет.

Цитата:
Сообщение от p51x Посмотреть сообщение
В опциях: игноре стандартные либы
Спасибо, помогло. Теперь проект не собрать. Получил что хотел.

Цитата:
Сообщение от error
1>task.obj : error LNK2001: unresolved external symbol @__security_check_cookie@4
1>LINK : error LNK2001: unresolved external symbol _mainCRTStartup
1>C:\Documents and Settings\User\Мои документы\Visual Studio 2005\Projects\task\Release\task.exe : fatal error LNK1120: 2 unresolved externals
Запрос идет на то, чего нет.

Вопросы:
1)Осознал, что не понимаю самого процесса работы моих приложений в windows. Как на более низком уровне работает
#include <stdio.h>
int main {
return 0;}?
Все что вижу я - это окошко консоли. Что видит моя система?

2)По скольку нужно сымитировать
printf ("%s", "Hello World");
Хорошо бы досканально понять как оно на деле работает.

3)При создании простейшего приложения в бой идут:
a)ntdll.dll
b)kernel32.dll
c)msvcr80.dll
d)msvcrt.dll
За что отвечают эти библиотеки и что я потеряю исключив одну или несколько из них?

С уважением,
Coinkrsk.

Последний раз редактировалось coinkrsk; 20.06.2010 в 08:43.
coinkrsk вне форума Ответить с цитированием
Старый 20.06.2010, 08:48   #8
coinkrsk
пыжашийся нуб
Пользователь
 
Регистрация: 19.06.2010
Сообщений: 93
По умолчанию

Редактировать уже не буду. Посмотрел повнимательнее, нашел:
Цитата:
Сообщение от JTG Посмотреть сообщение
Как уже заметили, kernel32 подгружается в любом случае, даже если его нет в таблице импорта. Цепочка вызовов там выглядит приблизительно так:
kernel32.WriteConsoleA -> ntdll.CsrClientCallServer -> ntdll.ZwRequestWaitReplyPort -> ntdll.KiFastSystemCall -> Ядро
Тоесть консоль отрисовывается непосредственно от вызова из kernel32?

Тогда вопрос: а что есть стандартный поток вообще? В который мне нужно вывести текст. Простите что спрашиваю у Вас, что нужно сделать мне.
coinkrsk вне форума Ответить с цитированием
Старый 20.06.2010, 10:06   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

GetStartupInfo - STARTUPINFO - STARTUPINFO.hStdOutput
консоль работает через WriteFile(ReadFile ввод), в cout происходит преобразвание в текст.
это вас интересовало.

в принципе можно через .com тогда пойти, тогда не будет лишнего.
Цитата:
В том то и штука, что работать вот так ничего не будет.
всмысле не будет? на вашей ОС или ДОСе будет то что вы напишете
видимо вам просто ХР нужна.
Цитата:
1)Осознал, что не понимаю самого процесса работы моих приложений в windows. Как на более низком уровне работает
#include <stdio.h>
int main {
return 0;}?
Все что вижу я - это окошко консоли. Что видит моя система?
main/WinMain вызывается из функции mainCRTStartup(если не ошибаюсь, не помню немного)
то есть приложение на самом деле работает не с main, а ранее.
сначало там проверяется передан ли нам хендл консоли(выше как я показал), если нет то открывается консоль.(AllocConsole вроде)
после main идет как минимум строчка
Код:
ExitProcess(main(...));//результат от main
Цитата:
2)По скольку нужно сымитировать
printf ("%s", "Hello World");
Хорошо бы досканально понять как оно на деле работает.
puts("Hello World") - WriteFile(hStdOut,"Hello World",strlen("Hello World"),&r,0) - ну а там далее в Дебри АПИ ДЛЛ.
скорее всего примерно так.
Цитата:
3)При создании простейшего приложения в бой идут:
a)ntdll.dll
b)kernel32.dll
c)msvcr80.dll
d)msvcrt.dll
За что отвечают эти библиотеки и что я потеряю исключив одну или несколько из них?
ab системные ДЛЛ.
cd ДЛЛ от студии, в них находится части кода(libc и тд), которые затем не включаются в ваш exe(меньше вес), но приходится их таскать с собой
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.06.2010, 16:43   #10
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Цитата:
Тоесть консоль отрисовывается непосредственно от вызова из kernel32?
Для пользователя - да. kernel32.WriteConsole - верхушка айсберга, собственно вывод текста в этот-самый стандартный поток происходит где-то глубоко в ядре.

В винде есть фишка под названием local procedure call - некая хрень с клиент-серверной архитектурой для связи приложенией пользователя и ядра, сsrss.exe - сервер этой подсистемы, он контроллирует кучу всего, в том числе консольные приложения. Csrss создаёт некий объект "порт", вешает на него обработчик и в ntdll.NtReplyWaitReceivePort ждёт сообщение (сообщение<>текст). Если это сообщение приходит, проверяется формат и код сервиса, управление передаётся соответствующему обработчику.

Итого: сишный printf мутузит строку, в конце-концов передаёт kernel32.WriteConsole, та куда-то её засовывает и вызывает какой-то сервис через ntdll.CsrClientCallServer (таблица всех консольных сервисов ConsoleServerApiDispatchTable недокументирована, разная для разных ОС/билдов и висит где-то в памяти winsrv.dll, загруженной в адресное пространство сsrss), ntdll.CsrClientCallServer отправляет сообщение сsrss'у и тот дальше куда-то в ядро.

Цитата:
найти границу того, что можно использовать, а что нет
Не совсем ясно что за граница и, главное, зачем? kernel32 грузится всегда, из неё через LoadLibrary/GetProcAddress можно подгрузить что угодно, т.е. доступ к WinAPI есть у любой программы в user-mode "с рожденья"
пыщь

Последний раз редактировалось JTG; 20.06.2010 в 16:51.
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IPHLPAPI.DLL в windows 7 Horus92 Работа с сетью в Delphi 1 15.06.2010 09:55
bass.dll в windows 7 Virus191288 Мультимедиа в Delphi 7 27.11.2009 07:48
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36
Как убрать маскировку пароля без dll?? techner Win Api 4 20.04.2007 20:10