С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
4 / 4 / 4
Регистрация: 21.04.2014
Сообщений: 139

Как получить адрес функции в DLL

01.03.2015, 21:04. Показов 2827. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я пишу расширение для текстового редактора исходников от которого у меня нет. Суть в том что перед тем сохранить текст в файл он должен быть обработан моим расширением.

Я нашел в память текстового редактора вызов функции WriteFile которая записывает зразу все содержимое в файл. Я на C++ написал функцию с параметрами как у WriteFile и при загрузке dll в память пробую подменить адрес вызова WriteFile на адрес моей функции. Но проблема в том что тот адрес который я получаю указывает "вникуда"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// Функция которая должна быть вызвана вместо WriteFile
 
BOOL  CrackWriteFile(HANDLE hFile,
    LPCVOID lpBuffer,
    DWORD nNumberOfBytesToWrite, 
    LPDWORD lpNumberOfBytesWritten,
    LPOVERLAPPED lpOverlapped)
{
    MessageBox(0,"Вызвана функция CrackWriteFile","Message",0);
 
    return 1;
}
 
 
 
void CrackStart()
{
    void *address = (void*)0x00493D29; // Адрес по которому надо записать адрес функции CrackWriteFile
 
    void* funk = (void*)CrackWriteFile; // Адрес который я получаю таким путем не указывает на эту функцию
    
 
         DWORD old_protect;
 
 
    VirtualProtect(address, 4, PAGE_READWRITE, &old_protect);
 
    memcpy(address, funk, 4);
 
    VirtualProtect(address, 4, old_protect, 0);
 
}
 
 
DWORD WINAPI Thread(LPVOID)
{
    CrackStart();
 
 
    return 0;
}
 
 
 
 
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CreateThread(0, 0, Thread, 0, 0, 0);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
 
 
Вопрос: Как получить адрес функции CrackWriteFile
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.03.2015, 21:04
Ответы с готовыми решениями:

Как получить адрес функции в dll стороннего процесса?
Я подцепляюсь к чужому процессу, модифицирую память. Как рабочее пространство использую ненужную функцию в подгружаемой процессом dll. На...

Как получить адрес функции, возвращающей указатель на массив, из DLL?
В моем dll есть функция возвращающая указатель на массив указателей extern "C" _declspec(dllexport) float ** Calc(float...

Получить имя и адрес DLL файла
Добрый день. Встала задача: 1. Получить имя и адрес DLL файла 2. Определить тип (managed/native) 3. Получить имя и параметры метода ...

6
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.03.2015, 21:09
Лучший ответ Сообщение было отмечено A_N_A_N_A_S как решение

Решение

А если так (строка 28):
C++
1
memcpy(address, &funk, 4);
?
0
4 / 4 / 4
Регистрация: 21.04.2014
Сообщений: 139
01.03.2015, 21:17  [ТС]
Не помогает
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.03.2015, 21:23
А я все-таки думаю, что ошибка в другом месте.
Потому что адрес функции берется корректно. Вот пример:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
void func(int Value)
{
    printf("Value = %d.\r\n", Value);
}
 
int main()
{
    void * pFunc = func;
 
    printf("Func (1) = %p\r\n", func);
    printf("Func (2) = %p\r\n", pFunc);
 
    return 0;
}
> Func (1) = 0x80484e1
> Func (2) = 0x80484e1
1
4 / 4 / 4
Регистрация: 21.04.2014
Сообщений: 139
01.03.2015, 21:31  [ТС]
Я уже много чего перепробовал а адрес всеравно указывает "вникуда". Когда я пробую перейти по этому адресу в отладчике то попадаю даже не в модуль моей dll а в любой другой

Добавлено через 5 минут
При чем тут main если я пишу DLL
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.03.2015, 21:44
Цитата Сообщение от A_N_A_N_A_S Посмотреть сообщение
Я уже много чего перепробовал а адрес всеравно указывает "вникуда".
Да, но чудес ведь не бывает ?

Цитата Сообщение от A_N_A_N_A_S Посмотреть сообщение
При чем тут main если я пишу DLL
При том, что принципы работы с указателями везде одинаковы.
1
4 / 4 / 4
Регистрация: 21.04.2014
Сообщений: 139
02.03.2015, 01:53  [ТС]
я попробовал поставить __declspec(dllexport) перед функцией но ничего не изменилось. Я в отладчике посмотрел список загруженных ДЛЛ и нашел там свою. В списке экспортируемых функций я посмотрел что адрес моей функции F121030 а тот адрес который мне возвращается вот этим выражением void* funk = (void*)CrackWriteFile; равен 2CB13D97

Добавлено через 1 час 4 минуты
Я нашел решение. Я узнал смещение моей функции относительно модуля в памяти и в качестве адреса беру адрес загрузки DLL + смещение функции. Спасибо тебе за помощь, плюс все равно поставлю

Добавлено через 2 часа 52 минуты
Хотя нет адрес оказывается правильный возвращался а то что он у меня "вникуда" указывал это моя ошибка была которую я уже исправил
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.03.2015, 01:53
Помогаю со студенческими работами здесь

GetProcAddress не может получить адрес ф-ии из dll
Осваиваю написание dll, GetProcAddress не может получить адрес ф-ии из моей dllки? Где может быть засада? В экспоре ф-я вроде должна быть…...

Как получить адресс функции в DLL?
У меня есть DLL в написанный в VB (ActiveX Dll). Он имеет класс который выполняет всю работу, но... Необходимо получить некоторые...

Задать адрес функции внутри DLL
Подскажите, пожалуйста, как сделать так, чтобы после сборки DLL нужная мне функция всегда была по одному адресу, например, 10001000, если...

Функция возвращает адрес , как передать этот адрес другой функции ?
const int max = 5; double * fill_array(double, int); void show_array(const double, double *); // как передать этой функции в...

Получить адрес функции
Хочу получить адрес функции asd (для примера) объявленной в классе class GraphicsScene : public QGraphicsScene { public: ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru