Сейчас на форуме: bartolomeo, tyns777 (+5 невидимых)

 eXeL@B —› Программирование —› [Delphi] Возможно ли создание forwarded API?
Посл.ответ Сообщение


Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 15 марта 2011 18:47
· Личное сообщение · #1

Собственно давно разыскиваю способ создания forwarded API на Delphi. Т.е. что бы в своей DLL была экспортируемая апи, которая указывала, что она перемещена в другую DLL. В Си такое с полпинка делается, даже в масме без проблем, а в делфи даже в интернете ничего нет. Максимум чего добился, это:

procedure MyFunc; external 'DllName';

exports
MyFunc;

Но в таком случае долбаный делфи всё равно указывает, что тело функции в моей DLL а вместо тела функции ставить
jmp dword ptr [addr_of_MyFunc_in_DllName]

В делфи уже и отложеный импорт прикрутили, а такую древнюю фишку до сих пор нет?

-----
Yann Tiersen best and do not fuck




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 15 марта 2011 21:11
· Личное сообщение · #2

PE_Kill это попытка реализации врапинга или я не в теме?

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 15 марта 2011 22:38
· Личное сообщение · #3

Да да, оно самое.

-----
Yann Tiersen best and do not fuck





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 16 марта 2011 06:26
· Личное сообщение · #4

На примере GetCommandLineA;

function GetCommandLineA():cardinal; stdcall; external 'kernel32.dll';
exports
GetCommandLineA name 'MyFunc';

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 16 марта 2011 07:07
· Личное сообщение · #5

ClockMan ты не понял сути. Я говорю про механизм:

dll.def
Code:
  1. LIBRARY MyLib
  2. EXPORTS
  3. ;
  4. ; Forwards to SuperLib.DLL
  5. ;
  6. Func1=SuperLib.Func1 @1
  7. Func2=SuperLib.Func2 @2
  8. Func3=SuperLib.Func3 @3


Такой DEF файл заставит линкер сгенерировать таблицу экспорта только из форвардов, т.е. вместо тела API будет строка SuperLib.FuncX и система выдаст приложению, который будет грузить MyLib адрес в SuperLib а не в MyLib. Так вот в Delphi отказались от DEF файла, а как сделать без него я и не знаю. И уже в принципе уверен, что в Delphi вообще не реализовали этот механизм.

-----
Yann Tiersen best and do not fuck





Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 16 марта 2011 07:20
· Личное сообщение · #6

Кожись понял, ты хочешь чтоб в таблице эспорта сразу шли адреса на другую длл?

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 16 марта 2011 08:01
· Личное сообщение · #7

Ну грубо да, просто для этого M$ придумала специальный механизм, собственно я и спрашиваю можно ли этот механизм заюзать в делфях.

Если кому непонятно для чего оно надо. Ясно, что можно сделать все экспортируемые апи у себя, а в этих апи просто вызывать оригинальные. Но в библиотеках еще бывают расшареные структуры. Т.е. есть некая глобальная структура в DLL, ее объявляют как экспортируемую и она появляется в таблице экспорта как экспортируемая API. А потом процесс через GetProcAddress получает адрес этой структуры и начинает с ней работать. Так вот если мы захотим прикинуться такой длл, но вызывать апи из оригинальной, то вот такую структуру мы не проэмулируем, т.к. приложению мы должны отдать адрес именно на нее. Тут нужен только форвардинг.

ЗЫ Придется наверное свой биндер писать и в пост билд засовывать.

-----
Yann Tiersen best and do not fuck





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 16 марта 2011 08:45 · Поправил: ajax
· Личное сообщение · #8

PE_Kill
lpk.dll ? Копируй байтики в свою структуру.

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 16 марта 2011 09:07
· Личное сообщение · #9

Да не это всё костыли. А если таких структур 100, да еще и неизвестен их размер? А если они динамически обновляются? Херня это.

-----
Yann Tiersen best and do not fuck




Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 16 марта 2011 09:22
· Личное сообщение · #10

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

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 16 марта 2011 10:54 · Поправил: ajax
· Личное сообщение · #11

PE_Kill
Сейчас поигрался - максимум, что можем получить - джампы. Адреса все равно наши. Придется что-то свое соображать. Есть маза сделать, как ClockMan в первом посте описал, а потом утилью своей import/export пропарсить-поправить...

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 16 марта 2011 14:20
· Личное сообщение · #12

ajax пишет:
а потом утилью своей import/export пропарсить-поправить...

Вот вот, я это и хочу сделать

PE_Kill пишет:
ЗЫ Придется наверное свой биндер писать и в пост билд засовывать.


-----
Yann Tiersen best and do not fuck



 eXeL@B —› Программирование —› [Delphi] Возможно ли создание forwarded API?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати