Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Минимум АПИ


Автор: Sunvas 10.9.2006, 00:31
Как свести к минимуму использование апи функций в программе? Нужны конструктивные советы. Может у кого-нить найдуться исходники неких апи функций на асме?

Автор: Alexeis 10.9.2006, 00:45
Цитата(Sunvas @  10.9.2006,  00:31 Найти цитируемый пост)
исходники неких апи функций на асме

Это является собственостью Microsoft, а потому если что-то и есть, то это либо украдено, либо дизасемблировано. И то и другое запрещено по закону. Так что в этом здесь не помогут. (Если речь идет о WinApi)

Автор: Sunvas 10.9.2006, 01:21
Цитата(alexeis1 @  10.9.2006,  00:45 Найти цитируемый пост)
Так что в этом здесь не помогут. (Если речь идет о WinApi)

Но почему сразу украдено?? Может гении додумались как та или иная процедура работает. Мне всего лишь надо минимум использование апи функций в программе. Нужны советы..

Автор: Alexeis 10.9.2006, 01:50
Ну в конце концов програма работает как клиент, на windows и при любой необходимость обо всем просит Win Api. Можно, конечно, написать сервис ядра который будет ко всему железу обращатся без api, но это будет не унивесально, только для того железа для которого будет предусмотрено. Но смысл Api дать универсальный аппаратно-независимый логический интерфес, где не надо себе ни чем морочить голову. Выходя из Api программа попадает во времена "ДОС". Где все нужно делать самому. А это более громоздко и не универсально.

Автор: BUGOR 10.9.2006, 09:08
Да не, ну в ДОСе были прерывания, тоже довольно универсальная штукаsmile

А вообще вопрос неккоректен. Какие именно API функции ты хочешь заменить? Если функции которые "ниже" ring3 не уходят(wsprintf lstrlen и т.д.), то не вижу проблемы, если режима ядра, то их можно вызывать через системные сервисы(с помощью sysenter или int 2Eh), но в каждой системе(даже сервиспаке) номера сервисов разные, а это дополнительный гемморой. 

Автор: RideX 10.9.2006, 09:44
Sunvas, пиши прогу под MS-DOS, или юзай Native API (ф-ции режима ядра). Хотя это посложнее будет чем Win32 API. Самый простой примерчик:
Код

implementation

{$R *.dfm}

const
 KeyName = '\Registry\Machine\SOFTWARE\NewKey';

 
procedure TForm1.Button1Click(Sender: TObject);
var
 uKeyName: TUnicodeString;
 attr: TObjectAttributes;
 hKey: dword;
begin
  RtlInitUnicodeString(@uKeyName, KeyName);
  InitializeObjectAttributes(@attr, @uKeyName, OBJ_CASE_INSENSITIVE, 0, nil);
  ZwCreateKey(@hKey, KEY_ALL_ACCESS, @attr, 0, nil, REG_OPTION_NON_VOLATILE, nil);
  ZwClose(hKey);
end;

end.

Автор: BUGOR 10.9.2006, 10:03
Так он же вроде вообще про API говорил, а ты ему Native API предлагаешь, это же те же апи, только вызываются из другой библиотекиsmile

Автор: Snowy 10.9.2006, 11:06
Цитата(Sunvas @  10.9.2006,  00:31 Найти цитируемый пост)
Как свести к минимуму использование апи функций в программе?
Не использовать никаких функций. Только синтаксис языка smile

Цитата(Sunvas @  10.9.2006,  00:31 Найти цитируемый пост)
Может у кого-нить найдуться исходники неких апи функций на асме?
Ты собераешься на асме обращаться к диску? Или к клаве? Или к монитору? В винде? Не используя API? Дохлый номер.
Ну, если тебе не нужен интерфейс ввода-вывода, то можно.
Только программа не будет получать ни откуда данные и никуда их не будет выводить.

- Вот написал программу?
- А что она делает?
- А фиг знает - она не говорит smile

Автор: BUGOR 10.9.2006, 12:18
Цитата

Ты собераешься на асме обращаться к диску? Или к клаве? Или к монитору? В винде? Не используя API? Дохлый номер.
Ну, если тебе не нужен интерфейс ввода-вывода, то можно.
Только программа не будет получать ни откуда данные и никуда их не будет выводить.


Бред. 

Автор: RideX 10.9.2006, 14:42
Цитата(BUGOR @  10.9.2006,  13:03 Найти цитируемый пост)
Так он же вроде вообще про API говорил, а Native API предлагаешь, это же те же апи, только вызываются из другой библиотеки

Они вызываются из ntdll/ntoskrnl, и вообще-то не те же, это "ядерные", т.е. Ring0 функции  smile Иначе как ты себе представляешь, каким образом он собирается взаимодействовать с операционной системой, так что ли:
Цитата(BUGOR @  10.9.2006,  12:08 Найти цитируемый пост)
их можно вызывать через системные сервисы(с помощью sysenter или int 2Eh)
Так это никакие не сервисы, это шлюз в Ring0, соответственно для WindowsXP/Windows 2000

Цитата(Sunvas @  10.9.2006,  03:31 Найти цитируемый пост)
Может у кого-нить найдуться исходники неких апи функций на асме?
Что значит исходники? Исходники экспортируемых функций из системных библиотек? Вообще в Инете где-то были исходники Windows, но сразу скажу, что у меня их нет.

Автор: BUGOR 10.9.2006, 15:15
RideX
Цитата

Они вызываются из ntdll/ntoskrnl, и вообще-то не те же, это "ядерные", т.е. Ring0 функции   Иначе как ты себе представляешь, каким образом он собирается взаимодействовать с операционной системой, так что ли:


Я вообще-то написал, что это Native API, я в курсе, что они исполняются в Ring0, но, что это принципиально меняет я не понимаю? Вопрос стоит как избавиться от АПИ, а ты вместо юзермодных предлагаешь ядерные, а что это меняет? Только имена функций и библиотеки из которых они импортируются. 


Цитата

так что ли:


Именно так, а чем предложенный мною вариант не подходит, в контексте данной темы?

Цитата


Цитата
их можно вызывать через системные сервисы(с помощью sysenter или int 2Eh)


Так это никакие не сервисы, это шлюз в Ring0, соответственно для WindowsXP/Windows 2000


Ты о чём вообще? Чтобы корректно вызвать sysenter или int 2Eh в eax надо положить номер сервиса.
Бог ты мой... Ну да на >= 2k будет работать точно, хотя скорее всего вообще на всей линейке NT будет работать, а может и на 98/Me или ты проверял, чтобы это утверждать?

Автор: RideX 10.9.2006, 16:52
Цитата(BUGOR @  10.9.2006,  18:15 Найти цитируемый пост)
ты вместо юзермодных предлагаешь ядерные, а что это меняет?
То, что юзермодные функции уже не используются.

Цитата(BUGOR @  10.9.2006,  18:15 Найти цитируемый пост)
чем предложенный мною вариант не подходит, в контексте данной темы?
Твой вариант использует функции ntoskrnl, ты понимаешь эту тему как полный отказ от использования API. Если ты считаешь это приемлемым, почему ты считаешь что нельзя использовать Native API, которые вернут тебе номер вызываемой ф-ции, а предлагаешь, как я понял, вручную подставлять их значения перед sysenter. К чему эта половинчатось? Тогда уж полностью отказывайся от использования функций Windows и не юзай ntoskrnl.

Цитата(BUGOR @  10.9.2006,  18:15 Найти цитируемый пост)
Ты о чём вообще?

Только лишь о том, что sysenter - это команда перехода в Ring0, т.е. в ntoskrnl.exe

Цитата(BUGOR @  10.9.2006,  18:15 Найти цитируемый пост)
Бог ты мой... Ну да на >= 2k будет работать точно, хотя скорее всего вообще на всей линейке NT будет работать, а может и на 98/Me или ты проверял, чтобы это утверждать?

Что я должен проверять, утверждаю что, про sysenter что ли? Так это в Intel Architecture Software Developer’s Manual написано, SYSENTER - Fast System Call, transfers to a flat protected mode kernel. И вообще, покажи где я говорил что что-то где-то не работает и про передачу параметров.

Автор: BUGOR 10.9.2006, 17:08
Цитата

То, что юзермодные функции уже не используются.


А где в теме сказано, что нужно избавиться от вызова только лишь юзермодных апи? Там сказано от АПИ в целом.

Цитата

Твой вариант использует функции ntoskrnl, ты понимаешь эту тему как полный отказ от использования API. Если ты считаешь это приемлемым, почему ты считаешь что нельзя использовать Native API, которые вернут тебе номер вызываемой ф-ции, а предлагаешь, как я понял, вручную подставлять их значения перед sysenter. К чему эта половинчатось? Тогда уж полностью отказывайся от использования функций Windows и не юзай ntoskrnl.


Вызов функций через системные сервисы  не использует ни экспорт, ни импорт файлов. Предложенный тобою вариант:
ZwCreateKey(@hKey, KEY_ALL_ACCESS, @attr, 0, nil, REG_OPTION_NON_VOLATILE, nil);

Это вызов функции которая ЭКСПОРТИРУЕТСЯ из ntdll.dll.

Цитата

Только лишь о том, что sysenter - это команда перехода в Ring0, т.е. в ntoskrnl.exe


Ну так я же с этим не спорюsmile

Цитата

Что я должен проверять, утверждаю что, про sysenter что ли? Так это в Intel Architecture Software Developer’s Manual написано, SYSENTER - Fast System Call, transfers to a flat protected mode kernel. И вообще, покажи где я говорил что что-то где-то не работает и про передачу параметров


Заметь, я везде на ряду с sysenter(а он появился вроде только в 2k) упоминаю int 2Eh. Ты в своём посте написал:
Цитата

соответственно для WindowsXP/Windows 2000

Я так понял ты имел ввиду, что это актуально только для этих систем. Я с этим не спорю, т.к. на других не проверял, хотя ntdll.dll есть и в 98 и в Me.

Добавлено @ 17:12 
Ну всё, я допёр, что ты имеешь ввиду... Да, я вызываю API, но в обход импорта и экспорта файлов, я думал автор топика именно этого хочет добиться. 

Автор: RideX 10.9.2006, 17:48
BUGOR, ага, понятно smile Тогда, думаю, автору топа надо смотреть в сторону кроссплатформенных приложений, там, по идее, использование ф-ций API должно быть минимальным.

Автор: RA 10.9.2006, 20:26
Цитата(Sunvas @  10.9.2006,  00:31 Найти цитируемый пост)
Как свести к минимуму использование апи функций в программе

 А что за нужда такая? 

PS:
Если ты хочешь скрыть таблицу импорта то есть другой способ .....

Автор: Sunvas 11.9.2006, 22:41
Цитата(RAdmin @  10.9.2006,  20:26 Найти цитируемый пост)
А что за нужда такая? 

На компах, куда я вынужден сливать свои программы некоторые АПИ функции отключены!! Я не знаю какие именно. Это сделано из соображений безопасности, но у меня из-за этого даже простой вызов Findwindow полностью глючит программу. Я уже очень долго мирюсь с этим... Просто надоело - пытаюсь найти хоть какой-нить выход.


Цитата(RAdmin @  10.9.2006,  20:26 Найти цитируемый пост)
Если ты хочешь скрыть таблицу импорта то есть другой способ .....

ЗЫ ну подскажи.. (хотя это мне это нужно всего лишь из-за любознательности).

Автор: dumb 12.9.2006, 00:04
Цитата(Sunvas @  11.9.2006,  22:41 Найти цитируемый пост)
На компах, куда я вынужден сливать свои программы некоторые АПИ функции отключены!!

скорее всего, дело в отсутствии административных прав у пользователя. даже если что-то и ограничивает использование "опасных" функций, есть большие сомнения что FindWindow попала в их ряды. опять же, ограничение этих самых "опасных" функций состоит лишь в том, что при их использовании будет возвращаться ошибка. только и всего.

Цитата(Sunvas @  11.9.2006,  22:41 Найти цитируемый пост)
даже простой вызов Findwindow полностью глючит программу

а такого рода явления, скорее всего, есть следствие недостаточного контроля ошибок.

Цитата(Sunvas @  11.9.2006,  22:41 Найти цитируемый пост)
Я уже очень долго мирюсь с этим... Просто надоело - пытаюсь найти хоть какой-нить выход.

выход - нормально исследовать ситуацию. ограничения прав, стоящее ПО, итд итп.

Автор: Sunvas 12.9.2006, 16:35
Цитата(dumb @  12.9.2006,  00:04 Найти цитируемый пост)
а такого рода явления, скорее всего, есть следствие недостаточного контроля ошибок.

Ошибки я хорошо контролирую. Даже пустая форма с кнопочкой, в Onclick которой написана данная функция страшно пугает ошибками памяти.

Автор: dumb 13.9.2006, 02:27
так что за ПО то там стоит? описываемая тобой ситуевина отдает какой-то дурно пахнущей мистикой. user posted image

Автор: Sunvas 13.9.2006, 21:45
Цитата(dumb @  13.9.2006,  02:27 Найти цитируемый пост)
так что за ПО то там стоит?

ПО - стандартное. Есть касперский, но он не насторен чему-то вредить....
Мне кажется, что АПИ функции отключены путем перекомпилирования системных библиотек..

Автор: dumb 14.9.2006, 02:41
Цитата(Sunvas @  13.9.2006,  21:45 Найти цитируемый пост)
Мне кажется, что АПИ функции отключены путем перекомпилирования системных библиотек..

ага, точно - windows ж open source! user posted image
возьми, например, http://z-oleg.com/secur/avz/download.php и просканируй систему, а не рассказывай "байки из склепа". user posted image

Автор: Sunvas 14.9.2006, 18:00
Цитата(dumb @  14.9.2006,  02:41 Найти цитируемый пост)
ага, точно - windows ж open source! 

Путем тупого дизасемблирования и правки ассемблерного кода! Все делается из под доса, так что винда ничего не видит и не знает. Даж сам когда-то видел как такое делается...


Цитата(dumb @  14.9.2006,  02:41 Найти цитируемый пост)
"байки из склепа".

Это не байки, это горькота жизни.

Автор: Damarus 14.9.2006, 18:52
Цитата(Sunvas @  14.9.2006,  19:00 Найти цитируемый пост)
Путем тупого дизасемблирования и правки ассемблерного кода! Все делается из под доса, так что винда ничего не видит и не знает. Даж сам когда-то видел как такое делается...

И как тот, кто правил, не повесился smile 

Автор: Yanis 15.9.2006, 09:03
Цитата(Snowy @  10.9.2006,  12:06 Найти цитируемый пост)
Только синтаксис языка 

Синтаксис языка (по крайней мере Delphi) использует WinAPI функции smile

Автор: dumb 15.9.2006, 10:28
Цитата(Sunvas @  14.9.2006,  18:00 Найти цитируемый пост)
Путем тупого дизасемблирования и правки ассемблерного кода!

ты когда-нибудь пробовал? собрать рабочий модуль из дизассемблированного листинга - весьма нетривиальная задача, если речь не идет о программе типа "hello world". задачи такого рода(изменение поведения функций) решаются перехватом. дизасм в таких случаях помогает, а не решает.

Автор: Sunvas 15.9.2006, 15:51
Цитата(Damarus @  14.9.2006,  18:52 Найти цитируемый пост)
И как тот, кто правил, не повесился  

Повеселился - процедуры же не работают!


Цитата(dumb @  15.9.2006,  10:28 Найти цитируемый пост)
изменение поведения функций

Я же не говорю, чтобы поведение функций изменить! Можно из просто-на-просто запортить изменяя je на jne. Есть более продвинутые программы (платные), которые позволяют тем, кто сечет в ассемблере делать другие навороченые вещи. Одна такая программа кажись называется (точно не помню) "*** DrHack"

Автор: dumb 15.9.2006, 16:11
процесс изменения hex-редактором кода системных библиотек, да еще и так, что они начинают сыпать ошибками, называется не "перекомпилирование системных библиотек", а идиотизм. за такое руки надо отрывать.
бороться с этим не надо, надо просто либо систему переставлять, либо взять основные системные dll из винды той же сборки и записать поверх испорченных.

Автор: Sunvas 15.9.2006, 18:10
Цитата(dumb @  15.9.2006,  16:11 Найти цитируемый пост)
либо взять основные системные dll из винды той же сборки и записать поверх испорченных.

