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

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

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

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

Я нашел в память текстового редактора вызов функции 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2015, 21:04
Ответы с готовыми решениями:

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

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

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

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

6
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
01.03.2015, 21:09 2
Лучший ответ Сообщение было отмечено 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  [ТС] 3
Не помогает
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
01.03.2015, 21:23 4
А я все-таки думаю, что ошибка в другом месте.
Потому что адрес функции берется корректно. Вот пример:
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  [ТС] 5
Я уже много чего перепробовал а адрес всеравно указывает "вникуда". Когда я пробую перейти по этому адресу в отладчике то попадаю даже не в модуль моей dll а в любой другой

Добавлено через 5 минут
При чем тут main если я пишу DLL
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
01.03.2015, 21:44 6
Цитата Сообщение от 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  [ТС] 7
я попробовал поставить __declspec(dllexport) перед функцией но ничего не изменилось. Я в отладчике посмотрел список загруженных ДЛЛ и нашел там свою. В списке экспортируемых функций я посмотрел что адрес моей функции F121030 а тот адрес который мне возвращается вот этим выражением void* funk = (void*)CrackWriteFile; равен 2CB13D97

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

Добавлено через 2 часа 52 минуты
Хотя нет адрес оказывается правильный возвращался а то что он у меня "вникуда" указывал это моя ошибка была которую я уже исправил
0
02.03.2015, 01:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2015, 01:53
Помогаю со студенческими работами здесь

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

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

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

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


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

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