|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
19.06.2010, 20:13 | #1 |
пыжашийся нуб
Пользователь
Регистрация: 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 {}, как оказалость, использует. Заранее спасибо всем откликнувшимся. |
19.06.2010, 20:33 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
а без АПИ вы вообще ничего не можете.
kernel32.dll подгружается всегда. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
19.06.2010, 20:50 | #3 |
Студент, не
Старожил
Регистрация: 29.01.2009
Сообщений: 2,067
|
Для чего такие странные требования?
А если из ДОСа работать?
I am the First of Cyber Evolution...
I am the First to Program your Future... |
19.06.2010, 21:30 | #4 | ||
Старожил
Регистрация: 15.02.2010
Сообщений: 15,770
|
Цитата:
Цитата:
|
||
19.06.2010, 22:45 | #5 |
я получил эту роль
Старожил
Регистрация: 25.05.2007
Сообщений: 3,694
|
Как уже заметили, kernel32 подгружается в любом случае, даже если его нет в таблице импорта. Цепочка вызовов там выглядит приблизительно так:
kernel32.WriteConsoleA -> ntdll.CsrClientCallServer -> ntdll.ZwRequestWaitReplyPort -> ntdll.KiFastSystemCall -> Ядро В принципе, теоретически можно распихать в памяти нужные данные и дёрнуть SYSENTER, но это абсолютно лишено смысла, т.к. в лучшем случае будет работать на конкретном билде конкретной ОС.
пыщь
|
20.06.2010, 03:05 | #6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
причина всего этого в том что мы в защищенном режиме на третьем кольце.
в нулевом еще можно побузить но не стоит. API, это в первую очередь интерфейс взаимодействия с ОС(которая уже затем выводит на экран, в нужное место и тд). а так как вы находитесь уже в загруженной ОС, то ваша программа ею контролируется, и весь доступ(при условии полной защиты и не использования дыр в ней) идет через АПИ(вам остаются лишь комманды ассемблера, и то, все кроме тех что используют IO(процессорный, а не файлы), и прерывания) если хотите уж работать со всем напрямую то вам наверно нужно свою ОС писать, ну или уж ДОС.(там реальный режим) Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
20.06.2010, 08:40 | #7 | ||||
пыжашийся нуб
Пользователь
Регистрация: 19.06.2010
Сообщений: 93
|
Спасибо всем кто откликнулся. Чувствую быстро у меня ничего не получиться. Ну да ладно
Цитата:
Цитата:
Спасибо за наводку, копнем в эту сторону. Пока ничего спрашивать не буду, ибо степень понимания даже для задачи вопроса не достигнута. Такова поставленная задача, ни больше, ни меньше. Цитата:
Спасибо, помогло. Теперь проект не собрать. Получил что хотел. Цитата:
Вопросы: 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. |
||||
20.06.2010, 08:48 | #8 | |
пыжашийся нуб
Пользователь
Регистрация: 19.06.2010
Сообщений: 93
|
Редактировать уже не буду. Посмотрел повнимательнее, нашел:
Цитата:
Тогда вопрос: а что есть стандартный поток вообще? В который мне нужно вывести текст. Простите что спрашиваю у Вас, что нужно сделать мне. |
|
20.06.2010, 10:06 | #9 | ||||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
GetStartupInfo - STARTUPINFO - STARTUPINFO.hStdOutput
консоль работает через WriteFile(ReadFile ввод), в cout происходит преобразвание в текст. это вас интересовало. в принципе можно через .com тогда пойти, тогда не будет лишнего. Цитата:
видимо вам просто ХР нужна. Цитата:
то есть приложение на самом деле работает не с main, а ранее. сначало там проверяется передан ли нам хендл консоли(выше как я показал), если нет то открывается консоль.(AllocConsole вроде) после main идет как минимум строчка Код:
Цитата:
скорее всего примерно так. Цитата:
cd ДЛЛ от студии, в них находится части кода(libc и тд), которые затем не включаются в ваш exe(меньше вес), но приходится их таскать с собой Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||||
20.06.2010, 16:43 | #10 | ||
я получил эту роль
Старожил
Регистрация: 25.05.2007
Сообщений: 3,694
|
Цитата:
В винде есть фишка под названием local procedure call - некая хрень с клиент-серверной архитектурой для связи приложенией пользователя и ядра, сsrss.exe - сервер этой подсистемы, он контроллирует кучу всего, в том числе консольные приложения. Csrss создаёт некий объект "порт", вешает на него обработчик и в ntdll.NtReplyWaitReceivePort ждёт сообщение (сообщение<>текст). Если это сообщение приходит, проверяется формат и код сервиса, управление передаётся соответствующему обработчику. Итого: сишный printf мутузит строку, в конце-концов передаёт kernel32.WriteConsole, та куда-то её засовывает и вызывает какой-то сервис через ntdll.CsrClientCallServer (таблица всех консольных сервисов ConsoleServerApiDispatchTable недокументирована, разная для разных ОС/билдов и висит где-то в памяти winsrv.dll, загруженной в адресное пространство сsrss), ntdll.CsrClientCallServer отправляет сообщение сsrss'у и тот дальше куда-то в ядро. Цитата:
пыщь
Последний раз редактировалось JTG; 20.06.2010 в 16:51. |
||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |