Сейчас на форуме: tyns777, zombi-vadim (+3 невидимых) |
![]() |
eXeL@B —› Программирование —› Подгружаем свою длл |
Посл.ответ | Сообщение |
|
Создано: 23 марта 2008 18:23 · Поправил: a1ien · Личное сообщение · #1 Вобщем есть у нас чужое приложение. И есть своя Dll Той длл я хочу расширить(и изменить функционал) приложения. Как я понял есть 2 способа загрузить дллку. 1) Нашел одну статейку где народ делает так. Находим код где есть пустое место изменяем на него EP Добавляем туда LoadLibrary(грузим свою длл) потом вызываем GetProcAdress и после запускаем свою функцию. и потом прыгаем на OEP 2) Добавляем длл в секцию импорта. Только вот тут я так и не понял как вызвать свою функцию. И собственно вопрос. Чем кардинально отличаются эти 2 метода. И какой в каких условиях лучше использовать. + как вызывать функции чужого приложения из своей длл если она к нему подгружена. ![]() |
|
Создано: 23 марта 2008 18:37 · Личное сообщение · #2 |
|
Создано: 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 ![]() |
|
Создано: 23 марта 2008 18:44 · Личное сообщение · #4 |
|
Создано: 23 марта 2008 18:46 · Личное сообщение · #5 Smon пишет: Вызываешь свою функу или по смещению (тогда придётся в отладчике поискать), или стандартным способом: push dll base push procedure name call GetProcAddress, где dll base - адрес загрузки длл который получаешь при LoadLibrary в eax. А если мы через Импорт грузим. То как узнатьадрес по которому загрузилась dll? ![]() |
|
Создано: 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 медленнее - импорт быстрее (но сомневаюсь что это будет важно). ----- Всем привет, я вернулся ![]() |
|
Создано: 23 марта 2008 19:42 · Личное сообщение · #7 |
|
Создано: 23 марта 2008 19:55 · Поправил: Stack · Личное сообщение · #8 |
|
Создано: 23 марта 2008 19:59 · Поправил: a1ien · Личное сообщение · #9 |
|
Создано: 23 марта 2008 20:38 · Личное сообщение · #10 Ну на си надо получить поинтер на твою функцию. Вот код на delphi перевести на си не будет сложно если знаешь. var поинтер:function(параметры):что возвращяет или procedure(параметры) ............................. @поинтер:=адрес твоей функции - тут задаешь адрес твоей функции вызываешь так - поинтер(параметры) ЗЫ: DLL внедряет свой код в область кода процесса ----- Md5 fcbb6c9c9a5029b24d70f2d67c7cca74 ![]() |
|
Создано: 23 марта 2008 21:59 · Личное сообщение · #11 |
|
Создано: 23 марта 2008 22:08 · Личное сообщение · #12 |
|
Создано: 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); ![]() |
|
Создано: 24 марта 2008 15:24 · Личное сообщение · #14 |
|
Создано: 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 —› Программирование —› Подгружаем свою длл |