Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/41: Рейтинг темы: голосов - 41, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 04.02.2011
Сообщений: 5
1

Каким образом заставить программу загружать dll из указанной папки?

04.02.2011, 13:00. Показов 7382. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть одна программка, которую надо заставить подгружать .dll'ку из другой папки.
Пишу античит к одной игрушке, нужно сделать так, чтобы при запуске, прога первым делом искала .dll в указанной мною папке, а затем уже в текущей директории откуда она запускается и директориях system32, system и т.д

Подскажите как это сделать правильно. Это возможно 100%, по крайней мере на Delphi..
Процесс запускаю через CreateProcess();
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2011, 13:00
Ответы с готовыми решениями:

Можно ли каким-то образом заставить WebClient создавать папки для скачиваемых файлов
Можно ли каким-то образом заставить WebClient создавать папки для скачиваемых файлов, т.е. я пишу...

Каким образом лучше загружать данные из текстового файла? Можно ли обойтись при этом только js, не используя php?
Всем привет, столкнулся с определенной проблемой, у меня есть текстовый файл, в котором находятся...

Возможно ли как-то заставить BIOS, каким то образом определить название проца
Здравствуйте уважаемые специалисты ну или просто многознающие люди!Заранее прошу прощения за...

Как заставить программу загружать картинку рандомно?
Есть некое количество картинок в нескольких папках (все в одной коренной папке). Как заставить...

10
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
04.02.2011, 13:23 2
Как вариант:
C++
1
2
HMODULE hLib;
hLib = LoadLibrary("MyDll.dll");
0
0 / 0 / 0
Регистрация: 04.02.2011
Сообщений: 5
04.02.2011, 13:37  [ТС] 3
Цитата Сообщение от zulkis Посмотреть сообщение
Как вариант:
C++
1
2
HMODULE hLib;
hLib = LoadLibrary("MyDll.dll");
Чтобы было понятнее:
Прога загружает dll'ку, допустим, "test.dll".
Мне нужно чтобы она ее сперва искала в указанной мной директории, а затем уже во всех остальных.
вариант с LoadLibrary не подходит, т.к. нет исходников.

Добавлено через 6 минут
Советовали перехватывать адрес LoadLibrary и заменять на свою функцию.
Надеюсь есть решение проще.
0
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
04.02.2011, 13:43 4
По мне так напрашивается решение помещения dll непосредственно в папку с игрой, и все
Иначе, имхо, вам необходимо перехватить вызов программы.
1. http://www.rsdn.ru -> Статьи -> Базовые сервисы -> Перехват вызовов API
2. Джеффри Рихтер, "Windows для профессионалов", глава 22
Это если я правильно вас понял
0
0 / 0 / 0
Регистрация: 04.02.2011
Сообщений: 5
04.02.2011, 13:57  [ТС] 5
Цитата Сообщение от zulkis Посмотреть сообщение
По мне так напрашивается решение помещения dll непосредственно в папку с игрой, и все
Иначе, имхо, вам необходимо перехватить вызов программы.
1. http://www.rsdn.ru -> Статьи -> Базовые сервисы -> Перехват вызовов API
2. Джеффри Рихтер, "Windows для профессионалов", глава 22
Это если я правильно вас понял
В папке с прогой уже есть такая dll.
Мне же нужно чтобы прога эту "test.dll" грузила не из папки откуда ее запускают, а из любой папки, которую я укажу.
0
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
04.02.2011, 14:07 6
Я конечно все понимаю, что у вас видение вашего проекта лучше, но все же понятнее было бы называть вещи своими именами, а не просто "прога". Я понимаю вас так: программе-античиту необходимо подключать dll откуда бы то ни было, а она изначально пытается запустить dll из своей папки. Это логично. И я бы пытался решить через, как я уже сказал, перехват вызова программы. Может кто еще что порекомендует.
0
0 / 0 / 0
Регистрация: 04.02.2011
Сообщений: 5
04.02.2011, 14:27  [ТС] 7
Цитата Сообщение от zulkis Посмотреть сообщение
Я конечно все понимаю, что у вас видение вашего проекта лучше, но все же понятнее было бы называть вещи своими именами, а не просто "прога". Я понимаю вас так: программе-античиту необходимо подключать dll откуда бы то ни было, а она изначально пытается запустить dll из своей папки. Это логично. И я бы пытался решить через, как я уже сказал, перехват вызова программы. Может кто еще что порекомендует.
Нет не программе античиту нужно подключать. Игра подгружает dll. нашел адрес в .exe файле названия этого dll. Меняю с engine.dll на mygine.dll(в нем происходят проверки различные) в памяти. Далее mygine.dll уже грузит настоящую engine.dll
нужно чтобы этот mygine.dll игра цепляла из директории античита, а не из своей текущей директории.

Сейчас подгрузка dll происходит вышеописанным образом. изменить "engine.dll" на более длинную строку, допустим на c:\asd\mygine.dll, не имеется возможным т.к. можно затиреть другие байты. то есть в распоряжении только 10символов.
Похоже что придется перехватывать адрес loadlibrary. ищу вашу книгу...
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
04.02.2011, 15:55 8
как тут уже говорили, у рихтера целая глава этому посвящена
0
0 / 0 / 0
Регистрация: 04.02.2011
Сообщений: 5
05.02.2011, 12:17  [ТС] 9
Цитата Сообщение от alex_x_x Посмотреть сообщение
как тут уже говорили, у рихтера целая глава этому посвящена
У Рихтера, в 22 главе есть лишь теория о том как внедрить Dll, которая перехватит API функцию в другом процессе с помощью CreateProcess и флага CREATE_SUSPENDED. Никаких примеров. Сказано что возможно, но сложно.

Решение - найдено:

с помощью вот этого http://newgre.net/ninjectlib внедряю свою dll в процесс. DLL перехватывает функцию LoadLibraryA и заменяет на мою. В моей идет условие

C++
1
2
3
4
5
6
7
8
    if(strcmp(lpLibFileName, "engine.dll") == 0)
    {
        return LoadLibraryW(lpData);
    }
    else
    {
        return originalLoadLibrary(lpLibFileName);
    }
где lpData - переменная, которая получает значение из реестра. Другого способа передачи нахождения нужной мне DLL не придумал, да и не нужно, т.к. этот справляется на ура.

Добавлено через 4 минуты
код для DLL, в которой осуществляется перехват функции можно найти на том же сайте, либо использовать detours и ему подобные.

Добавлено через 3 минуты
Другие методы внедрения, кроме как через CreateProcess, для перехвата LoadLibrary не будут работать, т.к. процесс уже загрузит нужные ему dll и вы не сможете подменить нужную вам dll на свою.
0
Модератор
Эксперт по электронике
8947 / 6713 / 921
Регистрация: 14.02.2011
Сообщений: 23,690
14.02.2011, 01:56 10
Если я правильно понял то
в одной папке лежит прога и родная dll
а не родная в другой папке
программа должна обратится к неродной а та уже вызовет родную
Но программа конечно же ищет сначала в своей директории
1 порядок просмотра директорий определяется где то в реестре (но там помоему есть ограничения)

Можно сделать так
2 Создаем свою dll с именем родной, определяем в ней весь импрорт родной и кладем в папку к проге.
а родную переименовываем (или кладем в другое место) и обращаемся к ней уже из своей dll

3 можно попробовать задействовать Хуки
С важением Валерий
0
ramobili
05.03.2011, 01:25 11
Цитата Сообщение от basmann Посмотреть сообщение
У Рихтера, в 22 главе есть лишь теория о том как внедрить Dll, которая перехватит API функцию в другом процессе с помощью CreateProcess и флага CREATE_SUSPENDED. Никаких примеров. Сказано что возможно, но сложно.

Решение - найдено:

с помощью вот этого http://newgre.net/ninjectlib внедряю свою dll в процесс. DLL перехватывает функцию LoadLibraryA и заменяет на мою. В моей идет условие

C++
1
2
3
4
5
6
7
8
    if(strcmp(lpLibFileName, "engine.dll") == 0)
    {
        return LoadLibraryW(lpData);
    }
    else
    {
        return originalLoadLibrary(lpLibFileName);
    }
где lpData - переменная, которая получает значение из реестра. Другого способа передачи нахождения нужной мне DLL не придумал, да и не нужно, т.к. этот справляется на ура.

Добавлено через 4 минуты
код для DLL, в которой осуществляется перехват функции можно найти на том же сайте, либо использовать detours и ему подобные.

Добавлено через 3 минуты
Другие методы внедрения, кроме как через CreateProcess, для перехвата LoadLibrary не будут работать, т.к. процесс уже загрузит нужные ему dll и вы не сможете подменить нужную вам dll на свою.
А как непосредственно внедрение происходит, через указание PID процесса ?
можно поподробнее
05.03.2011, 01:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.03.2011, 01:25
Помогаю со студенческими работами здесь

Каким образом в цикле удалить файлы из папки
Бодрого утра, подскажите каким образом в цикле удалить файлы из папки. Есть папка архива БД, в...

Можно ли каким-то образом заставить реагировать родительский объект на изменение параметров дочернего
Задача такая. Есть некий класс: class Vegetables { protected: long FCal; void...

Каким образом заставить компонент RichEdit1 перемещать свой Skroll на последнюю запись?
На форме есть компонент RichEdit1 На этот компонент постоянно добавляются записи с других...

Интересно узнать каким образом скрывают файлы и папки?
Каким образом это делают программы типа Lock Folder, Hide Folders и подобные?.. Возможно ли такое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru