Сейчас на форуме: tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› Подгружаем свою длл
Посл.ответ Сообщение

Ранг: 6.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 марта 2008 18:23 · Поправил: a1ien
· Личное сообщение · #1

Вобщем есть у нас чужое приложение.
И есть своя Dll

Той длл я хочу расширить(и изменить функционал) приложения.
Как я понял есть 2 способа загрузить дллку.
1) Нашел одну статейку где народ делает так.
Находим код где есть пустое место изменяем на него EP
Добавляем туда LoadLibrary(грузим свою длл) потом вызываем GetProcAdress и после запускаем свою функцию. и потом прыгаем на OEP
2) Добавляем длл в секцию импорта.
Только вот тут я так и не понял как вызвать свою функцию.

И собственно вопрос. Чем кардинально отличаются эти 2 метода. И какой в каких условиях лучше использовать.
+ как вызывать функции чужого приложения из своей длл если она к нему подгружена.



Ранг: 260.2 (наставник)
Активность: 0.190
Статус: Участник

Создано: 23 марта 2008 18:37
· Личное сообщение · #2

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



Ранг: 500.5 (!), 8thx
Активность: 0.230
Статус: Участник

Создано: 23 марта 2008 18:42 · Поправил: Smon
· Личное сообщение · #3

a1ien пишет:
Только вот тут я так и не понял как вызвать свою функцию.


В случае LoadLibrary адрес функции ищется стандартным способом:
push dll base
push procedure name
call GetProcAddress,
где dll base - адрес загрузки длл который получаешь при LoadLibrary в eax.

В случае прописи функций твоей библиотеки в импорт - смотри оффсет который будет указывать на нужную функцию в директории импорта исполняемого файла.

-----
"Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels




Ранг: 6.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 марта 2008 18:44
· Личное сообщение · #4

Это ясно. Но как удобней и лучше делать? Вроде первый способ получше.
А как вторым способом вызвать функцию из dll.
И еще когда подгружаешь через LoadLibrary вызывается ли DllMain ?



Ранг: 6.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 марта 2008 18:46
· Личное сообщение · #5

Smon пишет:
Вызываешь свою функу или по смещению (тогда придётся в отладчике поискать), или стандартным способом:
push dll base
push procedure name
call GetProcAddress,
где dll base - адрес загрузки длл который получаешь при LoadLibrary в eax.

А если мы через Импорт грузим. То как узнатьадрес по которому загрузилась dll?



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 23 марта 2008 19:20
· Личное сообщение · #6

a1ien пишет:
И еще когда подгружаешь через LoadLibrary вызывается ли DllMain ?

Разумеется. RTFM:
If the module is a DLL not already mapped for the calling process, the system calls the DLL's DllEntryPoint function with the DLL_PROCESS_ATTACH value. If the DLL's entry-point function does not return TRUE, LoadLibrary fails and returns NULL.
a1ien пишет:
А если мы через Импорт грузим. То как узнатьадрес по которому загрузилась dll?

Импорт он и есть импорт. Смотри доку PE-формата. Сейчас PE32 уже подробно описан.

Не заморачивайся с импортом. Разумеется, есть инструменты, которые помогают добавить dll и функции из неё в импорт, но лучше обойтись без этого.

a1ien пишет:
Чем кардинально отличаются эти 2 метода.

1. DllMain в импорте выполняется раньше полной подгрузки импорта и разумеется до того как управление получил главный модуль процесса (то есть до EntryPoint exe-файла). Это может быть важно.
2. LoadLibrary медленнее - импорт быстрее (но сомневаюсь что это будет важно).

-----
Всем привет, я вернулся




Ранг: 6.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 марта 2008 19:42
· Личное сообщение · #7

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



Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 23 марта 2008 19:55 · Поправил: Stack
· Личное сообщение · #8

насколько я знаю :
загоняешь в стек параметры функции в обратном порядке.
После - call адрес функции

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74




Ранг: 6.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 марта 2008 19:59 · Поправил: a1ien
· Личное сообщение · #9

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



Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 23 марта 2008 20:38
· Личное сообщение · #10

Ну на си надо получить поинтер на твою функцию.
Вот код на delphi перевести на си не будет сложно если знаешь.

var
поинтер:function(параметры):что возвращяет или procedure(параметры)
.............................
@поинтер:=адрес твоей функции - тут задаешь адрес твоей функции
вызываешь так - поинтер(параметры)
ЗЫ: DLL внедряет свой код в область кода процесса

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74




Ранг: 6.6 (гость)
Активность: 0=0
Статус: Участник

Создано: 23 марта 2008 21:59
· Личное сообщение · #11

Ну как вызвать ясно. А какой тим указателья должен быть?



Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 23 марта 2008 22:08
· Личное сообщение · #12

так я говорю тип - function(параметры) на delphi , а на си вроде тоже так

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74




Ранг: 284.8 (наставник), 6thx
Активность: 0.150
Статус: Участник

Создано: 24 марта 2008 13:36
· Личное сообщение · #13

a1ien пишет:
А если DLL на си пишется то как вызвать функцию по адресу?


Что бы из длл вызывать функцию нужно знать ее адресс + какие параметры принимает и что возвращает.

типа того: у тебя есть фунция по адресу 0х00401000 и она принимает 2 параметра DWORD и ничего не возвращает.

typedef void (WINAPI *FUNC)(DWORD, DWORD );

FUNC MyFun;

MyFun = (FUNC)0x00401000;

MyFun(0 , 1);



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

Создано: 24 марта 2008 15:24
· Личное сообщение · #14

> Разумеется. RTFM:
смортя с какими флагами вызов, хотя это уже про LoadLibraryEx.
> 2. LoadLibrary медленнее - импорт быстрее (но сомневаюсь что это будет важно).
по-моему одно и тоже.

-----
Shalom ebanats!




Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 24 марта 2008 16:03
· Личное сообщение · #15

RSI пишет:
Что бы из длл вызывать функцию нужно знать ее адресс + какие параметры принимает и что возвращает.

типа того: у тебя есть фунция по адресу 0х00401000 и она принимает 2 параметра DWORD и ничего не возвращает.

typedef void (WINAPI *FUNC)(DWORD, DWORD );

FUNC MyFun;

MyFun = (FUNC)0x00401000;

MyFun(0 , 1);


Я тоже самое говорил просто я синтаксиса си незнаю

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74



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


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