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 {}, как оказалость, использует.
Заранее спасибо всем откликнувшимся.
Необходимо в Windows XP SP3 распечатать в стандартный поток "some text here" без прямого или косвенного использования kernel32.dll и advapi32.dll (в иделе программа вообще с этими библиотеками слинкована быть не должна).
это бред. Описывайте конкретнее и для чего это вам нужно.
Что-то мне подсказывает, что автор думает, что библиотеки прилинковываются к исполняемому файлу - это не так. kernel32 и avdapi уже загружены в адресное пространство в любом случае,а в образе программы просто проставляются адреса. Хотя в этом предположении (насчёт того, что думает автор) я могу ошибаться.
Почему автор хочет не использовать kernel32 - у меня есть две версии:
1) Это такое задание
2) Автор думает что библиотеки прилинковываются к исполняемому файлу и увеличивает его размер
4) задание сформулировано нормально, но фамилия автора - Попов
5) задание формулировал учитель информатики Попова.
Необходимо в Windows XP SP3 распечатать в стандартный поток "some text here" без прямого или косвенного использования kernel32.dll и advapi32.dll (в иделе программа вообще с этими библиотеками слинкована быть не должна).
Для чего, зачем? Ответ на этот вопрос поможет решить задачу.
В принципе, используя Native API можно многое.
2)Создать приложение в VS не использующее kernel32.dll. Пустое консольное приложение void mail {}, как оказалость, использует.
Это не сложно, достаточно отключить линковку дефолтовых либ и назначить т.входа.
Но опять же, зачем?
Откуда такая уверенность?
Дело субъективное. Мне проще на C/C++.
она всё равно загрузится, даже если вы её не пропишите в импорте.
Она не грузится, а проецируется в адресное пространство.
Но проецируется в пользовательском режиме в любом случае, это да.
Это не бред, но требуется нечасто. Хотелось бы узнать зачем это автору.
Не приведет.
Писать получиться только на асме, потому что любые компиляторы высокого уровня добавляют в программу обработки исключений и т. п. Разумеется, для этого используются функции Windows.
Ошибаешься. Драйвера по-твоему получается пишутся тоже только на асме?
Во-первых, компилятор тут не при чем. Линковкой занимается линкер.
Во-вторых, что компилятор, что линкер обычно настраиваются.
Т.е. вполне можно написать на C/C++.
Что-то мне подсказывает, что автор думает, что библиотеки прилинковываются к исполняемому файлу - это не так.
kernel32 и avdapi уже загружены в адресное пространство в любом случае,а в образе программы просто проставляются адреса.
avdapi изначально не проецируется (не загружается) в процесс
а для "простановки адресов" в любом случае должна быть инф. в программе (IAT как вариант).
[COLOR="SlateGray"]Можете не пояснять, я это знаю. Но я бы не стал постоянно употреблять только этот термин.[/COLOR]
автор отпишитесь это ли вам надо вообще? вот код
include 'win32wx.inc'
include 'encoding/win1251.inc'
struct CLIENT_ID
UniqueProcess dd ?
UniqueThread dd ?
ends
struct PORT_MESSAGE
Length dd ?
ZeroInit dd ?
ClientId CLIENT_ID
Unknown dq ?
MessageId dd ?
CallbackId dd ?
ends
struct CSRSS_WRITE_CONSOLE_REQUEST
Header PORT_MESSAGE
Unknown dq ?
ConsoleHandle dd ?
StdHandle dd ?
Buffer du 40 dup ? ; 0x50 bytes max (40 WCHARs)
BufferAddress dd ?
BufferLength dd ?
Unknown2 dd ?
UnknownFlag db ?
IsUnicode db ?
Unknown4 db 42 dup ?
Unknown5 dd ?
Unknown6 db 116 dup ?
ends
.code
entry Main
proc Main
locals
Request CSRSS_WRITE_CONSOLE_REQUEST
endl
xor eax,eax
lea edi,[Request]
mov ecx,sizeof.CSRSS_WRITE_CONSOLE_REQUEST
rep stosb
xor eax,eax
mov eax,[fs:eax+0x30]
mov eax,[eax+0x10] ; RTL_USER_PROCESS_PARAMETERS
mov edx,[eax+0x10] ; ProcessParameters.ConsoleHandle
mov [Request.ConsoleHandle],edx
mov edx,[eax+0x1c] ; ProcessParameters.StdOutputHandle
mov [Request.StdHandle],edx
mov [Request.UnknownFlag],1
mov [Request.IsUnicode],1
mov [Request.Unknown5],-1
lea esi,[wstrMessage]
lea edi,[Request.Buffer]
mov [Request.BufferAddress],edi
mov [Request.BufferLength],sizeof.wstrMessage
mov ecx,sizeof.wstrMessage shr 1
rep movsw
invoke CsrClientCallServer,addr Request,NULL,0x0002021e,0x0000006c
ret
endp
.data
wstrMessage du 'Hello, World!'
sizeof.wstrMessage = $-wstrMessage
data import
library ntdll,'NTDLL.DLL'
import ntdll,\
CsrClientCallServer,'CsrClientCallServer'
end data
Да, так и есть. Предыдущие 4 дня потратил на ликвидацию своей безграмотности. Надеюсь хоть от части это удалось.
To bagie2
Золотой человек! Похоже что оно и надо. Попытаюсь собрать. Это FASM?
Это не бред, но требуется нечасто. Хотелось бы узнать зачем это автору.
бред в том смысле, как это описано ТС-ом. Именно потому что не указано "зачем" (и есть обоснованные подозрения на непонимание). Поэтому мне тоже хотелось бы знать и от этого отталкиваться :)
Ну вот, интересный диалог запороли...
Вот за это отдельное спасибо :)
А это все к bagie2, спасибо ему отдельное :). Я уже WriteConsoleA до низа отреверсил. Мое решение бы было схоже, но раз в 20 объемнее.
Конечно, но послезавтра :)
Сейчас попробую собрать на MASM`е, если получится, то прям совсем все хорошо.
интересная позиция...а почему именно послезавтра? :)
мы увидим это в новостях?
Что-то мне подсказывает, что это задание. Ну а послезавтра чтобы препод не нашёл решение в Google на этом форуме до того как его проверил.
Тут была написана ЧУШЬ. Прочитал разницу с синтаксисе между FASM и MASM. Ушел переделывать.
1)Да задание
2)Нет, не препод
3)Найдут - неважно
4)Ибо суеверен
Так и знал. Автор, ты создал тему не там где ей место, и нарываешься на нарушение. Тем самым еще и запутал народ.
Топикстартеру - вы никуда ничего не пишете. Поэтому и нет результата.
З.Ы. на самом деле вопрос на нарушение вовсе не тянет. Мы же наказываем не за "задания" - а за тупость и не желание думать и пользоваться поиском. Это не значит, что любой человек задавший вопрос с "с лабы" автоматом казнится. Это значит что если человек сам не хочет ничего делать а хочет готовое - вот тут он узнает про себя много нового и не ожиданного.
Автора можно упрекнуть только в одном - невнятно сформулированное задание. Но это отнюдь не значит что любой студент будет наказан. Наказаны будут только дебилы - да и то не навсегда.
Автор вполне разбирается и не вижу проблем.
Это настолько критично? Приношу свои извинения. Почему запостил тему здесь, а не в разделе помощи студентам? Так я ведь и не просил никого решать это задание. Просто в силу своей некомпетентности привел задание целиком и просил помочь осмыслить задачу как таковую. На другом форуме мне провели неслабый ликбез, за что людям спасибо. Здесь нашелся добрый человек, который вообще решил задачу. Спасибо ему отдельное. Об уместности - тут уже модераторам решать.
Тогда не вопрос, я тоже приношу свои извинения :).
А вообще я подозревал что автору нужен всего то NtDisplayString().
Как в MASM получить UNICODE строку? Тоесть не преобразовать в юниод, а получить еще при объявлении? типа:
мы увидим это в новостях?
Речь идет о задании для участия в летней школе Parallels на базе НГУ.
P.S. "Чтобы оценить ваши реальные навыки программирования и лучше определить, для какого проекта ваши навыки больше всего подходят, прошу вас выполнить одно или несколько тестовых заданий".
Ну, не знаю я ассемблер. Остальные задания вообще были не интересными. Хоть не зря 5 дней потратил, мож чему то научился :)
Большое спасибо всем принявшим участие в обсуждении, особенно bagie2, который вообще не поленился написать програмку.
P.S. Юникод не понадобился :)
Ладно, думаю, сделаю тогда и свой вариант. А фига с два.
Отреверсил WriteCondoleA до самого низа, а там (вложение) предложенный Bagie2 CsrClientCallServer. Даже параметры теже :) Получается, вся моя работа начилась и закончилась тем, что я код FASM собрал в MASM. Единственное - изменение - кодировка, аски вместо юникода. Вот так я съездил в Новосиб :)
P.S. помогать не надо :)