Интересно, как ты это сделаешь на системе НТФС да еще и в винде?

Автор: Damarus 15.9.2006, 18:16
Цитата(Sunvas @  15.9.2006,  19:10 Найти цитируемый пост)
Интересно, как ты это сделаешь на системе НТФС да еще и в винде?

sfc /scannow

Автор: RA 15.9.2006, 19:55
Или из доса.

Автор: Sunvas 15.9.2006, 21:48
Цитата(RA @  15.9.2006,  19:55 Найти цитируемый пост)
Или из доса.

В нтфс из под доса. Я знаю всего одну програму, которая может писать в НТФС из под доса. Но для этого мне надо еще и с чего-то загрузиться, а возможности у меня нет.
ЗЫ назови хоть одну толковую программу, которая могла бы писать в НТФС из под доса.

Цитата(Damarus @  15.9.2006,  18:16 Найти цитируемый пост)
sfc /scannow

А без диска никак! Там сидюков нет!

Давайте не будем отклоняться от темы!

Автор: Damarus 16.9.2006, 06:16
Цитата(Sunvas @  15.9.2006,  22:48 Найти цитируемый пост)
Давайте не будем отклоняться от темы!

А куда здесь отклонятся smile Если системные библиотеки повреждены, ты тут ничего не сделаешь.

Автор: Mr.Floppy 18.9.2006, 10:53
Цитата
Как свести к минимуму использование апи функций в программе?


Писать свои драйвера для низкоуровневого доступа к железу и обращаться к ним. Короче - половина операционки smile

Автор: RA 18.9.2006, 13:26
Цитата(Sunvas @  15.9.2006,  21:48 Найти цитируемый пост)
ЗЫ назови хоть одну толковую программу, которая могла бы писать в НТФС из под доса.

Волков, нортон и тп. но если загружаться несчего тогда пззззз.

Автор: Sunvas 21.9.2006, 16:46
Цитата(RA @  18.9.2006,  13:26 Найти цитируемый пост)
Волков, нортон и тп. но если загружаться несчего тогда пззззз.

Дану! А у меня че-то не пишут. Грузился када-то с дискеты 98, грузил волков и нортон - НТФС даже не  видели, не то, чтоб даже читали!

Автор: Akella 22.9.2006, 08:12
Цитата(Snowy @  10.9.2006,  11:06 Найти цитируемый пост)
- Вот написал программу?
- А что она делает?
- А фиг знает - она не говорит smile

 smile  smile  smile 

Цитата(Sunvas @  11.9.2006,  22:41 Найти цитируемый пост)
даже простой вызов Findwindow полностью глючит программу.

а как же сама винда работает?

Добавлено @ 08:14 
Sunvas, а если в папку своей программы кинуть системные библиотеки.... и работать с ними

Автор: Sunvas 22.9.2006, 15:10
Цитата(Akella @  22.9.2006,  08:12 Найти цитируемый пост)
а как же сама винда работает?

Цитата(Akella @  22.9.2006,  08:12 Найти цитируемый пост)
- А фиг знает - она не говорит smile

 smile  smile  smile 
Цитата(Akella @  22.9.2006,  08:12 Найти цитируемый пост)
Sunvas, а если в папку своей программы кинуть системные библиотеки.... и работать с ними

О! Первая умная мысль за все время конференции.
Из этого следуют вопросы: а могут ли быть конфликты из-за этого? Вызовы процедур из таких библиотек можно ли перехватить?



Автор: dumb 23.9.2006, 03:32
Цитата(Sunvas @  22.9.2006,  15:10 Найти цитируемый пост)
Вызовы процедур из таких библиотек можно ли перехватить?

перехватить можно все.

для того, чтобы использовались "свои" dll, их нужно динамически подгружать, причем с указанием пути(например: LoadLibrary(".\kernel32.dll")). во всех остальных случаях будут использоваться библиотеки системы... хотя, можно и со статическим импортом повеселиться - законных способов сделать такое не припомню, а руками примерно так: переименовать kernel32.dll в krnl32.dll и в хекс-редакторе заменить строку(и) "KERNEL32.DLL" на ".\KRNL32.DLL"...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)